C++ 单击编辑控件时,WINAPI保存对话框将打开两次
我有一个Win32C++ 单击编辑控件时,WINAPI保存对话框将打开两次,c++,winapi,editcontrol,save-dialog,C++,Winapi,Editcontrol,Save Dialog,我有一个Win32EDIT控件,该控件具有指定的ID(IDC\u FILE\u NAME\u INPUT),我希望在单击该控件时打开“保存”对话框。 我在窗口处理器的WM_命令消息中处理此问题: case WM_COMMAND: { switch (LOWORD(wParam)) { case IDC_FILE_NAME_INPUT: { SetFocus(hWnd); //
EDIT
控件,该控件具有指定的ID(IDC\u FILE\u NAME\u INPUT
),我希望在单击该控件时打开“保存”对话框。
我在窗口处理器的WM_命令
消息中处理此问题:
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDC_FILE_NAME_INPUT:
{
SetFocus(hWnd); // If I remove this the dialog opens every time it's closed
OPENFILENAME ofn;
wchar_t szFileName[MAX_PATH] = TEXT("");
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = TEXT("Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0");
ofn.lpstrFile = szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY;
ofn.lpstrDefExt = TEXT("txt");
if (GetSaveFileName(&ofn))
{
}
break;
}
}
}
break;
当我点击
EDIT
控件时,对话框打开,但当我关闭它(Cancel、Save或X)时,它再次显示。只有这一次,当我再次关闭它时,它仍然关闭。如果我移除SetFocus(hWnd)代码>部分,它只会一直打开自己,直到我关闭整个应用程序。我需要知道如何在对话框打开时使EDIT
失去焦点,或者我应该使用WM\u命令以外的另一条消息来执行此操作EDIT
控件的父控件被发送WM\u命令
,用于多种不同的事件。此处记录了这一点:。看看有多少不同的事件是通过这种方式通知的
您以相同的方式处理所有此类通知。相反,您需要区分在wParam
的高位词中传递的通知代码。您需要测试该通知代码,并且只响应特定事件或感兴趣的事件。因此,仅检测该控件的事件通知是不够的,还必须检测它是哪个事件 对于许多不同的事件,将发送WM_命令EDIT
控件的父控件。此处记录了这一点:。看看有多少不同的事件是通过这种方式通知的
您以相同的方式处理所有此类通知。相反,您需要区分在wParam
的高位词中传递的通知代码。您需要测试该通知代码,并且只响应特定事件或感兴趣的事件。因此,仅检测该控件的事件通知是不够的,还必须检测它是哪个事件 “IDC\u FILE\u NAME\u INPUT”是在你关闭时发送的吗?@DavidHeffernan,我试图模拟HTML文件输入的行为,当你点击它时,对话框是打开的。让点击编辑控件而不是激活编辑控件是一种奇怪的设计。通常的界面会有一个相关联的“浏览”按钮,打开文件对话框。“我希望在单击此控件时打开保存对话框。”-那么,为什么您要使用WM_命令
,而不是更像WM_LBUTTONDOWN/up
?这将导致最糟糕的用户体验。它是如此的不标准和不一致,以至于很难理解,是什么思维过程导致了这个设计决策。用户不希望在编辑控件内单击会发出命令。如果他们这样做了,他们会期望键盘导航也有同样的效果。请不要再做你想做的事了,否则就太晚了。当你关闭时,“IDC\u文件\u名称\u输入”是否会以某种方式发送?@DavidHeffernan,我试图模拟HTML文件输入的行为,当你点击它时,对话框是打开的。这是一种奇怪的设计,使点击编辑控件做一些事情,而不是激活编辑控件。通常的界面会有一个相关联的“浏览”按钮,打开文件对话框。“我希望在单击此控件时打开保存对话框。”-那么,为什么您要使用WM_命令
,而不是更像WM_LBUTTONDOWN/up
?这将导致最糟糕的用户体验。它是如此的不标准和不一致,以至于很难理解,是什么思维过程导致了这个设计决策。用户不希望在编辑控件内单击会发出命令。如果他们这样做了,他们会期望键盘导航也有同样的效果。请在为时已晚之前停止执行您正在尝试执行的操作。LOWORD(wPARAM)
是否包含标识符?对不起,没错,低单词是id,高单词是通知代码所以,我猜设置焦点时会发送WM_命令
,问题是当对话框关闭时,它会将焦点返回到EDIT
控件,再次打开对话框。我想我需要一种方法来避免这种情况,你只要照我说的去做就行了。我想你还没有领会我的答案。当HIWORD(wParam)==EN_SETFOCUS
时忽略该消息。LOWORD(wParam)
是否包含标识符?对不起,没错,低单词是id,高单词是通知代码所以,我猜设置焦点时会发送WM_命令
,问题是当对话框关闭时,它会将焦点返回到EDIT
控件,再次打开对话框。我想我需要一种方法来避免这种情况,你只要照我说的去做就行了。我想你还没有领会我的答案。当HIWORD(wParam)==EN\u SETFOCUS
时忽略此消息。