ComboBox光标设置到文本末尾时CB_SETEDITSEL无效问题咨询
异常产生原因
CB_SETEDITSEL和EM_SETSEL的参数定义存在核心差异,你的调用不符合CB_SETEDITSEL的参数规范:
- EM_SETSEL的参数规则为:
wParam传入选择起始位置,lParam传入选择结束位置,二者值相等时即可将光标定位到对应位置且无选中内容,你之前对普通编辑框的调用是符合该规则的。 - 但CB_SETEDITSEL的参数规则完全不同:
wParam必须固定传0,选择的起始、结束位置需要全部打包到lParam参数中,其中lParam的低16位存储选择起始位置,高16位存储选择结束位置。
你之前调用时直接将textLength传给了wParam,不符合参数要求,系统会忽略非法参数触发默认全选逻辑,因此出现了选中全部文本的问题。
正确实现方案
方案1:按规范调用CB_SETEDITSEL消息
按照CB_SETEDITSEL的参数要求打包参数即可,正确调用代码如下:
SendDlgItemMessage(hDlg, textID, CB_SETEDITSEL, 0, MAKELPARAM(textLength, textLength));
使用MAKELPARAM宏将起始、结束位置打包到lParam参数中,wParam固定传0即可实现光标定位到文本末尾的效果。
方案2:直接操作ComboBox内置编辑框(可选兼容写法)
如果更习惯EM_SETSEL的参数逻辑,也可以先获取ComboBox内置编辑控件的句柄,再发送EM_SETSEL消息,效果完全一致:
COMBOBOXINFO comboBoxInfo = {sizeof(COMBOBOXINFO)}; SendDlgItemMessage(hDlg, textID, CB_GETCOMBOBOXINFO, 0, (LPARAM)&comboBoxInfo); SendMessage(comboBoxInfo.hwndItem, EM_SETSEL, textLength, textLength);
内容的提问来源于stack exchange,提问作者theBigCheese88
相关产品推荐
相关产品推荐

