ttljdboy 发表于 2017-5-17 16:02:08

windows sdk 编程13课滚动条2 疑问

视频里小甲鱼老湿说每次windows窗口大小改变时,会附带发送默认值为SB_LINEUP的 WM_VSCROLL消息   也因此导致了如果持续变化窗口大小会导致 显示内容中前面不断出现空行的问题

但是我自己调试发现 改变窗口大小时并没有WM_SCROLL消息    是这几年windows自己做的修正吗?? 还是win10就是这样的

同时我自己的习惯在 switch (LOWORD(wParam)) 前面   
加了一条 cyScrollPos = GetScrollPos(hwnd, SB_VERT);语句
发现SetScrollPos(hwnd, SB_VERT, cyScrollPos, FALSE);后   即使cyScrollPos是负值
GetScrollPos(hwnd, SB_VERT); 返回的也是0而不是原来的负值

所以即使后面不加cyScrollPos = max(0, min(cyScrollPos, NUMLINES - 1)); 修正语句
也不会出现因为不断变化大小而出现空行的事情

如果没有GetScrollPos(hwnd, SB_VERT);跟踪发现cyScrollPos可以一直负向变大下去 -1 -2 -3

       

ttljdboy 发表于 2017-5-17 16:44:45

还有一个问题 前面说cyScrollPos = GetScrollPos(hwnd, SB_VERT); 似乎可以起到
cyScrollPos = max(0, min(cyScrollPos, NUMLINES - 1));的作用
但是在添加了 InvalidateRect(hwnd, NULL, TRUE); 之后发现如果没有最大最小值修正 还是有问题
就是 单击向上一行按钮时 会出现第一行空白放了鼠标又弹回去的情况
出现空白我可以理解 因为 InvalidateRect(hwnd, NULL, TRUE);后 收到WM_PAINT消息的时候
cyScrollPos是==-1的但是为什么放了鼠标后会弹回去?
我调试的时候也发现 每处窗口出现时都是空一行的 没有弹回去的情况而且cyScrollPos 都是==-1的
在csScrollPos==0的时候 是没有WM_PAINT消息的为什么会弹回去??

ttljdboy 发表于 2017-5-19 16:47:21

case WM_VSCROLL:
                hdc = GetDC(hwnd);
                cyScrollPos = GetScrollPos(hwnd, SB_VERT);
                switch (LOWORD(wParam)){
                .... }
                SetScrollPos(hwnd, SB_VERT, cyScrollPos, FALSE);
                InvalidateRect(hwnd, NULL, TRUE);
直接运行情况下:点击滚动条向上一行按钮窗口会出现一行空行 然后马上消失
调试情况下:只在WM_PAINT里设置断点 发现点击向上一行按钮情况下 持续一行空行 没有消失出现
就是说运行时某个动作触发了 cyScrollPos==0时的绘制窗口
而调试时 触发绘制窗口时 永远都是cyScrollPos==-1这是为什么实在想不通
页: [1]
查看完整版本: windows sdk 编程13课滚动条2 疑问