C++ 如何禁用编辑控件';让我们关注Dialog的首次发布?

C++ 如何禁用编辑控件';让我们关注Dialog的首次发布?,c++,winapi,focus,controls,edit,C++,Winapi,Focus,Controls,Edit,大家好,正在读这篇文章。提前感谢您抽出时间 问题之前:我既不使用MFC也不使用Windows窗体,只使用WinApi在C++中。 我在Visual C++中用多项式计算器。我向它添加了一个对话框,它是在参考资料(.rc文件)中使用拖放方法创建的。如果我用CreateWindowEx创建对话框,我想不会有这样的问题(但我不想) 我的对话框有几个编辑控件。一切正常,只是当对话框启动时,其中一个编辑控件会聚焦以准备进行键盘输入 我已经包括了EN_KILLFOCUS的管理(当由于选择另一个控件而失去焦点

大家好,正在读这篇文章。提前感谢您抽出时间

问题之前:我既不使用MFC也不使用Windows窗体,只使用WinApi在C++中。

我在Visual C++中用多项式计算器。我向它添加了一个对话框,它是在参考资料(
.rc
文件)中使用拖放方法创建的。如果我用
CreateWindowEx
创建对话框,我想不会有这样的问题(但我不想)

我的对话框有几个编辑控件。一切正常,只是当对话框启动时,其中一个编辑控件会聚焦以准备进行键盘输入

我已经包括了
EN_KILLFOCUS
的管理(当由于选择另一个控件而失去焦点时,Edit会将其发送给父控件)

在这里,我从控件读取到
wstring
(定义了宽字符字符串-
\u UNICODE
),使用某种解析器验证此
wstring
,并删除坏字符,然后将正确的字符串放入同一编辑控件中。它工作正常,但这是我问题的根源:

当没有输入时,解析器返回
字符串“0”
(不是
NULL,字符串只是设置为“0”),就好像控件有焦点,然后在我单击对话框中的任何内容之前就丢失了它

因此,还有其他的东西(这是我必须弄清楚的),在对话框启动时,解析器将这个
字符串“0”
放入编辑

我想使我的编辑在单击其中一个编辑(包括此编辑)之前无法从键盘获取输入。 如果不可能,我希望在对话框开始时清除整个文本(能够接受输入不是问题,我只想防止解析器在开始时输入
字符串“0”
) 我的代码:

在DlgProc中,我有:

//up here is switch to manage all controls
    case MyEditID:                // here is ID of one of my edits from resources
        switch (HIWORD(wParam))
        {
        case EN_KILLFOCUS:        // edit lost focus - another control selected

            if (LOWORD(wParam)==MyEditID)  //necessary to determine if
                                          // one of allowed Edits sent this message
                                          // because I have also other Edits
            {
                GetDlgItemText(hPanel, LOWORD(wParam), MyTempWcharArray, 100);
                MyTempString.assign(MyTempWcharArray);

                w1 = polynomial(MyTempWcharArray); // parser takes the string
                     // and removes bad chars in constructor
                     // polynomial is my class - you don't have to care of it
                     // w1 is declared before as object of polynomial class

                MyTempString = w1.ConversionToString();
                SetDlgItemText(hDialog, LOWORD(wParam), sw1);
            }
            break;
        }
        break;
设置为编辑的ID的整数是否重要

我知道
SetFocus()
,以及
WM\u SetFocus
消息。在这种情况下,我就是不能让它工作

如果我没有包括一些重要的东西让你明白我的观点,请让我知道。很抱歉,我只是
WinAPI
领域的新手

编辑: 对于有类似问题的人:不要这样做: 我将全局变量ProcessKillFocus设置为false,这表明不应处理消息管理中的指令,但在结束时(就在break之前;)我将其更改为true,因此下次和以后将对其进行处理:

case EN_KILLFOCUS:
           if (ProcessKillFocus && LOWORD(wParam)==MyEditID)
           {
                // first time global ProcessKillFocus is false so all this is skipped
                // 2nd time and later do all the stuff
           }
           ProcessKillFocus = true;
           break;
感谢谢罗斯·阿迪卡里让我的问题更容易理解!!! 巨大的thanx给Patriice一个巨大的问题的简单答案

回答: 顺便说一句:帕特丽斯,我试过这个:

case WM_INITDIALOG:
        SetFocus(GetDlgItem(hDialog, Desired_Control_ID));
        return (INT_PTR)FALSE;
        break;

它只是工作

您必须返回FALSE到message并自行设置正确的焦点。

在调用
SetFocus
之前返回没有意义(在您的BTW中)…好的,我现在明白了-只是顺序中的一个错误,您是对的。