C++ 是否可以从资源文件中指定要使用的COM对话框?
是否可以使用windows资源定义一个将调用 标准文件打开对话框? 我们的想法是用资源文件条目(也许或者?)替换下面粘贴的代码 这可能吗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
/* 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