MFC中CEdit高度如何随字符行数自适应


今天遇到一个问题,在MFC中,CEdit中如何根据输入的字符行数自动调整其高度,现记录于下备忘。

一、实现效果

在这里插入图片描述

二、关于DC中的TEXTMETRIC

这个结构体实际上描述了设备上下文(DC)中的字体度量信息,当我们想获取某个DC的字体度量信息时,可以获取这个结构体。
在本例中,我们获取CEdit中的字符行数,同时获取每行字符的高度、行距等等信息,就可以知道CEdit应该显示多高,然后设置CEdit的尺寸位置就可以实现其高度自适应。
TEXTMETRIC结构体定义如下:

typedef struct tagTEXTMETRIC { 
    LONG tmHeight;                  //字符高度
    LONG tmAscent;                  //字符上部高度(基线以上)
    LONG tmDescent;                 //字符下部高度(基线以下)
    LONG tmInternalLeading;         //由tmHeight定义的字符高度的顶部空间数目
    LONG tmExternalLeading;         //字符行距
    LONG tmAveCharWidth;            //平均字符宽度
    LONG tmMaxCharWidth;            //最宽字符的宽度
    LONG tmWeight;                  //字体的粗细轻重程度
    LONG tmOverhang;                //加入某些拼接字体上的附加高度
    LONG tmDigitizedAspectX;        //字体设计所针对的设备水平方向
    LONG tmDigitizedAspectY;        //字体设计所针对的设备垂直方向
    BCHAR tmFirstChar;              //为字体定义的第一个字符
    BCHAR tmLastChar;               //为字体定义的最后一个字符
    BCHAR tmDefaultChar;            //字体中所没有字符的替代字符
    BCHAR tmBreakChar;              //用于拆字的字符
    BYTE tmItalic;                  //字体为斜体时非零
    BYTE tmUnderlined;              //字体为下划线时非零
    BYTE tmStruckOut;               //字体被删去时非零
    BYTE tmPitchAndFamily;          //字体间距(低4位)和族(高4位)
    BYTE tmCharSet;                 //字体的字符集
} TEXTMETRIC, *PTEXTMETRIC; 

上述结构中所涉及的基线、上部高度、下部高度、字符高度、字符内部顶部空间数目详见下图所示。
在这里插入图片描述

三、代码实现

1、编辑框属性设置

新建一个MFC工程,在对话框上加入一个CEdit控件,控件的属性修改为:
Auto HScroll : False
Auto VScroll : True
Multiline : Ture
Want Return : Ture

2、头文件中增加的代码

添加编辑框文本改动消息响应函数

afx_msg void OnEnChangeEdtSizeable();

同时在头文件中添加CEdit控件的关联控件型变量

CEdit m_wndEdtSizeable;

3、实现文件增加的代码

实现文件加入文本改动消息响应函数的实现代码

void CAdaptiveEditDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_EDT_SIZEABLE, m_wndEdtSizeable);
}

BEGIN_MESSAGE_MAP(CAdaptiveEditDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_EN_CHANGE(IDC_EDT_SIZEABLE, &CAdaptiveEditDlg::OnEnChangeEdtSizeable)
END_MESSAGE_MAP()

void CAdaptiveEditDlg::OnEnChangeEdtSizeable()
{
	//查看目前编辑框文本到底多少行
	int iLineCount = m_wndEdtSizeable.GetLineCount();

	//获取每行文字的高度
	CClientDC dc(&m_wndEdtSizeable);
	CFont* pCurFont = m_wndEdtSizeable.GetFont();
	CFont* pOldFont = dc.SelectObject(pCurFont); //DC中必须选入当前字体,否则DC存储的是默认字体
	TEXTMETRIC tmText;
	dc.GetTextMetrics(&tmText);
	//此处多加一行为MFC的实现所致,在多行编辑框中,MFC换行后始终保持最下面一行文本距离编辑框底部
	//大概一行的距离。
	int iTotalHeight = (iLineCount+1) * (tmText.tmHeight + tmText.tmExternalLeading);
	dc.SelectObject(pOldFont);

	//设置文本框的大小位置
	CRect rect;
	m_wndEdtSizeable.GetWindowRect(rect);
	ScreenToClient(rect);
	if (iTotalHeight > rect.Height())
	{
		rect.bottom = rect.top + iTotalHeight;
		m_wndEdtSizeable.MoveWindow(rect);
	}
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Santiago

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值