![](/img/trans.png)
[英]MFC: How to catch set focus of each control of dialog in one function
[英]How to disable Edit control's focus on Dialog first launch?
大家好,读这个。 在此先感谢您的时间。
有问题的一件事:我既不使用MFC也不使用Windows Forms,只使用C ++中的WinApi。
好吧,我在Visual C ++中制作一个多项式计算器。 我添加了一个Dialog,它是使用drag'n'drop方法在资源( .rc
文件)中创建的。 我想如果我用CreateWindowEx
创建我的Dialog会有这样的问题(但我不想)。
我的对话框有一些编辑控件。 一切都很好,除了在启动Dialog时, 其中一个Edit控件将焦点准备好接受键盘输入。
我已经包含了EN_KILLFOCUS
管理(由于选择了另一个控件,编辑在失去焦点时将其发送给父级)。
这里我从控件读取到wstring
(宽字符串 - 定义了_UNICODE
),使用某种解析器来验证这个wstring
并删除坏字符,然后将正确的字符串放入同一个编辑控件中。 它工作正常,但这是我的问题的根源 :
当没有输入时,解析器返回string "0"
(不是NULL
,字符串只是设置为“0”),就像控件有焦点一样,然后在我单击Dialog中的任何内容之前丢失它。
由于这个,以及其他东西 (这是我必须弄清楚的),在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,表明不应该处理消息管理中的指令,除了最后(就在休息之前;)我正在改变它是真的,所以下次和以后它将被处理:
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使我的问题易于理解! 对于一个巨大的混乱问题的简单回答,巨大的tox to patriiice!
答案: BTW:patriiice,我试过这个:
case WM_INITDIALOG:
SetFocus(GetDlgItem(hDialog, Desired_Control_ID));
return (INT_PTR)FALSE;
break;
它只是工作!!!
您必须返回FALSE到WM_INITDIALOG消息并自己设置正确的焦点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.