File Annotation

Not logged in
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_