|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
函数功能:
ScrollWindow 函数滚动指定窗口的客户区内容。
注意:该函数提供了向后兼容性,新的应用程序应该使用 ScrollWindowsEx 函数代替。
API 函数原型:
注释:_In_ 说明该参数是输入的,_opt_ 说明该参数是可选参数。
- BOOL ScrollWindow(
- _In_ HWND hWnd,
- _In_ int XAmount,
- _In_ int YAmount,
- _In_ const RECT *lpRect,
- _In_ const RECT *lpClipRect
- );
复制代码
参数解析:
参数 | 含义 | hWnd | 指向客户区将被滚动的窗口句柄 | XAmount | 1. 在设备单元中,指定水平滚动的数量
2. 如果窗口类风格为 CS_OWNDC 或 CS_CLASSDC,则此参数则使用逻辑单元而非设备单元
3. 当向左滚动窗口的内容时,该参数的值必须是负数 | YAmount | 1. 在设备单元中,指定垂直滚动的数量
2. 如果窗口类风格为 CS_OWNDC 或 CS_CLASSDC,则此参数则使用逻辑单元而非设备单元
3. 当向上滚动窗口的内容时,该参数的值必须是负数 | lpRect | 1. 指向 RECT 结构指针,该结构指定了将要滚动的客户区范围
2. 如果此参数为 NULL,则整个客户区域将被滚动 | lpClipRect | 1. 指向 RECT 结构指针,该结构指定了要滚动的裁剪区域
2. 只有这个矩形中的内容才会被滚动(在矩形之外的内容不会被影响,即使它们是在 lpRect 指定的矩形之内) |
返回值:
1. 如果函数调用成功,返回值是非 0;
2. 如果函数调用失败,返回值是 0。
备注:
1. 如果在被滚动的窗口中含有插入符,ScrollWindow 函数将自动隐藏插入符,以防它被擦掉。当滚动结束后再恢复插入符,插入符的位置相应的被调整。
2. 未被 ScrollWindow 函数覆盖的区域不会被重绘,但该区域会与窗口更新区域组合,当应用程序最终收到 WM_PAINT 的消息时,组合区域统一重绘。为了在滚动操作的同时重画未覆盖区域,则应在调用 ScrollWindow 函数后马上调用 UpdateWindow 函数。
3. 如果 lpRect 参数的值为 NULL,则窗口中的任何子窗口的位置由参数 XAmount 和 Yamount 的数值决定移动距离;窗口中无效的区域(未重绘)也会移动。
4. 当 lpRect 参数为 NULL 时,ScrollWindow 函数可以执行得更快。
5. 如果 lpRect 参数不为 NULL,则窗口中的子窗口的位置不改变,窗口中无效的区域(未重绘)也不移动。为了防止 lpRect 参数不为 NULL 时更新的问题,需要在调用 ScrollWindow 函数前调用 UpdateWindow 函数重绘窗口。
【API档案】版权归鱼C工作室(www.fishc.com)所有,转载请注明来源。
感叹下:能把例子都认真翻译过来的...才是真正的情怀吖......
- /* -------------------------------------------------------------------
- 【API档案】ScrollWindow 函数使用例子
- 鱼C工作室 -- www.fishc.com
- --------------------------------------------------------------------*/
- LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- HDC hdc;
- PAINTSTRUCT ps;
- TEXTMETRIC tm;
- SCROLLINFO si;
- static int xClient; // 客户区的宽度
- static int yClient; // 客户区的高度
- static int xClientMax; // 客户区内容显示的最大宽度(超过此宽度则加入滚动条)
- static int xChar; // 字体的平均水平宽度
- static int yChar; // 字体的垂直高度
- static int xUpper; // 字体的大写字符的水平宽度
- static int xPos; // 当前水平滚动条滑块的位置
- static int yPos; // 当前垂直滚动条滑块的位置
- int i; // 循环计数器
- int x, y; // 水平和垂直的坐标
- int FirstLine; // 失效区域的第一行(需重绘的第一行)
- int LastLine; // 失效区域的最后一行((需重绘的最后一行))
- HRESULT hr;
- size_t abcLength; // 用于存放 abc 数组的长度
- // 创建要显示的行(呃,打印的内容我就不翻译了吧...)
- #define LINES 28
- static TCHAR *abc[] = {
- TEXT("anteater"), TEXT("bear"), TEXT("cougar"),
- TEXT("dingo"), TEXT("elephant"), TEXT("falcon"),
- TEXT("gazelle"), TEXT("hyena"), TEXT("iguana"),
- TEXT("jackal"), TEXT("kangaroo"), TEXT("llama"),
- TEXT("moose"), TEXT("newt"), TEXT("octopus"),
- TEXT("penguin"), TEXT("quail"), TEXT("rat"),
- TEXT("squid"), TEXT("tortoise"), TEXT("urus"),
- TEXT("vole"), TEXT("walrus"), TEXT("xylophone"),
- TEXT("yak"), TEXT("zebra"),
- TEXT("This line contains words, but no character. Go figure."),
- TEXT("")
- };
- switch (message)
- {
- case WM_CREATE:
- // 获得设备环境句柄
- hdc = GetDC(hwnd);
- // 获得文本中字体的大小
- GetTextMetrics(hdc, &tm);
- xChar = tm.tmAveCharWidth;
- xUpper = (tm.tmPitchAndFamily & 1 ? 3 : 2) * xChar / 2;
- yChar = tm.tmHeight + tm.tmExternalLeading;
- // 释放设备环境句柄
- ReleaseDC(hwnd, hdc);
- // 设置客户区的最大宽度
- // (我们这里设置为 48 个小写字符的宽度 + 12 个大写字符的宽度)
- xClientMax = 48 * xChar + 12 * xUpper;
- return 0;
- case WM_SIZE:
- // 获得客户区的尺寸
- yClient = HIWORD(lParam);
- xClient = LOWORD(lParam);
- // 设置垂直滚动条范围和页面大小(设置页面大小将决定滑块的粗细)
- si.cbSize = sizeof(si);
- si.fMask = SIF_RANGE | SIF_PAGE;
- si.nMin = 0;
- si.nMax = LINES - 1;
- si.nPage = yClient / yChar;
- SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
- // 设置水平滚动条范围和页面大小(设置页面大小将决定滑块的粗细)
- si.cbSize = sizeof(si);
- si.fMask = SIF_RANGE | SIF_PAGE;
- si.nMin = 0;
- si.nMax = 2 + xClientMax / xChar;
- si.nPage = xClient / xChar;
- SetScrollInfo(hwnd, SB_HORZ, &si, TRUE);
- return 0;
- case WM_HSCROLL:
- // 获得水平滚动条的所有信息
- si.cbSize = sizeof (si);
- si.fMask = SIF_ALL;
- GetScrollInfo(hwnd, SB_HORZ, &si);
- // 保存当前滑块位置,迟些进行比较
- xPos = si.nPos;
- switch (LOWORD(wParam))
- {
- // 用户点击滚动条左边的三角形
- case SB_LINELEFT:
- si.nPos -= 1;
- break;
- // 用户点击滚动条右边的三角形
- case SB_LINERIGHT:
- si.nPos += 1;
- break;
- // 用户点击滑块左边的滚动条轴
- case SB_PAGELEFT:
- si.nPos -= si.nPage;
- break;
- // 用户点击滑块右边的滚动条轴
- case SB_PAGERIGHT:
- si.nPos += si.nPage;
- break;
- // 用户拖动滚动条
- case SB_THUMBTRACK:
- si.nPos = si.nTrackPos;
- break;
- default:
- break;
- }
- // 设置滚动条滑块的新位置
- si.fMask = SIF_POS;
- SetScrollInfo(hwnd, SB_HORZ, &si, TRUE);
- // 获得滚动条滑块的位置,由于窗口调整,它可能不是同一个值
- GetScrollInfo(hwnd, SB_HORZ, &si);
- // 与此前的保存的值进行比较,如果不同则滚动窗口
- if (si.nPos != xPos)
- {
- ScrollWindow(hwnd, xChar * (xPos - si.nPos), 0, NULL, NULL);
- }
- return 0;
- case WM_VSCROLL:
- // 获得垂直滚动条的所有信息
- si.cbSize = sizeof (si);
- si.fMask = SIF_ALL;
- GetScrollInfo(hwnd, SB_VERT, &si);
- // 保存当前滑块位置,迟些进行比较
- yPos = si.nPos;
- switch (LOWORD(wParam))
- {
- // 用户点击键盘 Home 按键
- case SB_TOP:
- si.nPos = si.nMin;
- break;
- // 用户点击键盘 End 按键
- case SB_BOTTOM:
- si.nPos = si.nMax;
- break;
- // 用户点击滚动条上边的三角形
- case SB_LINEUP:
- si.nPos -= 1;
- break;
- // 用户点击滚动条下边的三角形
- case SB_LINEDOWN:
- si.nPos += 1;
- break;
- // 用户点击滑块上边的滚动条轴
- case SB_PAGEUP:
- si.nPos -= si.nPage;
- break;
- // 用户点击滑块下边的滚动条轴
- case SB_PAGEDOWN:
- si.nPos += si.nPage;
- break;
- // 用户拖动滚动条
- case SB_THUMBTRACK:
- si.nPos = si.nTrackPos;
- break;
- default:
- break;
- }
- // 设置滚动条滑块的新位置
- si.fMask = SIF_POS;
- SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
- // 获得滚动条滑块的位置,由于窗口调整,它可能不是同一个值
- GetScrollInfo(hwnd, SB_VERT, &si);
- // 与此前的保存的值进行比较,如果不同则滚动窗口
- if (si.nPos != yPos)
- {
- ScrollWindow(hwnd, 0, yChar * (yPos - si.nPos), NULL, NULL);
- UpdateWindow(hwnd);
- }
- return 0;
- case WM_PAINT:
- // 准备绘制
- hdc = BeginPaint(hwnd, &ps);
- // 获得垂直滚动条的位置
- si.cbSize = sizeof (si);
- si.fMask = SIF_POS;
- GetScrollInfo(hwnd, SB_VERT, &si);
- yPos = si.nPos;
- // 获得水平滚动条的位置
- GetScrollInfo(hwnd, SB_HORZ, &si);
- xPos = si.nPos;
- // 计算需要重绘的区域
- 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);
- // 使用安全字符串函数获得字符串长度
- hr = StringCchLength(abc[i], 55, &abcLength);
- if ((FAILED(hr)) | (abcLength == NULL))
- {
- // 获取字符串长度失败的提示...
- }
- // 在客户区绘制一行数据
- TextOut(hdc, x, y, abc[i], abcLength);
- }
- // 绘制完毕
- EndPaint(hwnd, &ps);
- return 0;
- case WM_DESTROY:
- PostQuitMessage(0);
- return 0;
- }
- return DefWindowProc(hwnd, message, wParam, lParam);
- }
复制代码
如在使用上有任何不同,可以参考小甲鱼的《Windows程序设计(SDK)》第 14 讲:滚动条3
|
|