windows 编程 之 问题解决笔记

时间:2021-10-06 09:16:18

问题目录:

  • 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);即可执行。