如何取消选择具有下拉样式的组合框中的文本?
Posted
技术标签:
【中文标题】如何取消选择具有下拉样式的组合框中的文本?【英文标题】:How to unselect the text in a Combobox with dropdown style? 【发布时间】:2020-12-16 08:35:01 【问题描述】:在 Windows C API 中,我有一个下拉样式的组合框。我在对话框初始化期间在组合框的编辑控件中设置了一个文本。我希望显示未选中的文本。
我发送以下消息:
SendDlgItemMessage(hDlg, IDC_EDIT_FIND, CB_SETCURSEL,0,0);
SendDlgItemMessage(hDlg, IDC_EDIT_FIND, CB_SETEDITSEL,0,MAKELPARAM(-1,0));
但文本没有被取消选中。文档中提到了CB_SETEDITSEL
:
l参数
[in] lParam 的低位字指定起始位置。如果低位词为 –1,则删除选择(如果有)。
lParam 的高位字指定结束位置。如果高位词为–1,则选择编辑控件中从起始位置到最后一个字符的所有文本。
还有:
如果消息成功,则返回值为 TRUE。如果消息发送到具有 CBS_DROPDOWNLIST 样式的组合框,则为 CB_ERR。
当我发送消息时,结果为 1 (TRUE) 但编辑控件中的文本并未取消选择
如何取消选择组合框编辑控件的文本?
【问题讨论】:
您是否尝试发送CB_GETEDITSEL
以查看开始/结束位置是否已更改?如果他们有,那么也许只是一个RedrawWindow()
电话?
@AdrianMole,正在处理您的建议。在CB_SETCURSEL
之后,CB_GETEDITSEL
报告 0,0。 CB_SETEDITSEL
5,7 之后,CB_GETEDITSEL
报告 5,7;但是,文本只是被选中(蓝色),按一个键会删除文本,因此它被选中。待办事项:重绘,但我对此表示怀疑。
@PaulOgilvie 这让我想起了a question 我前段时间问过。不完全一样,但问题非常相似。不过我还没有找到解决方案,我放弃了。也许那里的 cmets 和答案(对我不起作用)可能会有所帮助。
@Jabberwocky,我找到了解决方案。你也可以在你的情况下使用它。在失去焦点之前记住光标位置,然后当焦点再次设置到您的控件时,取消选择(请参阅我的解决方案)并将光标放在其旧位置。
【参考方案1】:
我找到了: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, 0);
SendDlgItemMessage(hDlg, IDC_COMBO, CB_ADDSTRING,0, (LPARAM)"Hello World");
SendDlgItemMessage(hDlg, IDC_COMBO, CB_SETCURSEL,0,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, IDC_COMBO, CB_SETEDITSEL,0,MAKELPARAM(-1,99));
break;
break;
break;
//...
【讨论】:
另一种方法是对控件进行子类化以处理WM_GETDLGCODE
并从标准返回值中删除DLGC_HASSETSEL
标志。
很高兴您得到了解决方案,感谢您的分享,如果您将它们标记为答案,我将不胜感激,这将对其他社区有益。以上是关于如何取消选择具有下拉样式的组合框中的文本?的主要内容,如果未能解决你的问题,请参考以下文章