MFC中Edit控件垂直滚动条时,当文本超出时再显示垂直滚动条

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32716885/article/details/82766706

现在我需要实现这样一个功能:

     想要用edit控件本身的滚动条,并且设置该属性,但是该滚动条会一直存在。效果如下图,很是难看,当没有输入信息时,也会出现垂直滚动条

其实,只有在文本超过设定的区域内才会显示(在这我不知道如何上传动态效果图片,所以只有代码展示了)

第一步:对于控件属性的设置

Multiline = True

Auto HScroll = False

Auto VScroll = True

Vertical Scroll = True

第二步:重写PreSubclassWindow()这个函数

virtual void PreSubclassWindow();
void CMyEdit::PreSubclassWindow()
{
	//如果用户设置了  垂直滚动条  ,隐藏属性,只有超出时才会显示
	if(GetStyle() & WM_VSCROLL)
	{
		this->ShowScrollBar(SB_VERT , FALSE);
	}
	CEdit::PreSubclassWindow();
}

第三步:重写OnKeyUp消息。

因为当用户按下键盘时,才会输入内容,根据输入的行数判断是否超出控件的高度,才会触发滚动条消息

CStringW   StrLog;
//第一步:获取文本的行数
int nLineCount = GetLineCount();
//获取字体的高度、宽度
CFont  *font = this->GetFont();
LOGFONT lf;
font->GetLogFont(&lf);
int TextHeight = lf.lfHeight;
TextHeight < 0 ? -TextHeight : TextHeight;

//获取控件自身的高度、宽度
CRect   rectEdit;
this->GetRect(rectEdit);
int  editHeight = rectEdit.Height();

//当输入的高度 > 控件高度   触发滚动条
if (editHeight < TextHeight*nLineCount)
{
	this->ShowScrollBar(SB_VERT , TRUE);
}
else
	this->ShowScrollBar(SB_VERT , FALSE);

这样子就设置好了。

我曾尝试要设置水平滚动条。但是 ,我发现了一个问题,我获取到了字符串总体的宽度与edit控件的宽度不在一个层面上。就是说,我获取的是物理宽度,但是edit控件上显示的是像素宽度。目前我是没有解决这个问题。如果我解决了,会更新给大家。哈

猜你喜欢

转载自blog.csdn.net/qq_32716885/article/details/82766706