vc++如何为窗口添加滚动条?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vc++如何为窗口添加滚动条?相关的知识,希望对你有一定的参考价值。

我首先建立的窗口没有滚动条,想通过输出的数据实现滚动,不知用什么办法?

第一步,在 CreateWindow 中添加 WS_VSCROLL 如下:

hwnd = CreateWindow(szClsName, TEXT("Scroll Test."), WS_OVERLAPPEDWINDOW | WS_VSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

第二步,添加 WM_VSCROLL 响应:

case WM_VSCROLL:
switch(LOWORD)wParam

case SB_THUMBTRACK:
nVPos = HIWORD(wParam);
break;
case SB_PAGEDOWN:
nVPos += nyClient / nyChar;
break;
case SB_PAGEUP:
nVPos -= nyClinet / nyChar;
break;
case SB_LINEDOWN:
nVPos += 1;
break;
case SB_LINEUP:
nVPos -= 1;
break;

nVPos = max(0, min(nVPos, NUMLINES - nyClinet / nyChar));
if(nVPos != GetScrollPos(hwnd, SB_VERT)) //滑块位置改变

SetScrollPos(hwnd, SB_VERT, nVPos, TRUE); //重设位置
InvalidateRect(hwnd, NULL, TRUE);   //重绘显示区

第三步:添加绘制响应

case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
  for(i = 0; i < NUMLINES; i++)
  
   y = nyChar * (i - nVPos);
   TextOut(hdc, 0, y, sysmetrics[i].szLabel, lstrlen(sysmetrics[i].szLabel));
   TextOut(hdc, 22*nxCaps, y, 
    sysmetrics[i].szDesc, lstrlen(sysmetrics[i].szDesc));
   SetTextAlign(hdc, TA_RIGHT | TA_TOP);
   TextOut(hdc, 22*nxCaps + 40*nxChar, y, 
    szBuf, wsprintf(szBuf, TEXT("%d"), GetSystemMetrics(sysmetrics[i].Index)));
   SetTextAlign(hdc, TA_LEFT | TA_TOP);
  
EndPaint(hwnd, &ps);

  第四步,当窗口大小发生改变时重绘

 case WM_SIZE:
nyClient = HIWORD(lParam);
SetScrollRange(hwnd, SB_VERT, 0, NUMLINES - nyClient / nyChar, FALSE);
SetScrollPos(hwnd, SB_VERT, nVPos, TRUE);
if((NUMLINES - nVPos)*nyChar < nyClient && NUMLINES * nyChar > nyClient)

nVPos = NUMLINES - nyClient / nyChar;
//PostMessage(hwnd, WM_VSCROLL, (nVPos << 16) & SB_THUMBTRACK, 0);

参考技术A 在vc++中为窗口增加滚动条的方法:
Add a message handler for the WM_VSCROLL message to the OnVScroll method:
void CTestDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

// TODO: Add your message handler code here and/or call default.
int nDelta;
int nMaxPos = m_rect.Height() - m_nCurHeight;

switch (nSBCode)

case SB_LINEDOWN:
if (m_nScrollPos >= nMaxPos)
return;
nDelta = min(nMaxPos/100,nMaxPos-m_nScrollPos);
break;

case SB_LINEUP:
if (m_nScrollPos <= 0)
return;
nDelta = -min(nMaxPos/100,m_nScrollPos);
break;

case SB_PAGEDOWN:
if (m_nScrollPos >= nMaxPos)
return;
nDelta = min(nMaxPos/10,nMaxPos-m_nScrollPos);
break;

case SB_THUMBPOSITION:
nDelta = (int)nPos - m_nScrollPos;
break;

case SB_PAGEUP:
if (m_nScrollPos <= 0)
return;
nDelta = -min(nMaxPos/10,m_nScrollPos);
break;

default:
return;

m_nScrollPos += nDelta;
SetScrollPos(SB_VERT,m_nScrollPos,TRUE);
ScrollWindow(0,-nDelta);
CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
参考技术B 显示数据 用控件 CListCtrl吧,
自己给窗口 加滚动条,在显示 滚动 很麻烦

关于richeditbox垂直滚动条 vc

我想象qq那样在添加了信息之后滚动条自动设置到最下面,以显示最新更新的数据怎么去做?vc的 谢谢了 !

参考技术A 在ReplaceSel后面添加底下这一行就可以了
m_redtMSG.PostMessage(WM_VSCROLL, SB_BOTTOM, 0);

以上是关于vc++如何为窗口添加滚动条?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 vc++ win32 中制作可滚动窗口

当输入框大于tkinter中的窗口高度时,我们如何添加滚动条?

VC中怎么滚动条宽度怎么解决

C# winfrom datagridview 如何为一列添加向下滚动条 请看清楚再回答!

在winform中,如何为DatagridView设置横向滚动条

VB如何为picturebox加滚动条?