版权声明:本文为博主原创文章,未经博主允许不得转载。 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控件上显示的是像素宽度。目前我是没有解决这个问题。如果我解决了,会更新给大家。哈