如何禁用编辑控件的焦点首次启动Dialog?

时间:2012-11-22 12:11:24

标签: c++ winapi focus controls edit

大家好好读这个。提前感谢您的时间。

有问题的一件事:我既不使用MFC也不使用Windows Forms,只使用C ++中的WinApi。

好吧,我正在用Visual C ++制作一个多项式计算器。我添加了一个Dialog,它是使用drag'n'drop方法在资源(.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;

将整数编号设置为编辑ID是否重要?

我知道SetFocus()WM_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;

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

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

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

它只是工作!!!

1 个答案:

答案 0 :(得分:4)

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