如何取消选择具有下拉样式的组合框中的文本?

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 标志。 很高兴您得到了解决方案,感谢您的分享,如果您将它们标记为答案,我将不胜感激,这将对其他社区有益。

以上是关于如何取消选择具有下拉样式的组合框中的文本?的主要内容,如果未能解决你的问题,请参考以下文章

如何清除组合框?

MFC的组合框(ComboBox)控件切换下拉样式

组合框中的文本重叠图标

使用组合框中的选择填充文本框中的计算字段

通过键入选择组合框中的项目

组合框多选以在 Access 2016 中的文本框中显示所选项目