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中)…好的,我现在明白了-只是顺序中的一个错误,您是对的。