鱼C论坛

 找回密码
 立即注册
查看: 1920|回复: 2

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

[复制链接]
发表于 2017-5-17 16:02:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
视频里小甲鱼老湿说每次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

       
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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消息的  为什么会弹回去??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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  这是为什么  实在想不通
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 19:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表