在没有MFC的win32中保存/打开公用对话框
Save/Open Common Dialog boxes in win32 without MFC
如何使用纯非托管的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);
相关文章:
- 如何在Qbutton的帮助下更改Q对话框的宽度
- 当对话框被接受时,如何用参数调用槽
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 如何多次询问来自QML对话框的输入?
- 选择文件对话框错误
- 自定义对话框(源自QDialog)不会关闭(Android)
- 如何在 MFC 对话框中使用 OnDraw
- 在C++中创建文件夹选取器对话框的最简单方法是什么?
- 从资源视图访问对话框时出现问题
- 如何使用3d的max 2016 SDK(C++)在插件中添加保存文件对话框?
- 保存/加载对话框文本文件
- 如何获取保存对话框组合框值
- 在基于对话框的MFC应用程序中保存和恢复元素的状态
- 设计模式保存MFC对话框控件状态的步骤
- 如何自定义打开/保存文件对话框
- 在没有MFC的win32中保存/打开公用对话框
- 跨平台本机打开/保存文件对话框
- C++保存对话框
- MFC 保存文件对话框
- 更改/添加控件到窗口打开/保存通用对话框