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范围内!