Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 单击编辑控件时,WINAPI保存对话框将打开两次_C++_Winapi_Editcontrol_Save Dialog - Fatal编程技术网

C++ 单击编辑控件时,WINAPI保存对话框将打开两次

C++ 单击编辑控件时,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); //

我有一个Win32
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
时忽略此消息。