리조트 썽크 또는 tls? 이 경우 썽크가 무슨 의미인지는 알지 못하지만, 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를 호출하는 동안 보내지는 하나 또는 두 개의 크기 조정 관련 메시지가 있지만 실제적으로 아무런 결과가 없습니다. 창 클래스는 창을 처음으로 인스턴스화 할 때 자동으로 만들어집니다. 첫 번째 호출에 자동 클래스 등록이 스타일은 지원하지 않습니다 만드는
한 가지 대화 상자의 컨트롤로 윈도우의 이러한 유형의 실체화 -이 경우를 필요 사물의 늪 전체를 지원하기 위해 변경할 수 있습니다 ... 정적 클래스 등록 함수를 제공합니다 ... "새 MyClass"정적 WM_CREATE 처리기에서 ... 그게 나에게 분명하지 않습니다 어떻게 Frameworkish 형식 패션에서 할 수 있습니다.
ATL에 대한 [WTL extensions (http://wtl.sourceforge.net/)]는 컨트롤, GDI 개체의 RAII 캡슐화, 프레임 윈도우 등을 추가하므로 유용합니다. – holtavolt