效果:
1、通过滚轮拖动进行滚动显示
2、通过鼠标滚轮显示
3、保证滚动每行和字实际高度一致
4、滚轮行数和需要滚动的字行数一致
正文:需要自绘静态文本框
一、使用滚轮和滚动条
在PreTranslateMessage函数中判断滚轮消息
UINT btnID;
//由窗口句柄获得控件ID号,GetWindowLong为获得窗口的ID号。
btnID = GetWindowLong(pMsg->hwnd, GWL_ID);
int zDelta = (short)HIWORD(pMsg->wParam);
switch (pMsg->message)
{
case WM_MOUSEWHEEL:
{
if (btnID == 静态文本框ID)
{
通过判断zDelta为-120还是120来累加或者累减滚动行数这个变量就可以了
同样使用滚动条也是一样
二、实现滚动行效果
在DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)中添加代码
lpDrawItemStruct->CtlID:判断当前静态文本框ID
//显示,str为静态文本框显示字
CDC dc;
dc.Attach(lpDrawItemStruct->hDC); //获取控件DC
dc.SetBkMode(TRANSPARENT); //设置背景色透明
CString str;
GetWindowText(str);
dc.SetTextColor(RGB(255, 255, 255));
dc.DrawText(str, rect, DT_EDITCONTROL | DT_WORDBREAK);//str为显示数据
//获取静态文本框当前显示文字的行数和每行高度
CRect rect
this->GetWindowRect(&rect);
ScreenToClient(&rect);//静态文本框尺寸
CDC* pDC = GetDC();
CFont fn;
fn.CreatePointFont(100, _T("微软雅黑"));//字体为静态文本框显示的字体和大小
CFont *pOldfont = pDC->SelectObject(&fn);
CSize size = pDC->GetTextExtent(str);//size.cx 为字符串所占水平方向的像素数
float sum = (size.cx * 1.0) / (rect.Width() * 1.0);
//长度行数
Static_long = ceil(sum);//今天文本框中字体行数
m_Linesize = size.cy;//字体高度=静态文本框滚动每行像素
//设置滚动效果:将静态文本框的高度向上移动,
rect.top = rect.top - m_Linesize * 滚动行数;//每行行高*要滚动的行数
本文介绍如何在MFC中实现静态文本框的滚动显示效果,包括滚轮拖动、鼠标滚轮滚动,并确保滚动时每行文字高度一致,滚轮行数与文字行数对应。主要涉及滚轮消息处理、自绘静态文本框及DrawItem函数中的滚动行效果实现。
582

被折叠的 条评论
为什么被折叠?



