我正在尝试在 C++ 中的 OPENFILENAME 结构上使用自定义模板,但无法弄清楚我到底做错了什么。这是我目前所拥有的:
#include <windows.h>
#include <iostream>
#include "resource.h"
void main() {
HWND hwnd = NULL;// owner window
OPENFILENAME ofn;
CHAR File[256];
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.hInstance = NULL;
ofn.lpstrCustomFilter = NULL;
ofn.nMaxCustFilter = 0;
ofn.nFilterIndex = 0;
ofn.lpstrFile = File;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof(File);
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = MAX_PATH;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = NULL;
ofn.Flags = OFN_ENABLETEMPLATE;
ofn.nFileOffset = 0;
ofn.nFileExtension = 0;
ofn.lpstrDefExt = NULL;
ofn.lCustData = 0L;
ofn.lpfnHook = NULL;
ofn.lpTemplateName = "IDD_DIALOGBAR";
if (GetOpenFileName(&ofn)==TRUE)
{
//do something with filename
}
std::cout << CommDlgExtendedError();
}
IDD_DIALOGBAR
是我添加到项目中的自定义资源。为此,我在 Visual Studio 中创建了一个新的空 C++ 项目,然后在解决方案资源管理器中右键单击项目名称,然后单击“添加”-->“资源”。然后我从可用资源列表中选择了“IDD_DIALOGBAR”。这为项目添加了一个新资源,当我在 Visual Studio 中切换到“资源 View ”时可以查看。
当我运行程序时,对话框根本没有出现。 CommDlgExtendedError()
的结果是 CDERR_FINDRESFAILURE: The common dialog box function failed to find a specified resource
。
我也试过改
ofn.lpTemplateName = "IDD_DIALOGBAR"
到
ofn.lpTemplateName = MAKEINTRESOURCE(IDD_DIALOGBAR)
但这导致了不同的错误信息:
CDERR_DIALOGFAILURE:无法创建对话框。通用对话框函数调用 DialogBox 函数失败。例如,如果公共(public)对话框调用指定了无效的窗口句柄,则会发生此错误。
我错过了什么?我没有正确引用资源吗?
最佳答案
ofn.hInstance
需要设置为具有对话框模板资源的模块(可执行文件或 DLL)的 HINSTANCE
。
关于c++ - Windows API自定义对话框模板如何使用资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21142321/