c++ - Windows API自定义对话框模板如何使用资源?

标签 c++ controltemplate getopenfilename

我正在尝试在 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/

相关文章:

c++ - 为什么数据不传输

c++ - C/C++ 中的运算符与函数

c# - 在 Silverlight 中重用自定义样式

c - 在 Debug模式下编译时 GetOpenFileName 永远不会返回 (VS2010)

C++ win32 应用程序在我从文件对话框中选择文件一段时间后卡住?

c++ - DialogBoxParam 和 GetOpenFileName

c++ - 从转换中获取结果顶点?

c++ - std::decay 和按值传递之间有什么区别?

wpf - 在 WPF 中以编程方式创建 ControlTemplate

c# - 如何应用TextBox控件模板?