訴諸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