在没有MFC的win32中保存/打开公用对话框

Save/Open Common Dialog boxes in win32 without MFC

本文关键字:对话框 保存 MFC win32      更新时间:2023-10-16

如何使用纯非托管的Win32 API创建取消默认保存/打开对话框?根据此处的指南,当在主窗口的消息循环中处理WM_CREATE消息时,将执行以下代码:我也是included <Commdlg.h>

            OPENFILENAMEA ofn;
        char Buffer[300];
        fill(Buffer, Buffer + 300, '');
        ofn.lStructSize = sizeof(OPENFILENAMEA);
        ofn.hwndOwner = hWnd;
        ofn.lpstrFile = Buffer;
        ofn.nMaxFile = 300;
        ofn.Flags = OFN_EXPLORER;
        ofn.lpstrFilter = NULL;
        ofn.lpstrCustomFilter = NULL;
        ofn.nFilterIndex = 0;
        ofn.lpstrFileTitle = NULL;
        ofn.lpstrInitialDir = NULL;
        ofn.lpstrTitle = NULL;
        out << GetOpenFileNameA(&ofn) << endl;
        out << Buffer << (int)CommDlgExtendedError();

但是,这段代码给出了NO的任何输出。帮助

在处理WM_CREATE消息时执行以下代码

在Output(输出(窗口中查看0xc0000005的首次机会异常通知,这是一个AccessViolation异常。Wow64模拟器中有一个backstop,它在调度WM_CREATE时会吞下异常。

该异常是由未完全初始化OPENFILENAMEA结构引起的。快速修复:

 OPENFILENAMEA ofn = {0};

并且喜欢在调用ShowWindow((而不是WM_CREATE消息处理程序之前显示对话框。

总体思路是正确的,但如果您将要创建的窗口的句柄作为所有者传递,那么它还不会初始化。

对于诊断,请考虑创建变量来存储API函数返回值,并在调试器中检查它们。

将结构初始化为零也更方便,也更不容易出错,而不是显式地将不需要的成员清零,比如:

OPENFILENAME ofn = { 0 };

GetOpenFileName阻塞(一段时间(,然后返回TRUE(如果对话框被"OK"关闭(或FALSE(如果对话框已取消(。

实际结果(目录/文件路径(可以从OPENFILENAME结构中读取。

来自https://learn.microsoft.com/en-us/windows/win32/dlgbox/using-common-dialog-boxes#opening-我们得到了一个utf-16版本的文件,其中有一些我的小改动:

OPENFILENAME ofn = { 0 };       // common dialog box structure
WCHAR szFile[260];       // buffer for file name 
HWND hwnd;              // owner window
HANDLE hf;              // file handle
// Initialize OPENFILENAME
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwnd;
ofn.lpstrFile = szFile;
// Set lpstrFile[0] to '' so that GetOpenFileName does not 
// use the contents of szFile to initialize itself.
ofn.lpstrFile[0] = '';
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = "All*.*Text*.TXT";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
// Display the Open dialog box. 
if (GetOpenFileName(&ofn)==TRUE) 
    hf = CreateFile(ofn.lpstrFile, 
                    GENERIC_READ,
                    0,
                    (LPSECURITY_ATTRIBUTES) NULL,
                    OPEN_EXISTING,
                    FILE_ATTRIBUTE_NORMAL,
                    (HANDLE) NULL);