次に軽くイベント処理を実装したいと思います。
Win32 GUI Genericsでは、イベント処理を実装するには、ライブラリで用意されているさまざまなWIndowラッパを継承した実装クラスを作成します。今回はsdi_frameを継承し、main_frameを作成することにします。
さらに、event_handlerクラスを継承したイベントハンドラに、イベント処理を実装します。(main_frame.h,main_frame.cpp)
#pragma once /** @file#include "stdafx.h" using namespace win32::gui; namespace sf { namespace view { /** フレームウィンドウ / struct main_frame : wnd_extend<sdi_frame,main_frame> { typedef wnd_extend<sdi_frame,main_frame> app_base; main_frame( const string & title) : app_base(title) {}; }; } }
- @brief CMessageLoopContainer
- @author S.F. (Satoshi Fujiwara) /
>Win32 GUI Genericsでは、イベントハンドラは別クラスとなっており、WTLのようなメッセージマップをUIクラスにゴリゴリと書かなくてよいので、ヘッダファイルがとてもすっきりしています。#include "stdafx.h" #include ".\main_frame.h" namespace sf { namespace view { struct main_event : event_handler<main_event,sdi_frame,main_frame> { main_event() {}; // About Boxの表示 handle_event on_about() { create_modal_dlg<dialog>( window(), create_info().id(IDD_ABOUTBOX) ).wait(); return command<IDM_ABOUT>().HANDLED_BY(&me::on_about); } handle_event on_exit() { PostQuitMessage(0); return command<IDM_EXIT>().HANDLED_BY(&me::on_exit); } }; } }
面白いのが、メンバ関数の戻り値です。
return command<IDM_EXIT>().HANDLED_BY(&me::on_exit);なんですか、これは。
Let's Boostに、この部分に関する重要なヒントが書かれてありましたので引用しますと、
激しくGenerativeなWin32GUIラッパーです。Boost-devで触れられてたので紹介。だそうです。
「templateのインスタンス化を利用してイベントハンドラ関数の内部でイベントハンドラを登録する」という、知らないと卵が先か鶏が先か迷うようなハンドラ登録テクニックが斬新。