第013讲:滚动条2
知识点回顾:1. 要让滚动条正常的工作起来,其实是需要 Windows 和我们代码共同来维护的
Windows 负责:
[*]处理滚动条中的所有鼠标消息
[*]当用户单击滚动条时,提供一种反向显示的闪烁
[*]当用户拖动滑块时,在滚动条内移动滑块
[*]向拥有滚动条的窗口的窗口过程发送滚动条消息
我们的代码需要负责:
[*]初始化滚动条的范围和位置
[*]处理传送给窗口过程的滚动条消息
[*]更新滑块的位置
[*]根据滚动条的变化更新客户区的内容
2. 我们使用 SetScrollRange 函数来设置滚动条的范围
注意,这里所说的范围是指滑块的位置所能移动的范围,例如一个范围是 0~100 的滚动条,那么它的滑块就有 101 个位置可以移动。
3. TextOut 函数的第三个参数决定文本显示的位置
4. 程序员和用户看待滚动条的角度是不同的
例如当用户拉动滚动条向下滚动时,他们希望是看到文件中下方的内容。而我们设计程序,则是需要将文件相对于窗口向上移动。所以大家要注意,从这个角度来说,是相反的。
5. 需要系统发送 WM_PAINT 消息重绘窗口,可以使用 InvalidateRect 函数使得客户区失效
注意:
使用 InvalidateRect 使客户区失效,Windows 会在应用程序的消息队列为空的时候才发送 WM_PAINT 消息,也就意味着,如果你的程序很忙,那么刷新这一操作就会有所延迟,那么客户看到的就可能是程序一卡一卡的。
因此,如果你想立刻更新无效区域,则可以在调用 InvalidateRect 函数后随即调用 UpdateWindow 函数。因为我们以前讲过,如果客户区有任何一部分是无效的,UpdateWindow 函数将绕过消息队列,直接给窗口过程发一个 WM_PAINT 消息。
顶下 {:7_113:} 介个论坛是重要小小甲鱼也是很重要的 现在20150821 大一暑假 20160715 总得有 小小甲鱼了把
到时候别几年都看不到你了O__O"!! 牡丹花下死做鬼 发表于 2015-8-21 10:15
介个论坛是重要小小甲鱼也是很重要的 现在20150821 大一暑假 20160715 总得有 小小甲鱼了把
到时候别几年 ...
{:9_223:}估计要多两年才有小小甲鱼~熊孩子很讨厌的…… 小甲鱼 发表于 2015-8-21 11:29
估计要多两年才有小小甲鱼~熊孩子很讨厌的……
你忍得住么我一直以为是当晚就...... 顶 路过学习 回复 window编程确实难学。。。。 雀食
有大佬帮我看看嘛为啥的问题嘛?
static int cxChar, cyChar,cxCaps, cxClient, cyClient;
我定义了静态变量
case WM_VSCROLL:
hdc = GetDC(hwnd);
//SetTextAlign(hdc, TA_RIGHT | TA_TOP);
switch (wParam & 0Xffff) {
case SB_BOTTOM:
tem = TEXT("我被按了跳到最后。");
TextOut(hdc, cxClient+500, 10, tem, lstrlen(tem));
break;
case SB_LINEUP:
tem = TEXT("我被按了向上一行。");
TextOut(hdc, cxClient + 500, 10, tem, lstrlen(tem));
break;
case SB_LINEDOWN:
tem = TEXT("我被按了向下一行。");
TextOut(hdc, cxClient + 500, 10, tem, lstrlen(tem));
break;
case SB_PAGEUP:
tem = TEXT("我被按了向上一页。");
TextOut(hdc, cxClient + 500, 10, tem, lstrlen(tem));
break;
case SB_PAGEDOWN:
tem = TEXT("我被按了向下一页。");
TextOut(hdc, cxClient + 500, 10, tem, lstrlen(tem));
break;
case SB_TOP:
tem = TEXT("我被按了跳到顶端。");
TextOut(hdc, cxClient + 500, 10, tem, lstrlen(tem));
break;
case SB_THUMBTRACK:
tem = TEXT("别拖着我不放。");
TextOut(hdc, cxClient + 500, 10, tem, lstrlen(tem));
break;
}
ReleaseDC(hwnd, hdc);
case WM_SIZE:
hdc = GetDC(hwnd);
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
StringCchPrintf(strs, 128, L"这个窗口的大小是%d *%d pi.", cxClient, cyClient);
textlen = lstrlen(strs);
TextOut(hdc, 1000, 20, strs, textlen);
ReleaseDC(hwnd, hdc);
我运行后发现,只要我去点击那个滚动条的按键,窗口大小数值就会变0,这样我就无法把输出固定到右上角了 ,这是为啥
页:
[1]