class SArea { protect: HWND h_Wnd; public: virtual HWND CreateSArea(LPCTSTR wndName,DWORD dwStyle,int x,int y,int w,int h,HWND hParent); static LRESULT CALLBACK SAreaProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ); virtual void SProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ); }; HWND SArea::CreateSArea(LPCTSTR wndName, DWORD dwStyle, int x, int y, int w,int h,HWND hParent) { WNDCLASS wc; .....//初始化wc并将SArea::SAreaProc函数设为处理函数 ::RegisterClass(&wc); h_Wnd=::CreateWindow(..........); if(h_Wnd) ::SetWindowLong(h_Wnd,GWL_USERDATA,(LONG)this);//将this指针传给窗口 return h_Wnd; }
LRESULT CALLBACK SArea::SAreaProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { SArea* pArea=NULL; if(message!=WM_NCCREATE && message !=WM_CREATE)qude//取得刚才传入的指针 pArea=(SArea*)::GetWindowLong(hWnd,GWL_USERDATA); if(pArea)//利用该指针调用你想用的某类实例的成员 pArea->SProc(hWnd,message,wParam,lParam); return ::DefWindowProc(hWnd,message,wParam,lParam); } void SArea::SProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { ......... } |