【发布时间】:2015-07-13 22:40:10
【问题描述】:
我决定使用这样的基类来创建和使用窗口:
class Window
{
private:
static LRESULT WINAPI WindowProc(HWND _hWnd, UINT _uMsg, WPARAM _wParam, LPARAM _lParam);
protected:
virtual LRESULT onMessageNameGoesHere(/*parameters*/)
{
// Default handling
};
public:
// Other functions
};
所以所有的窗口都继承自这个类。这是WindowProc。
LRESULT WINAPI Window::WindowProc(HWND _hWnd, UINT _uMsg, WPARAM _wParam, LPARAM _lParam)
{
Window *window = (Window*)GetWindowLongPtr(_hWnd, GWLP_USERDATA);
switch (_uMsg)
{
case WM_SOMEMESSAGE:
return window->onMessageNameGoesHere();
case WM_NCCREATE:
SetWindowLongPtr(_hWnd, GWLP_USERDATA, LONG(LPCREATESTRUCT(_lParam)->lpCreateParams));
return true;
case WM_GETMINMAXINFO:
return window->onGetMinMaxInfo((LPMINMAXINFO)_lParam);
default:
return DefWindowProc(_hWnd, _uMsg, _wParam, _lParam);
}
}
WM_NCCREATE 存储了一个指向与GWLP_USERDATA 中的窗口关联的类的指针。问题是在WM_NCCREATE 之前收到WM_GETMINMAXINFO,使其崩溃。 (是的,我知道我需要一些代码来避免这种情况)
那么有没有办法在没有WM_GETMINMAXINFO 的情况下设置最小和最大窗口大小,或者可以在WM_NCCREATE 之前发送该消息?
请随时询问更多细节或更多解释。
【问题讨论】:
-
@HansPassant 这不是我的机器。只是谷歌它。
WM_GETMINMAXINFO是第一条消息。看看这个:stackoverflow.com/questions/1741296/… 和 gamedev.net/topic/323415-first-win32-message-sent