各位帮帮忙
拿位仁兄能给我讲讲SCROLLWINDOW这个函数的用法,最好有例子,谢谢! 问题点数:0、回复次数:14Top
1 楼MaiCle(原来小日本连畜生都不如)回复于 2003-08-03 21:48:12 得分 0
MFC里的?
好久都没接触MFC了。忘得差不多了。Top
2 楼arock(人渣人)回复于 2003-08-03 22:13:31 得分 0
不是,小弟最近在看WINDOWS程序设计,搞不懂这个函数怎么用,看书也看不明白!Top
3 楼MaiCle(原来小日本连畜生都不如)回复于 2003-08-03 22:16:52 得分 0
能写出他的原形吗?Top
4 楼duanma(断码)回复于 2003-08-03 22:17:11 得分 0
呵呵,你可以到书店去翻翻书不就可以看到了吗?
可惜这次我没有借MFC的书~<~Top
5 楼arock(人渣人)回复于 2003-08-03 22:25:02 得分 0
原形我忘了,不过书上说这个函数是滚动客户区上的信息,可是它也引发WM_PAINT消息,我搞不清楚,在怎样处理WM_PAINT消息!Top
6 楼MaiCle(原来小日本连畜生都不如)回复于 2003-08-03 22:30:37 得分 0
WM_PAINT消息:是在一个CASE分支里的,在里面编写操作即可。Top
7 楼arock(人渣人)回复于 2003-08-03 22:38:55 得分 0
哦,MaiCle兄,要不我明天贴个例子各你分析分析一下吧!
Top
8 楼arock(人渣人)回复于 2003-08-04 09:45:45 得分 0
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int cxChar, cyChar, cxClient, cyClient;
int i, iBeginPaint, iEndPaint, iVscrollPos;
HDC hdc;
PAINTSTRUCT ps;
TEXTMETRIC tm;
SCROLLINFO si;
TCHAR buffer[20];
switch(message)
{
case WM_CREATE:
hdc = GetDC(hwnd);
GetTextMetrics(hdc, &tm);
cxChar = tm.tmAverCharWidth;
cyChar = tm.tmHeight + tm.tmExternalLeading;
ReleaseDC(hwnd, hdc);
return 0;
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
si.nMin = 0;
si.nMax = cyClient;
si.nPage = cyClient / cyChar;
SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
return 0;
case WM_VSCROLL:
si.cbSize = sizeof(si);
si.fMask = SIF_POS;
GetScrollInfo(hwnd, SB_VERT, &si);
iVscrollPos = si.nPos;
switch(LOWORD(wParam))
{
case SB_LINEUP:
si.nPos -= 1;
break;
case SB_LINEDOWN:
si.nPos += 1;
break;
case SB_PAGEUP:
si.nPos -= cyClient / cyChar;
break;
case SB_PAGEDOWN:
si.nPos += cyClient / cyChar;
break;
case SB_THUMBTRACK:
si.nPos = HIWORD(wParam);
break;
}
si.fMask = SIF_POS;
SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
si.fMask = SIF_POS;
GetScrollInfo(hwnd, SB_VERT, &si);
if(iVscrollPos != si.nPos)
{
ScrollWindow(hwnd, 0, cyChar * (iVscrollPos - si.nPos), NULL, NULL);
UpdateWindow(hwnd);
}
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd);
si.cbSize = sizeof(si);
si.fMask = SIF_POS;
GetScrollInfo(hwnd, SB_VERT, &si);
iVscrollPos = si.nPos;
iBeginPaint = max(0, iVscrollPos + ps.rcPaint.top / cyChar);
iEndPaint = min(cyClient, iVscrollPos + ps.rcPaint.bottom / cyChar);
for(i = iBeginPaint; i <= iEndPaint; i++)
{
MoveToEx(hdc, 0, (i - iVscrollPos) * cyChar, NULL);
LineTo(hdc, cxClient, (i - iVscrollPos) * cyChar);
TextOut(hdc, 0, (i - iVscrollPos) * cyChar, buffer,
wsprintf(buffer, "%d", i));
}
EndPaint(hwnd, hdc);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
这里给出了一个窗口函数,这程序的效果就是随着滚动条的滚动,客户区的数字也跟着滚动,我不明白的地方是ScrollWindow函数的用法和在WM_PAINT消息里的处理机制,哪位给我解析解析下!Top
9 楼fixopen(dup)回复于 2003-08-04 10:25:39 得分 0
ScrollWindow的作用是构造一个SCROLLINFO结构,充填它的成员,记录出滚动相关的信息。然后post出WM_PAINT消息。
这样,在你处理该消息时,你可以取出SCROLLINFO记录的信息,然后画出来就是了。Top
10 楼BAYERN(我有个愿望-要把月亮踹成直的,把太阳捏成方的)回复于 2003-08-04 10:51:09 得分 0
study.Top
11 楼yndfcd(YNDFCD)回复于 2003-08-04 15:25:49 得分 0
BOOL ScrollWindow(
HWND hWnd, // handle to window to scroll
int XAmount, // amount of horizontal scrolling
int YAmount, // amount of vertical scrolling
CONST RECT *lpRect,
// address of structure with scroll rectangle
CONST RECT *lpClipRect
// address of structure with clip rectangle
);
MSDN上的解释很清楚,不知道你为什么看不懂。
第一个参数不用说了。第二三个参数分别为水平方向和垂直方向的滚动距离。
第四个参数指明窗口的哪一个部需要滚动。你可以设为NULL表示整个窗口都要滚动。
第五个参数为要更新的窗口区域。窗口滚动后,如果不更新是看不出效果的。是看不出效果的。这个参数就相当于InvalidateRect的第二个参数。Top
12 楼arock(人渣人)回复于 2003-08-05 11:20:42 得分 0
哪位大佬给我解析解析上面的程序WM_PAINT消息里是怎样画图的!Top
13 楼arock(人渣人)回复于 2003-08-06 11:32:26 得分 0
呀,怎么没人给我解析一下呢!Top
14 楼fixopen(dup)回复于 2003-08-18 08:31:18 得分 0
画图的一般步骤是:获取绘画句柄(BeginPaint),画,释放绘画句柄(EndPaint)。
其中,画的时候,先获取要画的区域信息(scrollinfo),然后计算出画的位置,画。Top



