如何取消选择具有下拉样式的组合框中的文本?
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;
//...
在 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;
//...