2017-10-28 84 views
-2

是否可以使用Windows资源来定义一个对话框,该对话框将调用标准FileOpenDialog的 ? 的想法是,以取代代码,如一个粘贴下面(source)与资源文件条目(也许DIALOGDIALOGEX?)是否可以指定要从资源文件使用的COM对话框?

这可能吗?

/* https://msdn.microsoft.com/en-us/library/windows/desktop/ff485843(v=vs.85).aspx */ 
#include <windows.h> 
#include <shobjidl.h> 

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow) 
{ 
    HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | 
     COINIT_DISABLE_OLE1DDE); 
    if (SUCCEEDED(hr)) 
    { 
     IFileOpenDialog *pFileOpen; 

     // Create the FileOpenDialog object. 
     hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_ALL, 
       IID_IFileOpenDialog, reinterpret_cast<void**>(&pFileOpen)); 

     if (SUCCEEDED(hr)) 
     { 
      // Show the Open dialog box. 
      hr = pFileOpen->Show(NULL); 

      // Get the file name from the dialog box. 
      if (SUCCEEDED(hr)) 
      { 
       IShellItem *pItem; 
       hr = pFileOpen->GetResult(&pItem); 
       if (SUCCEEDED(hr)) 
       { 
        PWSTR pszFilePath; 
        hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePath); 

        // Display the file name to the user. 
        if (SUCCEEDED(hr)) 
        { 
         MessageBox(NULL, pszFilePath, L"File Path", MB_OK); 
         CoTaskMemFree(pszFilePath); 
        } 
        pItem->Release(); 
       } 
      } 
      pFileOpen->Release(); 
     } 
     CoUninitialize(); 
    } 
    return 0; 
} 

背景的问题

我从MSDEV center 和也是继MSDN的教程在其他地方的例子,显示有“RC”,资源编译器编译的Windows资源文件。

最近我看到其中一个资源文件中指定了整个“关于”对话框,并在使用“对话框(的hInstance,MAKEINTRESOURCE(IDD_ABOUTDIALOG)的hWnd,& AboutDialogProc)” (link)

IDD_ABOUTDIALOG DIALOGEX 0, 0, 147, 67 
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION |  WS_SYSMENU 
CAPTION "About" 
FONT 8, "MS Shell Dlg", 400, 0, 0x1 
BEGIN 
    ICON    IDI_APPICON,IDC_STATIC,7,7,20,20 
    LTEXT   "Win32 Test application.",IDC_STATIC,34,7,86,8 
    LTEXT   "©2013 Transmission Zero",IDC_STATIC,34,17,86,8 
    DEFPUSHBUTTON "OK",IDOK,90,46,50,14,WS_GROUP 
END 
Windows程序中引用的例子

感谢您的阅读!

+1

对话框资源不是代码生成工具。他们描述了如何创建窗口并定位它们,就这些。 –

+0

对话框编辑器就像穷人的UI设计师。点击设计非常方便,但您仍然需要使用代码才能使用它。最小的程序[在这里](https://stackoverflow.com/a/10233086/17034)。 –

+0

标准对话框出于某种原因。请不要试图通过实现您自己的文件对话框来重新发明轮子,它将缺少功能,并且在将新功能和/或设计添加到标准对话框后的几年之后,它们将会看起来像“oldschool”。只需在'IFileOpenDialog' /'IFileSaveDialog'周围写一点小包装函数,这样每次需要调用文件对话框时都不必重复自己。 – zett42

回答

0

不,老实说,你的问题没有太大意义。

资源只是数据,它们不提供自己的实现。 (DialogBox *函数系列读取模板并创建每个指定的控件,而不是通过编译的资源以某种方式封装已经实例化的控件,从模板实例化对话框。

如果您希望在创建自己的对话框时显示文件打开对话框,您可以使用上面的代码(CoInitialize/CoUninitialize之间的部分)来处理WM_INITDIALOG消息,更常见的情况是使按钮或菜单项当该项目被触发时,您会收到一条WM_COMMAND消息。

相关问题