写点什么

MFC|CCombobox 控件修改编辑框光标显示位置

  • 2022 年 10 月 09 日
    河北
  • 本文字数:1727 字

    阅读完需:约 6 分钟

MFC|CCombobox控件修改编辑框光标显示位置

当前的开发环境:VS2010,32 位 MFC 框架


使用 MFC 中系统 CComboBox 控件时,会有三种风格,其中有一种风格:CBN_DROPDWON,该编辑框是可以进行编辑的。


更改多 CComboBox 高度的友友们就会发现这样一个问题,控件高度变高后,edit 编辑控件的高度光标一直处于左上角的位置,看起来很是不美观,如下图所示:

其实,想要实现光标处于垂直状态,如下图所示:

这种效果看着就比较顺眼了,此时,有人想要问,怎么改变编辑框的高度呢?


有人使用系统的 MoveWindow,居然不生效?这个问题我也遇到过。具体为什么不生效,我无法解释,但是我知道如何改变 edit 编辑框的高度


SetItemHeight(-1 , 60);  --- >>>>设置 edit 编辑框的高度 === 60

SetItemHeight(1 , 60);   ---- >>>>设置下拉文本的高度 === 60

如果有需要可以使用两句代码进行设置。


下面,就要说说如何改变 edit 光标的位置。

第一种方案:

我最开始打算在 PreSubclassWindow 消息中,将我自己绘制的 MyEdit 与 CCombobx 控件中的编辑控件进行关联,希望可以用

CEdit::SetRectNP 修改 Edit 控件的显示区域。


代码如下,主要是做关联

void MyComboBox::PreSubclassWindow(){	CComboBox::PreSubclassWindow();	 	COMBOBOXINFO   comboInfo;  	//获取控件信息 	comboInfo.cbSize = sizeof(COMBOBOXINFO); 	GetComboBoxInfo(&comboInfo); 	//子类化编辑框 	if (comboInfo.hwndItem != nullptr ) 	{		if ( !((GetStyle() & CBS_DROPDOWNLIST) == CBS_DROPDOWNLIST)) 			m_editCtrl.SubclassWindow(comboInfo.hwndItem);		 	}}
复制代码

其中,主要用到的是 GetComboBoxInfo 函数获取。


获取到的 edit 的区域 comboInfo.rcItem。


再使用 m_editCtrl.SetRectNP(处理后的 edit 区域)。


结果发现,不能修改光标的位置。


该方案准备放弃。

第二种方案:


后来,我看别的博友说使用 OnNcCalcSize 消息做处理。在这里处理 edit 区域设置。


我就尝试着使用该消息

afx_msg  void OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp);
BEGIN_MESSAGE_MAP(MyComboBox, CComboBox) ON_WM_NCCALCSIZE()END_MESSAGE_MAP()
void MyComboBox::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp){ //获取字体的属性 CFont *font = GetFont(); LOGFONT lf; font->GetLogFont(&lf);
LONG nFontHeight = 0; nFontHeight = lf.lfHeight < 0 ? -lf.lfHeight : lf.lfHeight; COMBOBOXINFO comboInfo; //获取控件信息 comboInfo.cbSize = sizeof(COMBOBOXINFO); GetComboBoxInfo(&comboInfo); CRect rectEdit = comboInfo.rcItem; rectEdit.top += (rectEdit.Height()-nFontHeight)/2 -3; m_editCtrl.MoveWindow(rectEdit);
CComboBox::OnNcCalcSize(bCalcValidRects , lpncsp);}
复制代码

这里面包含了消息声明、定义以及具体的应用。


根据上述我贴出的代码可以将光标的位置进行改变。


对 OnNcCalcSize 函数的解析:

第一步:

获取当前自绘类中,设置的字体的属性。


在获取的时候,有可能 lf.lfHeight 为负数。所以,这里我使用了三目运算符进行转换。如果是负数,转成正数。

第二步:

获取当前控件的所有属性。


根据上一步获取的字体的高度,移动关联上 edit 控件。这里的 m_editCtrl 控件的关联,和我的列出的第一种方案的关联是一样的。


根据上述代码,可以实现的效果,如下:

实现的效果居然如上图所示,和我展示的效果有些不同,有一块不明确区域。


后来我想着在该控件的颜色反射消息中获取,是不是在 OnNcCalcSize 中改变了 edit 区域后,以后的都变了?


经过测试后,发现。edit 的区域没有改变,但是这一块阴影是怎么来的?我很是不明白。


后来,恍然大悟!因为我修改了 edit 的显示区域,但是系统认为还是原来的区域。所有上面的内容就呈现为 CCombobox 的非客户区域。


我需要刷新 combobox 的背景

afx_msg BOOL OnEraseBkgnd(CDC *pDC);
BEGIN_MESSAGE_MAP(MyComboBox, CComboBox) ON_WM_ERASEBKGND()END_MESSAGE_MAP()
BOOL MyComboBox::OnEraseBkgnd(CDC *pDC){ CRect rect; GetClientRect(rect); pDC->FillSolidRect(&rect , RGB(255 , 255 , 255)); return FALSE; //return CComboBox::OnEraseBkgnd(pDC);}
复制代码

再次运行,就没有阴影区域了。如此就设置成功了。


我是中国好公民 st,一名 C++开发程序媛~

发布于: 刚刚阅读数: 5
用户头像

书山有路勤为径,学海无涯苦作舟 2022.07.01 加入

擅长语言:C++ 涉及语言:Python

评论

发布
暂无评论
MFC|CCombobox控件修改编辑框光标显示位置_c_中国好公民st_InfoQ写作社区