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

How to unselect the text in a Combobox with dropdown style?

在 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:

lParam

[in] The low-order word of lParam specifies the starting position. If the low-order word is –1, the selection, if any, is removed.

The high-order word of lParam specifies the ending position. If the high-order word is –1, all text from the starting position to the last character in the edit control is selected.

并且:

If the message succeeds, the return value is TRUE. If the message is sent to a combo box with the CBS_DROPDOWNLIST style, it is 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, 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;
        //...