引き続き、ウィンドウラッパー部分を改良している。
ウィンドウプロシージャとダイアログプロシージャのコンパイル時の識別方法について
DLGPROCとWNDPROCが型として識別できない問題は識別できるように新たに各プロシージャを識別するための定義を行って対応することにした。
// ウィンドウプロシージャの識別用クラス
struct wndproc
{
typedef WNDPROC proc_type;
typedef LRESULT return_type;
static inline return_type def_wnd_proc(HWND hwnd,uint32_t message, WPARAM wParam, LPARAM lParam)
{
return ::DefWindowProcW(hwnd,message,wParam,lParam);
}
};
// ダイアログプロシージャの識別用クラス
struct dlgproc
{
typedef DLGPROC proc_type;
typedef INT_PTR return_type;
static inline return_type def_wnd_proc(HWND hwnd,uint32_t message, WPARAM wParam, LPARAM lParam)
{
return FALSE;
}
};
/** window ベースクラス */
template <typename ProcType = wndproc>
struct base_win32_window : public base_window
{
typedef ProcType proc_t;
typedef typename proc_t::return_type result_t;
operator HWND() const {return hwnd_;};
.
.
.
デフォルトイベントハンドラは下記のように記述している。
// デフォルトウィンドウメッセージハンドラ
virtual result_t on_nccreate(CREATESTRUCT *p) { return std::is_same<proc_t,wndproc>::value?1:FALSE;}
virtual result_t on_create(CREATESTRUCT *p) { return std::is_same<proc_t,wndproc>::value?0:FALSE;}
virtual result_t on_init_dialog(HWND default_focus_ctrl,LPARAM data) {return TRUE;}
virtual result_t on_size(uint32_t flag,uint32_t width,uint32_t height) {return std::is_same<proc_t,wndproc>::value?0:FALSE;}
.
.
.
HWNDとC++クラスインスタンスの結びつけ方法の改良
thunkを使って実装しているが今の実装では同じウィンドウクラスのウィンドウを2つ以上作ることができなかったので、できるようにHiloなどを参考に改良した。
今の状態は何もないウィンドウを表示できるレベル。