小甲鱼 发表于 2015-8-21 01:41:37

第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 消息。


迷雾少年 发表于 2015-8-21 08:22:54

顶下 {:7_113:}

牡丹花下死做鬼 发表于 2015-8-21 10:15:05

介个论坛是重要小小甲鱼也是很重要的 现在20150821 大一暑假 20160715 总得有 小小甲鱼了把
到时候别几年都看不到你了O__O"!!

小甲鱼 发表于 2015-8-21 11:29:45

牡丹花下死做鬼 发表于 2015-8-21 10:15
介个论坛是重要小小甲鱼也是很重要的 现在20150821 大一暑假 20160715 总得有 小小甲鱼了把
到时候别几年 ...

{:9_223:}估计要多两年才有小小甲鱼~熊孩子很讨厌的……

牡丹花下死做鬼 发表于 2015-8-21 18:05:38

小甲鱼 发表于 2015-8-21 11:29
估计要多两年才有小小甲鱼~熊孩子很讨厌的……

你忍得住么我一直以为是当晚就......

scf 发表于 2015-8-21 22:24:26

BngThea 发表于 2017-7-14 11:05:16

路过学习

回访三生 发表于 2018-6-17 16:07:34

回复

SuperJd 发表于 2020-2-22 11:23:29

window编程确实难学。。。。

武神浩宇 发表于 2022-12-12 15:12:39

雀食

18780673191 发表于 2024-10-28 11:16:01

有大佬帮我看看嘛为啥的问题嘛?
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]
查看完整版本: 第013讲:滚动条2