问题的提出:
纯WIN32 SDK编码下,有些地方要用到窗口收发消息。为了创建一个窗口,需要提供窗口过程、注册窗口类,然后才能创建窗口并编写消息循环的驱动代码。
不想把代码搞复杂,于是经常省略窗口过程,直接使用系统已有的"STATIC"窗口类创建窗口,然后写一个简单的 GetMessage() 循环来获取窗口消息。可是发现循环代码中无论如何也不能得到WM_CREATE等等消息!
原因:
WM_CREATE WM_CLOSE WM_DESTROY WM_NCDESTROY 这些消息必须用 GetMessage() 消息驱动代码 配合 窗口过程 才能得到处理!当 GetMessage() 等待消息时,如果有这些Nonqueued Messages到达,内核会自动调用窗口过程进行处理,而不会使GetMessage()返回这些消息!也就是 GetMessage() 只会返回 Post 的消息。
[@more@]如果还是想省事,可以使用"STATIC"窗口类,并结合subclass技术。这样可以不用注册窗口类,但还是需要提供一个窗口过程处理感兴趣的消息。
HWND hWnd = CreateWindow("STATIC", ...);
WNDPROC wpOrigStaticProc = (WNDPROC)SetWindowLong(hWnd, GWL_WNDPROC, (LONG)MyMainWndProc);
default:
return CallWindowProc(wpOrigStaticProc, hwnd, uMsg, wParam, lParam);
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9844649/viewspace-1023443/ ,如需转载,请注明出处,否则将追究法律责任。