使下拉类型 Combobox 的行为类似于 Edit 控件
Posted
技术标签:
【中文标题】使下拉类型 Combobox 的行为类似于 Edit 控件【英文标题】:Make a dropdown type Combobox behave like an Edit control 【发布时间】:2020-06-08 21:15:09 【问题描述】:我即将用下拉式组合框替换标准编辑控件。所以基本上那个组合框就像一个编辑控件一样。
到目前为止一切正常,但只有一个显着的区别:
当您单击已经包含一些文本但没有焦点的编辑控件时,光标会简单地定位在您单击的位置。 但是,当您单击已包含一些文本且没有焦点的组合框时,会选择整个文本。这描述了当您单击组合框或编辑控件时发生的情况
有没有办法让组合框表现得像一个编辑控件?
【问题讨论】:
可能通过子类化和修改WM_GETDLGCODE
返回的内容(如here 所述),尽管我不确定组合。也许您必须在组合中对编辑控件进行子类化。
@JonathanPotter 看起来很有希望,谢谢
@Jabberwocky 删除 DLGC_HASSETSEL 标志对我来说不适用于 Combobox。它对你有用吗?
@RitaHan-MSFT 我还没有尝试过,因为这对我来说现在不是主要问题。你是如何使用DLGC_HASSETSEL
的?您是否继承了组合框或组合框的编辑控件?
@Jabberwocky 我像这样子类化组合框的编辑控件:comboEditHdl = FindWindowEx(cmbHdl, NULL, L"Edit", NULL); SetWindowSubclass(comboEditHdl,RemoveHasSetSelSubclassProc, 0, 0);
在子类过程中:case WM_GETDLGCODE: return DefSubclassProc(hwnd, uiMsg, wParam, lParam) & ~DLGC_HASSETSEL;
【参考方案1】:
防止整个文本被选中的解决方案之一是通过子类化组合框并在鼠标左键第一次单击它时将焦点设置到其编辑控件。代码如下:
子类过程:
LRESULT CALLBACK EditSubClassProc(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam,
UINT_PTR uIdSubclass,
DWORD_PTR dwRefData
)
switch (uMsg)
case WM_DESTROY:
RemoveWindowSubclass(hWnd, EditSubClassProc, 0);
return DefSubclassProc(hWnd, uMsg, wParam, lParam);
case WM_LBUTTONDOWN:
if (GetFocus() != hWnd)
SetFocus(hWnd);
return DefSubclassProc(hWnd, uMsg, wParam, lParam);
default:
return DefSubclassProc(hWnd, uMsg, wParam, lParam);
找到Combo Box的编辑控制窗口并安装子类回调:
// Get the edit window handle to combo box.
HWND comboEditHdl = NULL;
COMBOBOXINFO info = 0 ;
info.cbSize = sizeof(COMBOBOXINFO);
if (!GetComboBoxInfo(hwndCombo1, &info))
return 0;
comboEditHdl = info.hwndItem;
if (comboEditHdl)
SetWindowSubclass(comboEditHdl, EditSubClassProc, 0, NULL);
【讨论】:
以上是关于使下拉类型 Combobox 的行为类似于 Edit 控件的主要内容,如果未能解决你的问题,请参考以下文章
ComboBox 自动 DropDownWidth 与 DataSource 类型无关
使 Pandas groupby 的行为类似于 itertools groupby