诉诸thunk或tls?在这种情况下,我不知道thunk是什么意思,但它很容易 - 如果只是有点复杂 - 将一个窗口引导到一个C++类包装器中。
class UserWindow
{
HWND _hwnd;
public:
operator HWND(){
return _hwnd;
}
UserWindow():_hwnd(0){}
~UserWindow(){
if(_hwnd){
SetWindowLongPtr(GWL_USERDATA,0);
DestroyWindow(_hwnd);
}
static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
UserWindow* self = 0;
if(uMsg == WM_CREATE)
{
LPCREATESTRUCT crst = (LPCREATESTRUCT)lParam;
self = (Window*)crst->lpCreateParams;
SetWindowLongPtr(hwnd,GWL_USERDATA,(LONG_PTR)self);
self->_hwnd = hwnd;
}
else
self = (Window*)GetWindowLongPtr(hwnd,GWL_USERDATA);
if(self){
LRESULT lr = self->WndProc(uMsg,wParam,lParam);
if(uMsg == WM_DESTROY){
if(self = (Window*)GetWindowLongPtr(hwnd,GWL_USERDATA))
self->_hwnd = NULL;
}
return lr;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
HWND Create(int x, int y, int w, int h, LPCTSTR pszTitle,DWORD dwStyle,DWORD dwStyleEx,LPCTSTR pszMenu,HINSTANCE hInstance, HWND hwndParent){
WNDCLASSEX wcex = { sizeof (wcex),0};
if(!GetClassInfo(hInstance,ClassName(),&wcex)){
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WindowndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.lpszClassName = ClassName();
OnCreatingClass(wcex);
RegisterClassEx(&wcex);
}
return CreateWindowEx(dwStyleEx, ClassName(), pszTitle, dwStyle, x, y, w, h, hwndParent, pszMenu, hInstance, this);
}
// Functions to override
virtual LPCTSTR ClassName(){
return TEXT("USERWINDOW");
}
virtual LRESULT WindowProc(UINT uMsg, WPARAM wParam,LPARAM lParam){
return DefWindowProc(uMsg,wParam,lParam);
}
virtual void Window::OnCreatingClass(WNDCLASSEX& wcex){
wcex.hCursor = LoadCursor(NULL,IDC_ARROW);
}
};
这一切都有点复杂,但这意味着窗口可以通过删除类或通过销毁来安全销毁。在WM_CREATE将GWL_USERDATA设置为“this”之前,在调用CreateWindow期间发送一个或两个调整大小相关的消息,但实际上它们没有任何影响。窗口类在第一次实例化时自动创建。
一件事在第一次调用此式自动类注册的创建不支持是这种类型的窗口作为一个对话框控件的实例 - 为了支持这种情况下的事情都需要整体转换被改变...提供一个静态类注册函数...在静态WM_CREATE处理程序中的“新MyClass”...它对我来说不是显而易见的,这可以以框架类型的方式完成。
ATL的[WTL扩展](http://wtl.sourceforge.net/)也很有用,因为它们添加了更多控件,RAII封装了GDI对象,框架窗口等等。 – holtavolt 2015-05-28 02:28:54