0

我有EDIT一个分配了 ID ( IDC_FILE_NAME_INPUT) 的 Win32 控件,我希望在单击此控件时打开保存对话框。WM_COMMAND在窗口处理器的消息中处理这个:

    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控件时,对话框会打开,但当我关闭它(CancelSaveX)时,它会再次出现。只有这一次,当我再次关闭它时,它保持关闭状态。如果我删除该SetFocus(hWnd);部分,它只会继续打开,直到我关闭整个应用程序。我需要知道如何EDIT在对话框打开后立即失去焦点,或者我应该使用另一条消息而不是WM_COMMAND

4

1 回答 1

3

控件的EDIT父级被发送WM_COMMAND用于许多不同的事件。这记录在这里:https ://msdn.microsoft.com/en-us/library/windows/desktop/bb775458(v=vs.85).aspx 。看看有多少不同的事件以这种方式得到通知。

您正在以相同的方式处理所有此类通知。相反,您需要区分在 的高位字中传递的通知代码wParam。您需要测试该通知代码并仅响应特定事件或感兴趣的事件。因此,仅检测该控件的事件通知是不够的,您还必须检测它是哪个事件。

于 2016-10-15T20:37:45.047 回答