如何解决如何在具有下拉样式的组合框中取消选择文本?
在Windows C API中,我有一个带有下拉样式的组合框。在对话框初始化期间,我在组合框的编辑控件中设置了文本。我希望文本不显示。
我发送以下消息:
SendDlgitemmessage(hDlg,IDC_EDIT_FIND,CB_SETCURSEL,0);
SendDlgitemmessage(hDlg,CB_SETEDITSEL,MAKELParaM(-1,0));
,但未取消选择文本。该文档说明了有关CB_SETEDITSEL
的信息:
lParam
并且:
如果消息成功,则返回值为TRUE。如果消息以CBS_DROPDOWNLIST样式发送到组合框,则为CB_ERR。
当我发送消息时,结果为1(TRUE),但未取消选择编辑控件中的文本
如何取消选择组合框编辑控件的文本?
解决方法
我发现了它:WM_INITDIALOG
之后,Windows将焦点设置为对话框定义中指定为第一个控件的控件,该控件恰好是组合框。这导致将焦点设置为组合框,无论我们在WM_INITDIALOG
中进行了多少重置,SetFocus都会再次选择组合文本。
解决方案是通过重置选择来“忽略”这一点。
以下是我的解决方案。我使用信号量来防止在处理WM_INITDIALOG
消息期间为控件处理SetFocus消息:
BOOL CALLBACK DlgProcExample (HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
static int semaIgnore;
switch (message)
{
case WM_INITDIALOG:
semaIgnore=TRUE;
SendDlgItemMessage(hDlg,IDC_COMBO,CB_RESETCONTENT,0);
SendDlgItemMessage(hDlg,CB_ADDSTRING,(LPARAM)"Hello World");
SendDlgItemMessage(hDlg,CB_SETCURSEL,0);
semaIgnore= FALSE;
return (TRUE);
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_COMBO:
if (semaIgnore) break;
switch (HIWORD(wParam)) {
case CBN_SETFOCUS:
SendDlgItemMessage(hDlg,CB_SETEDITSEL,MAKELPARAM(-1,99));
break;
}
break;
}
break;
//...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。