MFC修改编辑框光标显示位置方法详解

 更新时间:2022年02月22日 10:27:43   作者:中国好公民st  
这篇文章主要介绍了在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);
}

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

到此这篇关于MFC修改编辑框光标显示位置方法详解的文章就介绍到这了,更多相关MFC修改编辑框光标位置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言中二维数组指针的简要说明

    C语言中二维数组指针的简要说明

    这篇文章主要介绍了C语言中二维数组指针的简要说明,文章后也附送一个小练习题进行巩固,需要的朋友可以参考下
    2015-08-08
  • C++中为什么要使用动态内存

    C++中为什么要使用动态内存

    大家好,本篇文章主要讲的是C++中为什么要使用动态内存,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • C语言系列之推箱子游戏

    C语言系列之推箱子游戏

    这篇文章主要为大家详细介绍了C语言系列之推箱子游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 浅谈mwArray和一般数组的区别

    浅谈mwArray和一般数组的区别

    下面小编就为大家带来一篇浅谈mwArray和一般数组的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C++ 动态内存管理详情解说

    C++ 动态内存管理详情解说

    这篇文章主要介绍了C++ 动态内存管理详情解说,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下,希望对你的学习有所帮助
    2022-07-07
  • C++从文件中提取英文单词的实现方法

    C++从文件中提取英文单词的实现方法

    本文主要介绍了C++从文件中提取英文单词的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • C++内存池两种方案解析

    C++内存池两种方案解析

    这篇文章主要详情介绍了C++内存池两种方案做对比,对此感兴趣的小伙伴一起来看看吧
    2021-08-08
  • Reactor反应器的实现方法详解

    Reactor反应器的实现方法详解

    本篇文章是对Reactor反应器的实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++变量存储的生命周期与作用域实例代码精讲

    C++变量存储的生命周期与作用域实例代码精讲

    这篇文章主要介绍了C++变量存储的生命周期与作用域,从创建到消亡的完整过程,例如人从出生到死亡的整个过程就是一个生命周期。本文将通过示例为大家详细讲讲,感兴趣的可以学习一下
    2022-10-10
  • C语言指针变量作为函数参数的实现步骤详解

    C语言指针变量作为函数参数的实现步骤详解

    这篇文章主要介绍了C语言指针变量作为函数参数的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-02-02

最新评论