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

问题描述

在Windows C API中,我有一个带有下拉样式的组合框。在对话框初始化期间,我在组合框的编辑控件中设置了文本。我希望文本不显示

我发送以下消息:

SendDlgitemmessage(hDlg,IDC_EDIT_FIND,CB_SETCURSEL,0);
SendDlgitemmessage(hDlg,CB_SETEDITSEL,MAKELParaM(-1,0));

,但未取消选择文本。该文档说明了有关CB_SETEDITSEL的信息:

lParam

[in] lParam的低位字指定起始位置。如果低位单词为–1,则删除所有选择项。

lParam的高位字指定结束位置。如果高阶单词为–1,则将选择编辑控件中从开始位置到最后一个字符的所有文本。

并且:

如果消息成功,则返回值为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;
        //...