问题目录:
- 1、如何隐藏和显示窗口
- 2、InvalidateRect在连续使用鼠标或光标时暂时不起作用
- 3、在VC项目里自己添加头文件和cpp文件在编译阶段报错
- 4、在static 控件里添加子控件或为SS_WHITETECT的话,如何重画背景区域
- 5、子窗口类别化时,新的消息处理函数的 消息WM_CREATE 不会被执行
1、如何隐藏和显示窗口
(首先程序框架参考 另一篇博文)
BOOL WINAPI SetWindowPos(
_In_ HWND hWnd,
_In_opt_ HWND hWndInsertAfter, //z轴的位置 如 HWND_TOPMOST
_In_ int X,
_In_ int Y,
_In_ int cx, // nwidth
_In_ int cy, // nHeight
_In_ UINT uFlags // 可以设置隐藏 和 显示窗口
);
BOOL WINAPI GetWindowRect(
_In_ HWND hWnd,
_Out_ LPRECT lpRect
);
若要使用SetWindowPos 来隐藏和显示 窗口于同一位置,可以结合使用 GetWindowRect 函数来实现:
GetWindowRect(hwnd3,&rect3);
SetWindowPos(hwnd3,HWND_TOPMOST,rect3.left,rect3.top,rect3.right-rect3.left,rect3.bottom-rect3.top,SWP_HIDEWINDOW);
SetWindowPos(hwnd3,HWND_TOPMOST,rect3.left,rect3.top,rect3.right-rect3.left,rect3.bottom-rect3.top,SWP_SHOWWINDOW);
显示和隐藏窗口 一个跟简单的函数是 ShowWindow
BOOL WINAPI ShowWindow(
_In_ HWND hWnd,
_In_ int nCmdShow
);
可通过如下代码简单实现:
ShowWindow(hwnd2,SW_HIDE);
ShowWindow(hwnd2,SW_SHOW);
2、InvalidateRect在连续使用鼠标或光标时暂时不起作用
由于WM_PAINT消息的优先等级比较低,所以,如果您还在使用鼠标或者光标键移动滚动条的话,这个消息将不会立即被处理。
指导书说可以:
可以在InvalidateRect之后增加下面的叙述:
UpdateWindow (hwnd) ;
但这会使得键盘和鼠标处理变慢。
另外一个解决办法是,在别的消息里来处理事务。
3、在VC项目里自己添加头文件和cppw文件在编译阶段报错
VC的编译器有时不是很灵活,比如 自己的头文件里有使用windows.h头文件声明到的类型,如果不在include "customize.h"前 include<windows.h>则会报错。
4、在static 控件里添加子控件或为SS_WHITETECT的话,如何重画背景区域
这两种情况,以下消息 :case WM_CTLCOLORSTATIC : 里的设置 如:
SetTextColor ((HDC) wParam, crPrim[i % 3]) ;
SetBkColor ((HDC) wParam, GetSysColor (COLOR_BTNHIGHLIGHT));
return (LRESULT) hBrushStatic ;
将不起作用,只能在窗口子类别化(Window Subclassing)后在WM_PAINT 中自行手动绘制来重画。
5、子窗口类别化时,新的消息处理函数的 消息WM_CREATE 不会被执行
因为是先createWindow()产生窗口句柄hwnd,再在SetWindowLong中通过指定新的处理函数的,所以在指定之后,如果需要执行新的消息处理函数的 WM_CREATE 里的内容,可以在子窗口类别化后,自己发送消息SendMessage(hwnd,WM_CREATE,0,0);即可执行。