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

我首先建立的窗口没有滚动条,想通过输出的数据实现滚动,不知用什么办法?... 我首先建立的窗口没有滚动条,想通过输出的数据实现滚动,不知用什么办法? 展开
 我来答
jxjiangzl
推荐于2018-03-22 · TA获得超过778个赞
知道小有建树答主
回答量:371
采纳率:100%
帮助的人:355万
展开全部

第一步,在 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);
}
千锋教育
2016-01-24 · 做真实的自己 用良心做教育
千锋教育
千锋教育专注HTML5大前端、JavaEE、Python、人工智能、UI&UE、云计算、全栈软件测试、大数据、物联网+嵌入式、Unity游戏开发、网络安全、互联网营销、Go语言等培训教育。
向TA提问
展开全部
在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);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
屿浪2ae1
2015-01-29 · TA获得超过848个赞
知道答主
回答量:103
采纳率:0%
帮助的人:65.3万
展开全部
显示数据 用控件 CListCtrl吧,
自己给窗口 加滚动条,在显示 滚动 很麻烦
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式