Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以从资源文件中指定要使用的COM对话框?_C++_Windows_Winapi - Fatal编程技术网

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

C++ 是否可以从资源文件中指定要使用的COM对话框?,c++,windows,winapi,C++,Windows,Winapi,是否可以使用windows资源定义一个将调用 标准文件打开对话框? 我们的想法是用资源文件条目(也许或者?)替换下面粘贴的代码 这可能吗 /* https://msdn.microsoft.com/en-us/library/windows/desktop/ff485843(v=vs.85).aspx */ #include <windows.h> #include <shobjidl.h> int WINAPI wWinMain(HINSTANCE hInstan

是否可以使用windows资源定义一个将调用 标准文件打开对话框? 我们的想法是用资源文件条目(也许或者?)替换下面粘贴的代码

这可能吗

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

谢谢你的阅读

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

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


如果您希望在创建自己的对话框时显示“文件打开”对话框,则可以使用上述代码(CoInitialize/ConInitialize之间的部分)处理WM_INITDIALOG消息,更常见的是有一个按钮或菜单项,当该项被触发时,您会收到WM_命令消息。

对话框资源不是代码生成工具。它们描述了如何创建窗口和定位窗口,仅此而已。对话框编辑器就像穷人的UI设计器。点击式设计非常方便,但您仍然需要携带代码才能使用它。一个最小的程序。标准对话框的存在是有原因的。请不要试图通过实现您自己的文件对话框来重新发明轮子,当新的功能和/或设计添加到标准对话框中时,文件对话框将缺乏功能,并且在几年后将看起来“老派”。只需围绕
IFileOpenDialog
/
IFileSaveDialog
编写一些包装函数,这样您就不必每次需要调用文件对话框时都重复自己的操作。您的问题是创建对话框还是创建自定义文件OpenDialog?这个问题没有意义。代码中唯一创建对话框的部分是
CoCreateInstance
调用。其他一切都只是与对话框交互的代码。即使可以从资源中创建
IFileOpenDialog
,也需要做更多的工作。这可能是因为您的观察是错误的,您发布的资源脚本实际上是整个对话框。事实并非如此。
对话框
函数至少需要一个对话框过程。这就是所有交互代码的所在。你需要得到Petzold关于Windows API编程的书。
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