3

大家好,阅读本文。在此先感谢您的时间。

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

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

我的对话框有一些编辑控件。一切都很好,除了当对话框启动时,编辑控件之一获得焦点以准备接受键盘输入。

我已经包含了EN_KILLFOCUS(编辑由于选择另一个控件而失去焦点时将其发送给父级)的管理。

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

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

由于这一点,以及其他一些事情(这是我必须弄清楚的),在 Dialog 启动解析器中将其string "0"进行编辑。

我想让我的编辑无法从键盘输入,直到我单击其中一个编辑(包括这个)。如果不可能,我想在对话框的开头清除整个文本(能够输入不是问题,我只是想防止解析器string "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;

为Edit的ID设置什么整数有关系吗?

我知道SetFocus(),和WM_SETFOCUS消息。在这种情况下,我无法正常工作。

如果我没有包括一些重要的东西让你明白我的观点,请告诉我。对不起,我只是WinAPI世界上的新手。

编辑:对于那些有类似问题的人:不要这样做: 我做了一个解决方法,将全局变量 ProcessKillFocus 设置为 false,表示不应处理消息管理中的指令,除了最后(就在休息之前;)我正在改变它是真的,所以下次和以后它将被处理:

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;

非常感谢 Sheyros Adikari 让我的问题易于理解!!!非常感谢 patriiice 对一个巨大的混乱问题的简单回答!!!

答案: 顺便说一句:patriiice,我试过这个:

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

它只是工作!

4

1 回答 1

4

您必须将 FALSE 返回到WM_INITDIALOG消息并自行设置正确的焦点。

于 2012-11-22T12:24:01.740 回答