【发布时间】:2021-12-25 11:58:15
【问题描述】:
问题:
如果用户按住“输入”键盘按钮并打开 OPENFILENAME 另存为对话框,它将自动保存文件 - 对话框只会闪烁。
期望的结果:
用户按住“输入”键盘按钮,打开 OPENFILENAME 另存为对话框,什么都没有发生。他需要单击“保存”按钮或再次单击“输入”键盘按钮来保存文件。
我当前的代码:
OPENFILENAME ofn;
TCHAR szFile[260] = { 't','e','s','t'}; // example filename
// Initialize OPENFILENAME
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hWnd;
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
//Files like: (ALL - *.*), (Text - .TXT)
ofn.lpstrFilter = _T("All\0*.*\0Text\0*.TXT\0");
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if (GetSaveFileName(&ofn) == TRUE)
{
// file saved
}
可能的解决方案:
- 当 ofn.lpstrFile 为空时,什么也不做;在那里无法保存文件 没有文件名
- 当 ofn.lpstrFile 建议文件名时,关闭“保存”按钮的焦点或以某种方式忽略按钮输入。
我试图这样做但失败了,我是 CPP 的初学者 :(
感谢您的帮助
【问题讨论】:
-
第一个项目符号似乎足够了:只是不要设置
lpstrFile,“文件名”文本框不会预先填充默认选项,“保存”按钮不会启用,因此用户将无法通过对话框盲目地。要执行其他任何操作,您需要挂钩对话框,并从保存按钮中删除默认按钮样式。这是可能的,但比初学者想要的要复杂。 -
也许您可以使用 IFileDialog 代替(GetSaveFileName 是遗留 API,实际上在内部指向 IFileDialog),使用 IFileDialog::SetOptions(FOS_OKBUTTONNEEDSINTERACTION)(未经测试)。 docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/…
-
@SimonMourier 该文档专门为
FOS_OKBUTTONNEEDSINTERACTION说明了这一点:“注意:禁用“确定”按钮不会阻止按 Enter 键提交对话框。“ -
@RemyLebeau - 我知道,但我不是 100% 清楚这意味着什么,这就是为什么它需要一些测试
-
"如果用户按住 "enter"..." - 如果用户按住电源按钮会发生什么?你能保护它吗?顺便说一句,
ofn.nMaxFile必须是260而不是sizeof szFile。