實現方法:
用類的一個static函數作真正的處理函數,在該函數中調用另一個非static的函數進行處理。
困難:
static函數不能直接調用非static的函數。
技巧:
在創建好窗口後立即利用SetWindowLong函數將類實例的指針傳給窗口。
在static的處理函數中利用GetWindowLong函數取出該指針。
然後就可以通過該指針調用非static的處理函數了。
例子:
原因:static 修飾的函數相當於全局函數,因此在函數運行中this指針無效,也就是說該函數的運行沒有針對某個具體的類實例,所以也就不能用某個類中的非static 成員變量。
如果你是想用static修飾的函數(如WinProc)作為窗口的處理函數的話,有解決方法:
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)
{
.........
}