是否可以从资源文件中指定要使用的COM对话框?

时间:2017-10-28 23:21:15

标签: c++ windows winapi

是否可以使用Windows资源来定义将调用的对话框 标准的FileOpenDialog? 我们的想法是将elevated privileges下面粘贴的代码替换为资源文件条目(可能是(source)DIALOG?)

这可能吗?

/* 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;
}

问题的背景

我正在关注DIALOGEX的MSDN教程 以及其他显示用资源编译器&#34; rc&#34;编译的Windows资源文件的例子。

我最近看到了一个整体&#34;关于&#34;对话框在资源文件中指定,并在Windows程序中使用&#34; DialogBox(hInstance,MAKEINTRESOURCE(IDD_ABOUTDIALOG),hWnd,&amp; AboutDialogProc)&#34; MSDEV center

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

感谢阅读!

1 个答案:

答案 0 :(得分:0)

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

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

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