Archive for 10月 2010
地デジその後
この間ケーブルテレビを解約しろと言われて(http://wp.me/p188RX-i)、
今月末に解約することにしたんで管理会社に電話した。
TVKとMXは映るのか訊いたら、「確認します」と言われた。
ついでにダメもとでBSデジタルは映るのか訊いたら、なんと映るらしい!
BSとCSは映るようにするんだと
イヤッッホォォォオオォオウ! (AA略、崩れたorz
これでうちのVARDIAでもBSの録画ができるぜぃ!
今日の元住吉商店街
グロリアが流れてた...
ちょっと前にJ-POP()で出てきた変なアレンジの奴じゃなくて、讃美歌の奴
しかし、こないだのストパンといい、どういう基準で選曲してんだろう?
Windows LiveがWordPressに移行するから変えろと言ってきたので…
Windows LiveがWordpressに移行するから変えろと言ってきたので変えたら
CodeSnippetプラグインで書いたコードが軒並み崩れやがった
修正で気が狂いそうだ
なんかさ、相手の言ってくることまじめに対応してたらバカ見るばっかりだよね。
大体なんでWindows Liveと同じテーマがないわけ?
Visual Studio 2010 C++のラムダ関数で遊んでみた その2
Visual Studio 2010 C++のラムダ関数で遊んでみた の続き
前回のコードを改造
template <typename t_Wnd> class EventHandler { private: typedef bool(t_Wnd::*MESSAGEPROC)(HWND,WPARAM,LPARAM); typedef std::vector<std::function<bool(HWND,WPARAM,LPARAM)> > vf_t; vf_t procs; t_Wnd* m_pWnd; public: EventHandler<t_Wnd>(t_Wnd& wnd) : m_pWnd(&wnd) {} virtual EventHandler<t_Wnd>& operator +=(std::function<bool(HWND,WPARAM,LPARAM)> proc) { procs.push_back(proc); return *this; } virtual EventHandler<t_Wnd>& operator +=(MESSAGEPROC proc) { return operator+=([=](HWND hWnd,WPARAM wParam,LPARAM lParam)->bool{ return (m_pWnd->*proc)(hWnd,wParam,lParam); }); } virtual bool Invoke(HWND hWnd, WPARAM wParam, LPARAM lParam) { bool rtn = false; for (vf_t::const_iterator it = procs.begin() ; it != procs.end() ; ++it) { rtn |= (*it)(hWnd,wParam,lParam); } return rtn; } };
// メッセージマップクラス template <typename t_Wnd> class MessageMap { private: typedef std::shared_ptr<EventHandler<t_Wnd> > handler_t; std::map<UINT,handler_t> handlers; t_Wnd* m_pWnd; public: MessageMap() {} void Attach(t_Wnd& wnd) { m_pWnd = &wnd; } EventHandler<t_Wnd>& operator [](UINT message) { if ( handlers.find(message) == handlers.end() ) { handlers[message] = handler_t(new EventHandler<t_Wnd>(*m_pWnd)); } return *handlers[message]; } bool Invoke(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { if ( handlers.find(message) != handlers.end() ) { return handlers[message]->Invoke(hWnd,wParam,lParam); } else { return false; } } };
で、メインウインドウクラスを追加
// メインウインドウクラス class MainWindow { private: MessageMap<MainWindow> messageMap; public: MainWindow() { CreateMessageMap(); } bool OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam) { WORD wmId = LOWORD(wParam); WORD wmEvent = HIWORD(wParam); switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return false; } return true; } bool OnPaint(HWND hWnd,WPARAM wParam,LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; hdc = BeginPaint(hWnd, &ps); EndPaint(hWnd, &ps); return true; } bool OnDestroy(HWND hWnd,WPARAM wParam,LPARAM lParam) { PostQuitMessage(0); return true; } LRESULT WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { return messageMap.Invoke(hWnd,message,wParam,lParam) ? 0 : ::DefWindowProc(hWnd, message, wParam, lParam); } private: void CreateMessageMap() { messageMap.Attach(*this); messageMap[WM_COMMAND] += &MainWindow::OnCommand; messageMap[WM_PAINT ] += &MainWindow::OnPaint; messageMap[WM_DESTROY] += &MainWindow::OnDestroy; } };
MainWindowのグローバル変数g_Wndを作成
MainWindow g_Wnd;
WndProcからg_WndのWndProcを呼び出すようにする
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { return g_Wnd.WndProc(hWnd,message,wParam,lParam); }
コンパイル&実行
もうラムダ関数とはあんま関係ないような気もするけど...
委譲、じゃなかった以上
Visual Studio 2010 C++のラムダ関数で遊んでみた
Visual Studio 2010のC++(以下VC++10.0)でラムダ関数が使えるようになったのは既知の通り
で、とりあえず遊んでみた
VC++10.0の新規作成でWin32プロジェクトを選択、Windowアプリケーションを作成
クラスEventHandlerを作成
// イベントハンドラークラス class EventHandler{ private: typedef std::vector<std::function<bool(HWND,WPARAM,LPARAM)> > vf_t; vf_t procs; public: EventHandler() {} EventHandler& operator=(const EventHandler& src) { this->procs = src.procs; return *this; } virtual EventHandler& operator +=(std::function<bool(HWND,WPARAM,LPARAM)> proc) { procs.push_back(proc); return *this; } virtual bool Invoke(HWND hWnd, WPARAM wParam, LPARAM lParam) { bool rtn = false; for (vf_t::const_iterator i = procs.begin() ; i != procs.end() ; ++i) { rtn |= (*i)(hWnd,wParam,lParam); } return rtn; } };
クラスMessageMapを作成
class MessageMap { private: typedef std::map<UINT,EventHandler> proc_t; proc_t g_procs; public: MessageMap() {} MessageMap& Add(UINT message,std::function<bool(HWND,WPARAM,LPARAM)> func) { if ( g_procs.find(message) == g_procs.end() ) { g_procs[message] = EventHandler(); } g_procs[message] += func; return *this; } bool Invoke(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { if ( g_procs.find(message) != g_procs.end() ) { return g_procs[message].Invoke(hWnd,wParam,lParam); } else { return false; } } };
で、グローバル変数g_MessageMapを宣言
MessageMap g_MessageMap;
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { if ( !g_MessageMap.Invoke(hWnd,message,wParam,lParam)) { return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
(もともとWndProcの中にあった処理を移しただけ(^^;)
// WM_COMMANDメッセージのイベントハンドラーを追加 g_MessageMap.Add(WM_COMMAND,[](HWND hwnd,WPARAM wParam,LPARAM lParam)-> bool{ WORD wmId = LOWORD(wParam); WORD wmEvent = HIWORD(wParam); switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hwnd, About); break; case IDM_EXIT: DestroyWindow(hwnd); break; default: return false; } return true;}); // WM_PAINTメッセージのイベントハンドラーを追加 g_MessageMap.Add(WM_PAINT,[](HWND hWnd,WPARAM wParam,LPARAM lParam)-> bool{ PAINTSTRUCT ps; HDC hdc; hdc = BeginPaint(hWnd, &ps); EndPaint(hWnd, &ps); return true;}); // WM_DESTROYメッセージのイベントハンドラーを追加 g_MessageMap.Add(WM_DESTROY,[](HWND hWnd,WPARAM wParam,LPARAM lParam)-> bool{ PostQuitMessage(0); return true;});
これをコンパイル&実行
見事ラムダ関数で追加したWM_COMMANDのイベントハンドラーが実行された
ま、これが何の役に立つのかは知らんが...