- 状态栏
首先, 设定inpstatu的第7个元素为状态栏的标志, 当这个值为1时, 状态栏启用.
然后, 设置状态栏(Statu Bar)菜单项的反应函数:
winmain.c
case WM_COMMAND:
switch(wParam) {
......
case IDMU_STUB:
if(inpstatu[7] == 0) {
inpstatu[7] = 1;
MoveWindow(hEdit, 0, 0, updatex, updatey-20, TRUE);
hStatu = CreateWindowEx(0, "msctls_statusbar32", 0, WS_CHILD | WS_BORDER | WS_VISIBLE | SBS_SIZEGRIP,
0, updatey-22, updatex, 18, hWinMain, 0, ghInstance, 0);
} else if (inpstatu[7] == 1) {
inpstatu[7] = 0;
DestroyWindow(hStatu);
MoveWindow(hEdit, 0, 0, updatex, updatey, TRUE);
}
break;
在这里, 创建状态栏时, 首先先将Edit控件的宽缩小20单位, 然后在预留的控件中创建状态栏. 宽度设置为18的原因是为了避免与Edit的边界重合, 影响美观.
这里值得关注的是updatex和updatey. 之前设置状态栏大小随窗口大小变化时, 都是直接调用LOWORD(lParam)和HIWORD(lParam)的. 但是现在我们需要对Edit的尺寸进行操作, 必须将Edit的尺寸记录下来. 所以, 我们设置了两个int变量updatex和updatey, 在WM_INITDIALOG中, 这两个变量的值被设定为400和240, 即资源文件设置的大小. 而在WM_SIZE中, 做了如下处理:
winmain.c
case WM_SIZE:
updatex = LOWORD(lParam);
updatey = HIWORD(lParam);
而再次点击菜单项被设定为关闭状态栏, 此时做设置的反操作, 销毁状态栏窗口句柄, 恢复Edit到原大小.
此时的WM_SIZE由于涉及两个控件, 需要修改:
winmain.c
case WM_SIZE:
updatex = LOWORD(lParam);
updatey = HIWORD(lParam);
if(inpstatu[7] == 0) {
MoveWindow(hEdit, 0, 0, updatex, updatey, TRUE);
} else if (inpstatu[7] == 1) {
MoveWindow(hStatu, 0, updatey-22, updatex, 18, TRUE);
MoveWindow(hEdit, 0, 0, updatex, updatey-20, TRUE);
}
break;
可以看到, 如果没有启用状态栏, 则Edit控件仍按照窗口原大小更新, 否则Edit控件宽度缩小20单位, 留给状态栏.
运行效果如下:
目前已知问题: 在更新窗口大小时, 状态栏周围会出现黑边, 重新点击Edit控件会消失.