1. 文本输出时空间不足的问题:
在上一个例子中屏幕明显不够大,而Windows只能简单地从客户区顶部显示那些信息,只能依赖把落在客户区之外的部分剪裁掉
2. 客户区尺寸大小的高效获取办法:
如果每次需要使用客户区尺寸时都调一次GetClientRect效率会非常低,因此获取该尺寸最佳的时机就是在响应WM_SIZE消息的时候,每当客户区形状或大小发生改变时就会产生WM_SIZE消息,而其附加参数wParam的低16位和高16位分别保存即时的窗口宽和高,因此可以声明两个静态变量来保存宽和高,这样就可以在任何消息响应中共享该变量了:
static int cxClient, cyClient;
#define LOWORD(l) ((WORD)(l))
#define HIWORD(l) ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))
case WM_SIZE:
cxClient = LOWORD( lParam );
cyClient = HIWORD( lParam );
return 0;其中LOWRD和HIWORD宏定义在windef.h中
通常在响应WM_SIZE消息之后会立即产生一个WM_PAINT消息,因为类风格重定义了CS_HREDRAW | CS_VREDRAW,一旦窗口形状大小发生改变则需要重绘!
3. 滚动条的简介:
创建滚动条:在CreateWindow的时候添加Window Style参数WS_VSCROLL(垂直滚动条)或WS_HSCROLL(水平滚动条)
!客户区并不包含滚动条所占用的空间
滚条的使用方法:
设置滚动条的范围:
BOOL SetScrollRange( // 设定滚条的范围
HWND hWnd, // 滚条所属窗口
int nBar, // 设置的是哪个滚条,SB_VERT(垂直滚条)或SB_HORZ(水平滚条),SB表示Scroll Bar
// Windows用一组整数值表示滚条的范围
int nMinPos, // 位置最小值
int nMaxPos, // 位置最大值
BOOL bRedraw // TRUE表示滚条要重绘否则不需要立即重绘
);滑块的位置总是离散值,一个范围为0 ~ 4的滚条总共有5个位置:
设置滑块的位置:
int SetScrollPos( HWND hWnd, int nBar, int nPos, BOOL bRedraw );
其中第3个参数就是指定滑块的位置,必须处于nMin和nMax范围内!
4. 处理滚条消息:
滚条消息
Win32滚动条与文本输出详解

本文详细介绍了在Win32环境下处理文本输出时遇到的空间不足问题,提出通过响应WM_SIZE消息高效获取客户区尺寸。同时,讨论了滚动条的创建、范围设置、滑块位置调整以及滚条消息的处理,特别强调了SB_THUMBTRACK和SB_THUMBPOSITION消息在滑块拖动过程中的作用。最后,提到了滚动条在子窗口中的特殊情况及其通知码定义。
最低0.47元/天 解锁文章
479

被折叠的 条评论
为什么被折叠?



