では続きます。
前回の最後に出てきたクラス CWndProc ですが、こいつは HWND 型プロパティ hWnd を持つ CstdWnd というクラスを継承する、
CstdWndProc というクラスを継承します。
さて、CstdWndProc クラスが継承先にオーバーライドを要求するメソッドとして、もちろん、最初に挙げた mWndProc(ProcParam) 仮想メソッドがあります。
その他、CstdWndProc クラスはプロパティとして、ウィンドウプロシージャが持つ4つの引数のうち、
WPARAM wParam;
LPARAM lParam;
LPARAM lParam;
の2つを持ちます。以上のことから、mWndProc(ProcParam) メソッドは次のように、
HRESULT CWndProc::mWndProc(ProcParam){
hWnd=hwnd; wParam=wP; lParam=lP; switch(uMsg){
…
default:
return CstdWndProc::mWndProc(ProcArgs);
}
return 0;
return CstdWndProc::mWndProc(ProcArgs);
}
return 0;
}
と書くことになります。あ、このことから分かるように、
#define ProcParam HWND hwnd, UINT uMsg, WPARAM wP, LPARAM lP
#define ProcArgs hwnd, uMsg, wP, lP
#define ProcArgs hwnd, uMsg, wP, lP
という風にマクロが定義されています。
基底の CstdWndProc::mWndProc(ProcArgs) には、
void CstdWndProc::onWmCreate(void){
}
void CstdWndProc::onWmDestroy(void){
PostQuitMessage(0);
}
HRESULT CstdWndProc::mWndProc(ProcParam){
MessageSwitch{
case WM_CREATE:
onWmCreate();
break;
case WM_DESTROY:
onWmDestroy();
break;
default :
return DefWindowProc(ProcArgs);
}
return 0;
}
}
void CstdWndProc::onWmDestroy(void){
PostQuitMessage(0);
}
HRESULT CstdWndProc::mWndProc(ProcParam){
MessageSwitch{
case WM_CREATE:
onWmCreate();
break;
case WM_DESTROY:
onWmDestroy();
break;
default :
return DefWindowProc(ProcArgs);
}
return 0;
}
というように定義がされており、何もしない mWmCreate() メソッドと暴走機関車にならないために最低限必要となる
PostQuitMessage() 関数を実行する mWmDestroy() メソッドが既に定義されています。
以上のことから、ここまではウィンドウクラス登録とウィンドウ作成を除いて定型文となります。
ここから先は、mWndProc() メソッドのオーバーライドの作業となり、uMsg の値によって分岐させ、
そのたびに対応するメソッドを定義するという作業を繰り返すことになります。
続く