Windows程序设计第四章,在设计滚动条的时候,横竖滚动条都用到了ScrollWindow函数,说是滚动客户区的内容,可是既然滚动了为什么还要用UpdateWindow函数手动触发WM_PAINT消息,并在处理WM_PAINT消息的过程函数中根据滚动条的位置重画客户区的内容。而且,用了ScrollWindow函数后,纵滚动条要调用UpdateWindow函数,而横滚动条却不需要。
这个ScrollWindow函数到底在内部干了什么,起了什么作用?
这个ScrollWindow函数到底在内部干了什么,起了什么作用?
解决方案 »
- ADO连接Excel如何使用相对地址?!
- 在这个OnPaint绘制方式有什么错误吗?为什么,创建第一个窗口的时候,OnPaint工作正常。创建第二个窗口之后,第一个窗口就工作不正常了。
- WSAAsyncSelect在vista下面的问题
- Radio问题
- 如何跟踪dll代码?
- VC开发的ActiveX控件,用ClassWizard生成事件,怎么触发这个事件?
- VC6 中如何干干净净地删除一个类
- ****网络编程概念性的问题!!!
- 为什么我的vc工程向导里只有五个内容,重新安装了之后还是这个样子的
- 初学vc,不知道滚动条的范围怎么样来扩大?
- 如何把存在内存中的灰度数据显示在屏幕上。
- 请问各位,如何设Windows桌面墙纸呢?
case WM_VSCROLL:
。
。
。
if (si.nPos != yPos)
{
ScrollWindow(hwnd, 0, yChar * (yPos - si.nPos), NULL, NULL);
UpdateWindow (hwnd);
}
return 0;
而
case WM_HSCROLL:
。
。
。
if (si.nPos != xPos)
{
ScrollWindow(hwnd, xChar * (xPos - si.nPos), 0, NULL, NULL);
}
return 0;这是WndProc中的WM_PAINT消息的处理:
case WM_PAINT :
// Prepare the window for painting
hdc = BeginPaint (hwnd, &ps); // Get vertical scroll bar position
si.cbSize = sizeof (si);
si.fMask = SIF_POS;
GetScrollInfo (hwnd, SB_VERT, &si);
yPos = si.nPos; // Get horizontal scroll bar position
GetScrollInfo (hwnd, SB_HORZ, &si);
xPos = si.nPos; // Find painting limits
FirstLine = max (0, yPos + ps.rcPaint.top / yChar);
LastLine = min (LINES - 1, yPos + ps.rcPaint.bottom / yChar);
for (i = FirstLine; i <= LastLine; i++)
{
x = xChar * (1 - xPos);
y = yChar * (i - yPos);
TextOut (hdc, x, y, abc[i], lstrlen(abc[i]));
} // Indicate that painting is finished
EndPaint (hwnd, &ps);
return 0;