dcdd144598 2011-02-23 kinaba: #ifndef _KILIB_WINDOW_H_ dcdd144598 2011-02-23 kinaba: #define _KILIB_WINDOW_H_ dcdd144598 2011-02-23 kinaba: #include "types.h" dcdd144598 2011-02-23 kinaba: #include "memory.h" dcdd144598 2011-02-23 kinaba: #include "ktlaptr.h" dcdd144598 2011-02-23 kinaba: #ifndef __ccdoc__ dcdd144598 2011-02-23 kinaba: namespace ki { dcdd144598 2011-02-23 kinaba: #endif dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // タイムアウト付きMsgBoxの返値 dcdd144598 2011-02-23 kinaba: #define IDTIMEOUT 0 dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: //@{ @pkg ki.Window //@} dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // 窓操作用クラス dcdd144598 2011-02-23 kinaba: // dcdd144598 2011-02-23 kinaba: // 外側から、ダイアログやコントロールやプロパティシートや dcdd144598 2011-02-23 kinaba: // 普通のウインドウを全部まとめて共通に扱うためのインターフェイス。 dcdd144598 2011-02-23 kinaba: // 実際の実装は、下位クラス XxxImpl で行われている。 dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: class Window : public Object dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ メインメッセージループ //@} dcdd144598 2011-02-23 kinaba: void MsgLoop(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ メッセージを送って処理されるまで待機 //@} dcdd144598 2011-02-23 kinaba: LRESULT SendMsg( UINT msg, WPARAM wp=0, LPARAM lp=0 ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ メッセージを送ってすぐ帰る //@} dcdd144598 2011-02-23 kinaba: BOOL PostMsg( UINT msg, WPARAM wp=0, LPARAM lp=0 ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // 自動消滅機能付きメッセージボックス dcdd144598 2011-02-23 kinaba: // @param msg 表示する文字列 dcdd144598 2011-02-23 kinaba: // @param caption ダイアログの題名 dcdd144598 2011-02-23 kinaba: // @param type Win32SDKの説明を見てね dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: int MsgBox( LPCTSTR msg, LPCTSTR caption=NULL, UINT type=MB_OK ) const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ テキスト設定 //@} dcdd144598 2011-02-23 kinaba: void SetText( const TCHAR* str ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 表示 //@} dcdd144598 2011-02-23 kinaba: void ShowUp( int sw=SW_SHOW ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 移動 //@} dcdd144598 2011-02-23 kinaba: void MoveTo( int l, int t, int r, int b ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ フォーカス //@} dcdd144598 2011-02-23 kinaba: void SetFocus(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 最前面へGo! //@} dcdd144598 2011-02-23 kinaba: void SetFront(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 画面中央へGo! //@} dcdd144598 2011-02-23 kinaba: void SetCenter(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ ウインドウハンドル //@} dcdd144598 2011-02-23 kinaba: HWND hwnd() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 位置・サイズ //@} dcdd144598 2011-02-23 kinaba: void getPos( RECT* rc ) const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ サイズ //@} dcdd144598 2011-02-23 kinaba: void getClientRect( RECT* rc ) const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ メインループを回してるウインドウかどうか //@} dcdd144598 2011-02-23 kinaba: bool isMainWnd() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 生きてる? //@} dcdd144598 2011-02-23 kinaba: bool isAlive() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 未処理メッセージを適当に処理 //@} dcdd144598 2011-02-23 kinaba: static void ProcessMsg(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 最前面へGo! //@} dcdd144598 2011-02-23 kinaba: static void SetFront( HWND hwnd ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // 画面中央へGo! dcdd144598 2011-02-23 kinaba: // @param hwnd 動かすウインドウ dcdd144598 2011-02-23 kinaba: // @param rel 基準にするウインドウ dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: static void SetCenter( HWND hwnd, HWND rel=NULL ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: protected: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 何もしないコンストラクタ dcdd144598 2011-02-23 kinaba: Window(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // Hwndをセット dcdd144598 2011-02-23 kinaba: void SetHwnd( HWND wnd ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // アクセラレータを通すとかダイアログメッセージの処理とか dcdd144598 2011-02-23 kinaba: virtual bool PreTranslateMessage( MSG* ) = 0; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: HWND wnd_; dcdd144598 2011-02-23 kinaba: bool isLooping_; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: NOCOPY(Window); dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: #ifndef __ccdoc__ dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline LRESULT Window::SendMsg( UINT msg, WPARAM wp, LPARAM lp ) dcdd144598 2011-02-23 kinaba: { return ::SendMessage( wnd_, msg, wp, lp ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline BOOL Window::PostMsg( UINT msg, WPARAM wp, LPARAM lp ) dcdd144598 2011-02-23 kinaba: { return ::PostMessage( wnd_, msg, wp, lp ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline int Window::MsgBox( LPCTSTR m, LPCTSTR c, UINT y ) const dcdd144598 2011-02-23 kinaba: { return ::MessageBox( wnd_, m, c, y ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline void Window::ShowUp( int sw ) dcdd144598 2011-02-23 kinaba: { ::ShowWindow( wnd_, sw ), ::UpdateWindow( wnd_ ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline void Window::SetText( const TCHAR* str ) dcdd144598 2011-02-23 kinaba: { ::SetWindowText( wnd_, str ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline void Window::MoveTo( int l, int t, int r, int b ) dcdd144598 2011-02-23 kinaba: { ::MoveWindow( wnd_, l, t, r-l, b-t, TRUE ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline void Window::SetFocus() dcdd144598 2011-02-23 kinaba: { ::SetFocus( wnd_ ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline void Window::SetFront() dcdd144598 2011-02-23 kinaba: { SetFront( wnd_ ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline void Window::SetCenter() dcdd144598 2011-02-23 kinaba: { SetCenter( wnd_ ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline HWND Window::hwnd() const dcdd144598 2011-02-23 kinaba: { return wnd_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline bool Window::isMainWnd() const dcdd144598 2011-02-23 kinaba: { return isLooping_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline void Window::getPos( RECT* rc ) const dcdd144598 2011-02-23 kinaba: { ::GetWindowRect( wnd_, rc ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline void Window::getClientRect( RECT* rc ) const dcdd144598 2011-02-23 kinaba: { ::GetClientRect( wnd_, rc ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline bool Window::isAlive() const dcdd144598 2011-02-23 kinaba: { return FALSE != ::IsWindow( wnd_ ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: #endif // __ccdoc__ dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // IME制御マネージャ dcdd144598 2011-02-23 kinaba: // dcdd144598 2011-02-23 kinaba: // Global IME をサポートするには、ウインドウメッセージの処理を dcdd144598 2011-02-23 kinaba: // 根本的に入れ替える必要がある。そこで、処理をこのクラスにまとめ dcdd144598 2011-02-23 kinaba: // Windowクラスと連携処理を行うことで、ライブラリの外からは一切 dcdd144598 2011-02-23 kinaba: // 気にせず処理をできるようにしておく。なお、Global IMEに対応 dcdd144598 2011-02-23 kinaba: // するにはバージョンの新しいPlatform SDKが必要なため dcdd144598 2011-02-23 kinaba: // マクロ USEGLOBALIME が定義されていなければその辺は処理しない。 dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: class IMEManager dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ フォント指定 //@} dcdd144598 2011-02-23 kinaba: void SetFont( HWND wnd, const LOGFONT& lf ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 位置指定 //@} dcdd144598 2011-02-23 kinaba: void SetPos( HWND wnd, int x, int y ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 確定文字列ゲット。受け取ったら delete すること。 //@} dcdd144598 2011-02-23 kinaba: void GetString( HWND wnd, unicode** str, ulong* len ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ GlobalIMEを利用可能状態にする //@} dcdd144598 2011-02-23 kinaba: void EnableGlobalIME( bool enable ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ GlobalIMEを使えるWindowのリストを登録 //@} dcdd144598 2011-02-23 kinaba: void FilterWindows( ATOM* lst, UINT siz ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: IMEManager(); dcdd144598 2011-02-23 kinaba: ~IMEManager(); dcdd144598 2011-02-23 kinaba: void TranslateMsg( MSG* msg ); dcdd144598 2011-02-23 kinaba: LRESULT DefProc( HWND wnd, UINT msg, WPARAM wp, LPARAM lp ); dcdd144598 2011-02-23 kinaba: void MsgLoopBegin(); dcdd144598 2011-02-23 kinaba: void MsgLoopEnd(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: #ifdef USEGLOBALIME dcdd144598 2011-02-23 kinaba: IActiveIMMApp* immApp_; dcdd144598 2011-02-23 kinaba: IActiveIMMMessagePumpOwner* immMsg_; dcdd144598 2011-02-23 kinaba: #endif dcdd144598 2011-02-23 kinaba: static IMEManager* pUniqueInstance_; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: friend class Window; dcdd144598 2011-02-23 kinaba: friend class WndImpl; dcdd144598 2011-02-23 kinaba: friend void APIENTRY Startup(); dcdd144598 2011-02-23 kinaba: friend inline IMEManager& ime(); dcdd144598 2011-02-23 kinaba: NOCOPY(IMEManager); dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 唯一のIME管理オブジェクトを返す //@} dcdd144598 2011-02-23 kinaba: inline IMEManager& ime() dcdd144598 2011-02-23 kinaba: { return *IMEManager::pUniqueInstance_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // 普通のウインドウ実装 dcdd144598 2011-02-23 kinaba: // dcdd144598 2011-02-23 kinaba: // 派生クラスを定義して、コンストラクタの引数で WndImpl に dcdd144598 2011-02-23 kinaba: // WNDCLASS名やスタイルを渡し、初回なら WNDCLASS を Register dcdd144598 2011-02-23 kinaba: // して、あとは適当なタイミングで Create() という使い方を想定。 dcdd144598 2011-02-23 kinaba: // dcdd144598 2011-02-23 kinaba: // HWNDからWndImpl*への変換はx86/x86-64専用のサンクで行っています。 dcdd144598 2011-02-23 kinaba: // ので、他のアーキテクチャではこのままでは動作しません。移植 dcdd144598 2011-02-23 kinaba: // する場合は、GWL_USERDATA を使うなり clsExtra に入れるなりで dcdd144598 2011-02-23 kinaba: // もう少し汎用性のある方法に適宜変えてください。 dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: class WndImpl : public Window dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: enum { THUNK_SIZE = 22 }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ ウインドウ作成 //@} dcdd144598 2011-02-23 kinaba: bool Create( LPCTSTR wndName=NULL, HWND parent=NULL, dcdd144598 2011-02-23 kinaba: int x =CW_USEDEFAULT, int y =CW_USEDEFAULT, dcdd144598 2011-02-23 kinaba: int width =CW_USEDEFAULT, int height =CW_USEDEFAULT, dcdd144598 2011-02-23 kinaba: void* param=NULL ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ ウインドウ破棄 //@} dcdd144598 2011-02-23 kinaba: void Destroy(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: protected: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // コンストラクタ dcdd144598 2011-02-23 kinaba: // @param className ウインドウクラス名 dcdd144598 2011-02-23 kinaba: // @param style 標準スタイル dcdd144598 2011-02-23 kinaba: // @param styleEx 標準拡張スタイル dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: WndImpl( LPCTSTR className, DWORD style, DWORD styleEx=0 ); dcdd144598 2011-02-23 kinaba: ~WndImpl(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ クラス名用の型 //@} dcdd144598 2011-02-23 kinaba: typedef const TCHAR* const ClsName; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ ウインドウクラス登録 //@} dcdd144598 2011-02-23 kinaba: static ATOM Register( WNDCLASSEX* cls ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // てけとーに実装して反応してください。 dcdd144598 2011-02-23 kinaba: // on_commandは、処理しなかったらfalseを返すこと。 dcdd144598 2011-02-23 kinaba: // on_messageは、処理しなかったらWndImpl::on_messageを呼び出すこと。 dcdd144598 2011-02-23 kinaba: // PreTranslateMessageは、処理してもしなくても中で呼び出すこと。 dcdd144598 2011-02-23 kinaba: virtual void on_create( CREATESTRUCT* cs ); dcdd144598 2011-02-23 kinaba: virtual void on_destroy(); dcdd144598 2011-02-23 kinaba: virtual bool on_command( UINT id, HWND ctrl ); dcdd144598 2011-02-23 kinaba: virtual LRESULT on_message( UINT msg, WPARAM wp, LPARAM lp ); dcdd144598 2011-02-23 kinaba: virtual bool PreTranslateMessage( MSG* msg ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: static LRESULT CALLBACK StartProc( HWND, UINT, WPARAM, LPARAM ); dcdd144598 2011-02-23 kinaba: static LRESULT CALLBACK MainProc( WndImpl*, UINT, WPARAM, LPARAM ); dcdd144598 2011-02-23 kinaba: void SetUpThunk( HWND wnd ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: LPCTSTR className_; dcdd144598 2011-02-23 kinaba: const DWORD style_, styleEx_; dcdd144598 2011-02-23 kinaba: byte* thunk_; dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // ダイアログ実装 dcdd144598 2011-02-23 kinaba: // dcdd144598 2011-02-23 kinaba: // 派生クラスを定義して、コンストラクタの引数で DlgImpl に dcdd144598 2011-02-23 kinaba: // リソースIDを渡し、後は適当なタイミングで GoModal なり dcdd144598 2011-02-23 kinaba: // Modeless なり、という使い方を想定。 dcdd144598 2011-02-23 kinaba: // dcdd144598 2011-02-23 kinaba: // HWNDからDlgImpl*への変換は GWL_USERDATA で行っています。 dcdd144598 2011-02-23 kinaba: // ので、それは使わないようにしましょう。 dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: class DlgImpl : public Window dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: enum dlgtype { MODAL, MODELESS }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ モーダルで実行 //@} dcdd144598 2011-02-23 kinaba: void GoModal( HWND parent=NULL ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ モードレスで作成 //@} dcdd144598 2011-02-23 kinaba: void GoModeless( HWND parent=NULL ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 強制的に終わらせる //@} dcdd144598 2011-02-23 kinaba: void End( UINT code ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ モーダルかモードレスか //@} dcdd144598 2011-02-23 kinaba: dlgtype type() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 終了コード取得 //@} dcdd144598 2011-02-23 kinaba: UINT endcode() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: protected: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ コンストラクタ //@} dcdd144598 2011-02-23 kinaba: DlgImpl( UINT id ); dcdd144598 2011-02-23 kinaba: ~DlgImpl(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 子アイテムID→HWND変換 //@} dcdd144598 2011-02-23 kinaba: HWND item( UINT id ) const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ アイテムに対してメッセージ送信 //@} dcdd144598 2011-02-23 kinaba: LRESULT SendMsgToItem( UINT id, UINT msg, WPARAM wp=0, LPARAM lp=0 ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ アイテムに対してメッセージ送信(ポインタ送る版) //@} dcdd144598 2011-02-23 kinaba: LRESULT SendMsgToItem( UINT id, UINT msg, void* lp ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ アイテムに対してメッセージ送信(文字列送る版) //@} dcdd144598 2011-02-23 kinaba: LRESULT SendMsgToItem( UINT id, UINT msg, const TCHAR* lp ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // てけとーに実装して反応してください。 dcdd144598 2011-02-23 kinaba: // on_ok/on_cancelは、終了して良いならtrueを返すこと。 dcdd144598 2011-02-23 kinaba: // on_cmd/on_msgは、処理済みならtrueを返すこと。 dcdd144598 2011-02-23 kinaba: virtual void on_init(); dcdd144598 2011-02-23 kinaba: virtual void on_destroy(); dcdd144598 2011-02-23 kinaba: virtual bool on_ok(); dcdd144598 2011-02-23 kinaba: virtual bool on_cancel(); dcdd144598 2011-02-23 kinaba: virtual bool on_command( UINT cmd, UINT id, HWND ctrl ); dcdd144598 2011-02-23 kinaba: virtual bool on_message( UINT msg, WPARAM wp, LPARAM lp ); dcdd144598 2011-02-23 kinaba: virtual bool PreTranslateMessage( MSG* msg ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: static BOOL CALLBACK MainProc( HWND, UINT, WPARAM, LPARAM ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dlgtype type_; dcdd144598 2011-02-23 kinaba: UINT endCode_; dcdd144598 2011-02-23 kinaba: const UINT rsrcID_; dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: #ifndef __ccdoc__ dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline DlgImpl::dlgtype DlgImpl::type() const dcdd144598 2011-02-23 kinaba: { return type_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline UINT DlgImpl::endcode() const dcdd144598 2011-02-23 kinaba: { return endCode_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline HWND DlgImpl::item( UINT id ) const dcdd144598 2011-02-23 kinaba: { return ::GetDlgItem( hwnd(), id ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline LRESULT DlgImpl::SendMsgToItem dcdd144598 2011-02-23 kinaba: ( UINT id, UINT msg, WPARAM wp, LPARAM lp ) dcdd144598 2011-02-23 kinaba: { return ::SendDlgItemMessage( hwnd(), id, msg, wp, lp ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline LRESULT DlgImpl::SendMsgToItem( UINT id, UINT msg, void* lp ) dcdd144598 2011-02-23 kinaba: { return ::SendDlgItemMessage( hwnd(), id, msg, 0, dcdd144598 2011-02-23 kinaba: reinterpret_cast<LPARAM>(lp) ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline LRESULT DlgImpl::SendMsgToItem( UINT id, UINT msg, const TCHAR* lp ) dcdd144598 2011-02-23 kinaba: { return ::SendDlgItemMessage( hwnd(), id, msg, 0, dcdd144598 2011-02-23 kinaba: reinterpret_cast<LPARAM>(lp) ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: #endif // __ccdoc__ dcdd144598 2011-02-23 kinaba: } // namespace ki dcdd144598 2011-02-23 kinaba: #endif // _KILIB_WINDOW_H_