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

当前的开发环境: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修改编辑框光标位置内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MFC模拟实现自定义消息发送

    目录 自定义消息 第一步:定义自定义消息名称以及ID 第二步:发送自定义消息 第三步:自定义消息映射 第四步:自定义消息实现 模拟系统消息 wParam参数 LPARAM参数 在MFC框架下,有很多系统已经定义好的消息,例如ON_WM_LBUTTONDOWN().ON_WM_MBUTTONDOWN()等等.我们在使用的时候只需要声明并调用就可以了,最简单的用法. 提升了一点难度的用法就是自己设置自定义消息,再提升一点难度的就是如何模拟系统消息了,一般情况下只是做普通的项目开发功能是用不到的. 在

  • MFC对话框实现梯形分页

    本文实例为大家分享了MFC对话框实现梯形分页的具体代码,供大家参考,具体内容如下 // MFCDlg.h: 头文件 // #pragma once #include "CMemoCtrl.h" // CMFCDlg 对话框 class CMFCDlg : public CDialogEx { // 构造 CMemoCtrl m_Memo; public: CMFCDlg(CWnd* pParent = nullptr); // 标准构造函数 // 对话框数据 #ifdef AFX_DE

  • MFC实现对话框编辑控件上拖拽文件

    本文实例为大家分享了MFC实现对话框编辑控件上拖拽文件的具体代码,供大家参考,具体内容如下 步骤 1.重载CEdit类 2.添加编辑框控件 首先,重载CEdit类,定义一个派生类CDragEdit类,并重载它的WM_CREATE方法,在其中添加DragAcceptFile(TRUE); 方法. // CDragEdit.h #pragma once class CDragEdit : public CEdit { DECLARE_DYNAMIC(CDragEdit) public: CDragE

  • 基于MFC实现自定义复选框效果

    目录 介绍 功能实现 介绍 什么叫做复选框? 复选框是一种可同时选中多项的基础控件,主要是有两种明显的状态:选中与非选中. 在我们实际开发过程中,单纯的系统边框已经无法满足对界面显示需求了,这时需要采用自定义图片进行展示,那么展示效果是如何呢? 对于我们MFC框架来说,想要实现一个自定义的控件很难,一般情况下采用自绘的方式实现.对于Check控件来说,也是如此. 功能实现 复选框父类:CButton 当我们从资源视图中拖出来一个控件并绑定成员变量后,当前复选框的父类便是CButton. 这里,假

  • MFC之ComboBox控件用法实例教程

    本文以实例形式较为详细的讲述了MFC中ComboBox控件的用法.分享给大家供大家参考之用.具体方法如下: 一.ComboBox简介: ComboBox控件是由一个文本输入控件和一个下拉菜单组成的.用户可以从一个预先定义的列表里选择一个选项,同时也可以直接在文本框里面输入文本. 从工具栏中拖一个Combo Box控件.右击添加变量,变量名为cbBox. 二.用法: 1.为控件添加选项,指定默认选项 cbBox.AddString(_T("one")); cbBox.AddString(

  • MFC对话框中实现走马灯效果

    本文实例为大家分享了MFC对话框中实现走马灯,文字信息循环播放显示效果,供大家参考,具体内容如下 CMFCDlg.h 对话框 // CMFCDlg.h 对话框 class CMFCDlg : public CDialogEx { // 构造 public: CMFCDlg(CWnd* pParent = nullptr); // 标准构造函数 // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_DLG_M }; #endif // 实现 protec

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

    当前的开发环境:VS2010,32位 MFC框架 使用MFC中系统CComboBox控件时,会有三种风格,其中有一种风格:CBN_DROPDWON,该编辑框是可以进行编辑的. 更改多CComboBox高度的友友们就会发现这样一个问题,控件高度变高后,edit编辑控件的高度光标一直处于左上角的位置,看起来很是不美观,如下图所示: 其实,想要实现光标处于垂直状态,如下图所示: 这种效果看着就比较顺眼了,此时,有人想要问,怎么改变编辑框的高度呢? 有人使用系统的MoveWindow,居然不生效?这个问

  • C# / VB.NET 在PPT中创建、编辑PPT SmartArt图形的方法详解

    本文介绍通过C#和VB.NET程序代码来创建和编辑PPT文档中的SmartArt图形.文中将分两个操作示例来演示创建和编辑结果. 使用工具:Spire.Presentation for .NET hotfix 5.9.5 Dll文件引用: 方式1:下载包.下载后,解压,打开Bin文件夹,根据自己用的.NET Framework选择相应的文件夹,如:此示例中使用的是NET4.0,即打开NET4.0文件,找到Spire.Presentation.dll文件.找到dll文件后,在vs程序中添加引用该d

  • 对python修改xml文件的节点值方法详解

    这是我的xml文件结构 <?xml version='1.0' encoding='utf-8'?> <annotation> <folder>JPEGImages</folder> <filename>train_2018-05-08_1000.jpg</filename> <path>D:\all_data\2018-05-08\JPEGImages\train_2018-05-08_1000.jpg</path

  • python修改文件内容的3种方法详解

    这篇文章主要介绍了python修改文件内容的3种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.修改原文件方式 def alter(file,old_str,new_str): """ 替换文件中的字符串 :param file:文件名 :param old_str:就字符串 :param new_str:新字符串 :return: """ file_data = "&qu

  • Android中CheckBox复选框控件使用方法详解

    CheckBox复选框控件使用方法,具体内容如下 一.简介 1. 2.类结构图 二.CheckBox复选框控件使用方法 这里是使用java代码在LinearLayout里面添加控件 1.新建LinearLayout布局 2.建立CheckBox的XML的Layout文件 3.通过View.inflate()方法创建CheckBox CheckBox checkBox=(CheckBox) View.inflate(this, R.layout.checkbox, null); 4.通过Linea

  • jQuery实现侧边栏隐藏与显示的方法详解

    本文实例讲述了jQuery实现侧边栏隐藏与显示的方法.分享给大家供大家参考,具体如下: web项目中经常会出现左侧侧边栏,右侧显示内容的web页面. 效果如图: 如何实现点击本周食谱,本周食谱的列表隐藏或显示切换,并关闭下周食谱列表显示,点击下周食谱,让下周食谱的列表隐藏切换显示,并关闭本周食谱列表显示 实现思路: 1.布局: 布局顶部的topDiv,左侧的leftDiv(optionDiv,navListUl), 布局右侧的contentDiv. 布局如图: 2.js控制optionDiv和n

  • oracle修改scott密码与解锁的方法详解

    scott用户的密码不对,进入管理员用户,修改scott用户密码即可 或者这样修改密码:在运行栏里面敲:sqlplus(空格)/nolog 回车接着在弹出框里面敲:conn sys/password as sysdba回车提示已连接最后敲:alter user scott identified by tiger;回车alter user scott account unlock;回车(对SCOTT解锁)http://an:1158/em/console/logon/logon;jsessioni

  • 基于Bootstrap下拉框插件bootstrap-select使用方法详解

    写在前面: 在这次的项目中,没有再使用liger-ui做为前端框架了,改为了Bootstrap,这次也好接触下新的技术,在学习的过程中发现,Bootstrap的一些组件基本都是采用class的形式,就是给一个它定义好的样式,就会给你展现出一个好看的组件出来,这个比liger-ui的界面做的要好,但是了解了Boostrap的基本语法后,发现在官方的文档中,并没有一些可以动态加载组件的demo,因为之前用的liger-ui,大多数组件都只需要写一行代码,就能很好的,并且很方便的直接与后台进行交互,并

  • HBuilderX配置tomcat外部服务器查看编辑jsp界面的方法详解

    一.第一种方法,通过启动本地tomcat,查看jsp 在tomcat的webapps目录下创建文件夹HBuilderX 打开HBuilderX软件,点击文件/导入/导入本地文件,找到tomcat的webapps 导入成功大概是这样. 打开工具设置,找运行设置,外部web服务器调用url,输入http://localhost:8080后面的端口号是自己tomcat的默认端口,如果没有修改过就是8080,我因为修改成80端口(80端口可不写),所以配置中并未填写,注意下面的选项,外部web服务器ur

  • JavaScript React如何修改默认端口号方法详解

    问题 我们在使用React的时候经常会遇到这种情况,3000端口号被占用.有时候可以关掉3000端口,但更多时候,我们需要打开多个项目的时候,就必须要开启多个端口了.这时候就需要修改默认端口号了. 解决办法 修改默认端口号 具体做法 第一步:找到start.js文件 这个文件的位置在:node_modules文件夹下 -> react-scripts文件夹下 -> scripts文件夹下 -> start.js node_modules下 start.js文件 51行处修改,整个文件端口

随机推荐