windows程序设计第4章,加滚动条。
水平或垂直滚动消息处理中,会有如下两句代码:
ScrollWindow(hwnd, 0, (iVertPos - si.nPos)*cyChar, NULL, NULL);
UpdateWindow(hwnd);
其中ScrollWIndow()使视图向上滚动(iVertPos - si.nPos)*cyChar个像素单位,将新出现的区域无效化。也即,若消息是SB_LINEDOWM,则只有视图区的最下面,一行字符所占区域为无效区,而除该区域以处,全是有效区,不用重绘。
ScrollWIndow()这个平移功能好强大啊。
关键在这里了:UpdateWIndow()函数,书上写的是发送一条非队列消息WM_PAINT,但事实是,这个函数根本不会引发消息哎。这只是把队列中已经有的重绘消息提出来,放到队列最前面而已。所以,即使用了这行代码,重绘区,即PAINTSTRUCT的参数也不会变,还是滚动新出现的区域,而绝非全部整个视图。
实验:
在重绘的消息处理区for循环之前加上如下两句代码:
wsprintf(szBuffer, TEXT("%5d"), ps.rcPaint.top);
MessageBox(hwnd, szBuffer, TEXT("what"), MB_OK);
然后,运行。调整滚动条,看消息框中的数值。