File Annotation

Not logged in
13b7203622 2011-02-23        kinaba: //--- K.I.LIB ---
13b7203622 2011-02-23        kinaba: // kl_wnd.cpp : window information manager
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: #include "stdafx.h"
13b7203622 2011-02-23        kinaba: #include "kilib.h"
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //-------- Windowを作成時に HWND に kiWindow* をセットするための処理 -------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: kiWindow* kiWindow::st_pCurInit = NULL;
13b7203622 2011-02-23        kinaba:     HHOOK kiWindow::st_hHook    = NULL;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void kiWindow::init()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	// CreateWindow 用フック設置
13b7203622 2011-02-23        kinaba: 	st_hHook = ::SetWindowsHookEx( WH_CBT, &CBTProc, NULL, ::GetCurrentThreadId() );
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void kiWindow::finish()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	// CreateWindow 用フック解除
13b7203622 2011-02-23        kinaba: 	::UnhookWindowsHookEx( st_hHook );
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: LRESULT CALLBACK kiWindow::CBTProc( int code, WPARAM wp, LPARAM lp )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( code == HCBT_CREATEWND )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		if( st_pCurInit )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			// k.i.lib のウインドウが CreateWindow された場合
13b7203622 2011-02-23        kinaba: 			st_pCurInit->setHwnd( (HWND)wp );
13b7203622 2011-02-23        kinaba: 			::SetWindowLong( (HWND)wp, GWL_USERDATA, (LONG)st_pCurInit );
13b7203622 2011-02-23        kinaba: 			st_pCurInit = NULL;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 		else
13b7203622 2011-02-23        kinaba: 			::SetWindowLong( (HWND)wp, GWL_USERDATA, 0 );
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	return ::CallNextHookEx( st_hHook, code, wp, lp );
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void kiWindow::detachHwnd()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	::SetWindowLong( hwnd(), GWL_USERDATA, 0 );
13b7203622 2011-02-23        kinaba: 	if( this == app()->mainwnd() )
13b7203622 2011-02-23        kinaba: 		app()->setMainWnd( NULL );
13b7203622 2011-02-23        kinaba: 	setHwnd( NULL );
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //------------ Window にまつわるエトセトラな処理 (static) ---------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: bool kiWindow::loopbreaker = false;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void kiWindow::msg()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	for( MSG msg; ::PeekMessage( &msg,NULL,0,0,PM_REMOVE ); )
13b7203622 2011-02-23        kinaba: 		::TranslateMessage( &msg ), ::DispatchMessage( &msg );
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void kiWindow::msgLoop( msglooptype type )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	kiWindow* wnd;
13b7203622 2011-02-23        kinaba: 	MSG msg;
13b7203622 2011-02-23        kinaba: 	while( !loopbreaker &&
13b7203622 2011-02-23        kinaba: 		  type==GET ?  ::GetMessage( &msg,NULL,0,0 )
13b7203622 2011-02-23        kinaba: 					: ::PeekMessage( &msg,NULL,0,0,PM_REMOVE ) )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		if( wnd = app()->mainwnd() )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			if( wnd->m_hAccel )
13b7203622 2011-02-23        kinaba: 				if( ::TranslateAccelerator( wnd->hwnd(), wnd->m_hAccel, &msg ) )
13b7203622 2011-02-23        kinaba: 					continue;
13b7203622 2011-02-23        kinaba: 			if( msg.message!=WM_CHAR && wnd->isDlgMsg( &msg ) )
13b7203622 2011-02-23        kinaba: 				continue;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 		::TranslateMessage( &msg ), ::DispatchMessage( &msg );
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	loopbreaker = false;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void kiWindow::setFront( HWND wnd )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	const OSVERSIONINFO& v = app()->osver();
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// Win2000 以上 or Win98 以上
13b7203622 2011-02-23        kinaba: 	if( ( v.dwPlatformId==VER_PLATFORM_WIN32_NT && v.dwMajorVersion>=5 )
13b7203622 2011-02-23        kinaba: 	 || ( v.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS &&
13b7203622 2011-02-23        kinaba: 							v.dwMajorVersion*100+v.dwMinorVersion>=410 ) )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		DWORD pid;
13b7203622 2011-02-23        kinaba: 		DWORD th1 = ::GetWindowThreadProcessId( ::GetForegroundWindow(), &pid );
13b7203622 2011-02-23        kinaba: 		DWORD th2 = ::GetCurrentThreadId();
13b7203622 2011-02-23        kinaba: 		::AttachThreadInput( th2, th1, TRUE );
13b7203622 2011-02-23        kinaba: 		::SetForegroundWindow( wnd );
13b7203622 2011-02-23        kinaba: 		::AttachThreadInput( th2, th1, FALSE );
13b7203622 2011-02-23        kinaba: 		::BringWindowToTop( wnd );
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	else  // 古いWin
13b7203622 2011-02-23        kinaba: 		::SetForegroundWindow( wnd );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// Special Thanks To kazubon !! ( the author of TClock )
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void kiWindow::setCenter( HWND wnd, HWND rel )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	RECT rc,pr;
13b7203622 2011-02-23        kinaba: 	::GetWindowRect( wnd, &rc );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	if( rel )
13b7203622 2011-02-23        kinaba: 		::GetWindowRect( rel, &pr );
13b7203622 2011-02-23        kinaba: 	else
13b7203622 2011-02-23        kinaba: 		::SystemParametersInfo( SPI_GETWORKAREA, 0, &pr, 0 );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	::SetWindowPos( wnd, 0,
13b7203622 2011-02-23        kinaba: 		pr.left + ( (pr.right-pr.left)-(rc.right-rc.left) )/2,
13b7203622 2011-02-23        kinaba: 		pr.top  + ( (pr.bottom-pr.top)-(rc.bottom-rc.top) )/2,
13b7203622 2011-02-23        kinaba: 		0, 0, SWP_NOSIZE|SWP_NOZORDER );
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //------------------ Windowベースクラスとしての処理 ----------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: kiWindow::kiWindow()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	m_hWnd = NULL;
13b7203622 2011-02-23        kinaba: 	m_hAccel = NULL;
13b7203622 2011-02-23        kinaba: 	app()->shellInit();
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: kiWindow::~kiWindow()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( m_hWnd && ::IsWindow( m_hWnd ) )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		::SetWindowLong( m_hWnd, GWL_USERDATA, 0 );
13b7203622 2011-02-23        kinaba: 		::DestroyWindow( m_hWnd );
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void kiWindow::loadAccel( UINT id )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	m_hAccel = ::LoadAccelerators( app()->inst(), MAKEINTRESOURCE(id) );
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //---------------- スタンドアロンのWindowの処理 ---------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: // …未完成…
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //---------------------------- Dialog -----------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: kiDialog::kiDialog( UINT id )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	m_Rsrc = id;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void kiDialog::doModal( HWND parent )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	setState( true );
13b7203622 2011-02-23        kinaba: 	preCreate( this );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	::DialogBoxParam( app()->inst(), MAKEINTRESOURCE(m_Rsrc),
13b7203622 2011-02-23        kinaba: 						parent, commonDlg, (LPARAM)this );
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void kiDialog::createModeless( HWND parent )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	setState( false );
13b7203622 2011-02-23        kinaba: 	preCreate( this );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	::CreateDialogParam( app()->inst(), MAKEINTRESOURCE(m_Rsrc),
13b7203622 2011-02-23        kinaba: 						parent, commonDlg, (LPARAM)this );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	::ShowWindow( hwnd(), SW_SHOW );
13b7203622 2011-02-23        kinaba: 	::UpdateWindow( hwnd() );
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void kiDialog::end( UINT endcode )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	setEndCode( endcode );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	if( isModal() )
13b7203622 2011-02-23        kinaba: 		::EndDialog( hwnd(), getEndCode() );
13b7203622 2011-02-23        kinaba: 	else
13b7203622 2011-02-23        kinaba: 		::DestroyWindow( hwnd() );
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: BOOL kiDialog::commonDlg( HWND dlg, UINT msg, WPARAM wp, LPARAM lp )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	// kiDialog インターフェイスへのポインタを取得
13b7203622 2011-02-23        kinaba: 	kiDialog* ptr = (kiDialog*)::GetWindowLong( dlg, GWL_USERDATA );
13b7203622 2011-02-23        kinaba: 	if( !ptr ) return FALSE;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// WM_INITDIALOG なら onInit を呼ぶ
13b7203622 2011-02-23        kinaba: 	if( msg == WM_INITDIALOG )
13b7203622 2011-02-23        kinaba: 		return ptr->onInit();
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// OK / Cancel 処理
13b7203622 2011-02-23        kinaba: 	else if( msg == WM_COMMAND )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		switch( LOWORD(wp) )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 		case IDOK:
13b7203622 2011-02-23        kinaba: 			if( ptr->onOK() )
13b7203622 2011-02-23        kinaba: 				ptr->end( IDOK );
13b7203622 2011-02-23        kinaba: 			return TRUE;
13b7203622 2011-02-23        kinaba: 		case IDCANCEL:
13b7203622 2011-02-23        kinaba: 			if( ptr->onCancel() )
13b7203622 2011-02-23        kinaba: 				ptr->end( IDCANCEL );
13b7203622 2011-02-23        kinaba: 			return TRUE;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// 普通のメッセージ
13b7203622 2011-02-23        kinaba: 	BOOL ans = ptr->proc( msg, wp, lp );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// WM_DESTORY ならウインドウハンドル切り離し
13b7203622 2011-02-23        kinaba: 	if( msg == WM_DESTROY )
13b7203622 2011-02-23        kinaba: 		ptr->detachHwnd();
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	return ans;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //------------------------ PropertySheet -------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: kiPropSheet* kiPropSheet::st_CurInitPS = NULL;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: kiPropSheet::kiPropSheet() : kiDialog( 0 )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	ki_memzero( &m_Header, sizeof(m_Header) );
13b7203622 2011-02-23        kinaba: 	m_Header.dwSize      = sizeof(m_Header);
13b7203622 2011-02-23        kinaba: 	m_Header.dwFlags     |=PSH_USECALLBACK | PSH_PROPSHEETPAGE;
13b7203622 2011-02-23        kinaba: 	m_Header.pfnCallback = main_initProc;
13b7203622 2011-02-23        kinaba: 	m_Header.hInstance   = app()->inst();
13b7203622 2011-02-23        kinaba: 	m_Header.nStartPage  = 0;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void kiPropSheet::begin()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	int l = m_Pages.len();
13b7203622 2011-02-23        kinaba: 	PROPSHEETPAGE* ppsp = new PROPSHEETPAGE[ l ];
13b7203622 2011-02-23        kinaba: 	ki_memzero( ppsp, sizeof(PROPSHEETPAGE)*l );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	for( int i=0; i<l; i++ )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		ppsp[i].dwSize      = sizeof( PROPSHEETPAGE );
13b7203622 2011-02-23        kinaba: 		ppsp[i].hInstance   = app()->inst();
13b7203622 2011-02-23        kinaba: 		ppsp[i].pfnCallback = page_initProc;
13b7203622 2011-02-23        kinaba: 		ppsp[i].pfnDlgProc  = page_cmmnProc;
13b7203622 2011-02-23        kinaba: 		ppsp[i].dwFlags     = PSP_USECALLBACK | PSP_HASHELP;
13b7203622 2011-02-23        kinaba: 		m_Pages[i]->setInfo( ppsp+i );
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	m_Header.ppsp   = ppsp;
13b7203622 2011-02-23        kinaba: 	m_Header.nPages = l;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	st_CurInitPS = this;
13b7203622 2011-02-23        kinaba: 	PropertySheet( &m_Header );
13b7203622 2011-02-23        kinaba: 	delete [] ppsp;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void kiPropSheet::doModal( HWND parent )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	m_Header.dwFlags &= (~PSH_MODELESS);
13b7203622 2011-02-23        kinaba: 	setState( true );
13b7203622 2011-02-23        kinaba: 	begin();
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void kiPropSheet::createModeless( HWND parent )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	m_Header.dwFlags |= PSH_MODELESS;
13b7203622 2011-02-23        kinaba: 	setState( false );
13b7203622 2011-02-23        kinaba: 	begin();
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void kiPropSheet::end( UINT endcode )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	// 終了コードセット
13b7203622 2011-02-23        kinaba: 	setEndCode( endcode );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// サブクラス化解除
13b7203622 2011-02-23        kinaba: 	::SetWindowLong( hwnd(), GWL_WNDPROC, (LONG)m_DefProc );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// 終了
13b7203622 2011-02-23        kinaba: 	if( isModal() ) // サブクラス化解除してるので、再度 end が呼ばれることはないはず。
13b7203622 2011-02-23        kinaba: 		::PostMessage( hwnd(), WM_COMMAND, IDCANCEL, 0 );
13b7203622 2011-02-23        kinaba: 	else
13b7203622 2011-02-23        kinaba: 		::DestroyWindow( hwnd() );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// WM_DESTROY時相当の動作
13b7203622 2011-02-23        kinaba: 	detachHwnd();
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: LRESULT CALLBACK kiPropSheet::main_cmmnProc( HWND dlg, UINT msg, WPARAM wp, LPARAM lp )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	kiPropSheet* ptr = (kiPropSheet*)::GetWindowLong( dlg, GWL_USERDATA );
13b7203622 2011-02-23        kinaba: 	if( !ptr )
13b7203622 2011-02-23        kinaba: 		return 0;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// まずデフォルトの処理
13b7203622 2011-02-23        kinaba: 	LRESULT result = ::CallWindowProc( ptr->m_DefProc, dlg, msg, wp, lp );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// ×ボタンはキャンセル扱い
13b7203622 2011-02-23        kinaba: 	if( msg==WM_SYSCOMMAND && wp==SC_CLOSE )
13b7203622 2011-02-23        kinaba: 		::PostMessage( dlg, WM_COMMAND, IDCANCEL, 0 );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// コマンド処理
13b7203622 2011-02-23        kinaba: 	else if( msg==WM_COMMAND )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		switch( LOWORD(wp) )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 		case IDOK:
13b7203622 2011-02-23        kinaba: 			if( ptr->onOK() )
13b7203622 2011-02-23        kinaba: 				ptr->end( IDOK );
13b7203622 2011-02-23        kinaba: 			return TRUE;
13b7203622 2011-02-23        kinaba: 		case IDCANCEL:
13b7203622 2011-02-23        kinaba: 			if( ptr->onCancel() )
13b7203622 2011-02-23        kinaba: 				ptr->end( IDCANCEL );
13b7203622 2011-02-23        kinaba: 			return TRUE;
13b7203622 2011-02-23        kinaba: 		case IDAPPLY:
13b7203622 2011-02-23        kinaba: 			ptr->onApply();
13b7203622 2011-02-23        kinaba: 			break;
13b7203622 2011-02-23        kinaba: 		case ID_KIPS_HELP:
13b7203622 2011-02-23        kinaba: 			ptr->onHelp();
13b7203622 2011-02-23        kinaba: 			break;
13b7203622 2011-02-23        kinaba: 		default:
13b7203622 2011-02-23        kinaba: 			ptr->onCommand( LOWORD(wp) );
13b7203622 2011-02-23        kinaba: 			break;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// ドラッグ&ドロップ
13b7203622 2011-02-23        kinaba: 	else if( msg==WM_DROPFILES )
13b7203622 2011-02-23        kinaba: 		ptr->onDrop( (HDROP)wp );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	return result;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: struct DLGTEMPLATEEX
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba:     WORD dlgVer;
13b7203622 2011-02-23        kinaba:     WORD signature;
13b7203622 2011-02-23        kinaba:     DWORD helpID;
13b7203622 2011-02-23        kinaba:     DWORD exStyle;
13b7203622 2011-02-23        kinaba:     DWORD style;
13b7203622 2011-02-23        kinaba:     WORD cDlgItems;
13b7203622 2011-02-23        kinaba:     short x;
13b7203622 2011-02-23        kinaba:     short y;
13b7203622 2011-02-23        kinaba:     short cx;
13b7203622 2011-02-23        kinaba:     short cy;
13b7203622 2011-02-23        kinaba: };
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: int CALLBACK kiPropSheet::main_initProc( HWND dlg, UINT msg, LPARAM lp )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( msg == PSCB_PRECREATE )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		// スタイルを指すDWORDのアドレスを取得
13b7203622 2011-02-23        kinaba: 		DWORD* pst = ( 0xffff==((DLGTEMPLATEEX*)lp)->signature ) ?
13b7203622 2011-02-23        kinaba: 						&(((DLGTEMPLATEEX*)lp)->style) : &(((DLGTEMPLATE*)lp)->style);
13b7203622 2011-02-23        kinaba: 		// ヘルプボタンを消して最小化ボタンを付ける
13b7203622 2011-02-23        kinaba: 		(*pst) &= ~DS_CONTEXTHELP;
13b7203622 2011-02-23        kinaba: 		(*pst) |=  WS_MINIMIZEBOX;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		preCreate( st_CurInitPS );
13b7203622 2011-02-23        kinaba:     }
13b7203622 2011-02-23        kinaba: 	else if( msg == PSCB_INITIALIZED )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		// 何故か出来てしまう余計なメニューを削除
13b7203622 2011-02-23        kinaba: 		HMENU sysm = ::GetSystemMenu( dlg, FALSE );
13b7203622 2011-02-23        kinaba: 		::DeleteMenu( sysm, SC_SIZE, MF_BYCOMMAND );
13b7203622 2011-02-23        kinaba: 		::DeleteMenu( sysm, SC_MAXIMIZE, MF_BYCOMMAND );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		// 起動時はウインドウを必ず前面へ
13b7203622 2011-02-23        kinaba: 		setFront( dlg );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		//サブクラス化する
13b7203622 2011-02-23        kinaba: 		st_CurInitPS->m_DefProc = (WNDPROC)::SetWindowLong( dlg, GWL_WNDPROC, (LONG)main_cmmnProc );
13b7203622 2011-02-23        kinaba: 		st_CurInitPS->onInit();
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	return 0;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: BOOL kiPropSheet::page_cmmnProc( HWND dlg, UINT msg, WPARAM wp, LPARAM lp )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	kiPropSheetPage* ptr = (kiPropSheetPage*)::GetWindowLong( dlg, GWL_USERDATA );
13b7203622 2011-02-23        kinaba: 	if( !ptr )
13b7203622 2011-02-23        kinaba: 		return FALSE;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// ここで、共通処理
13b7203622 2011-02-23        kinaba: 	switch( msg )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 	case WM_INITDIALOG:
13b7203622 2011-02-23        kinaba: 		return ptr->onInit();
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	case WM_NOTIFY:
13b7203622 2011-02-23        kinaba: 		switch( ((NMHDR*)lp)->code )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 		case PSN_APPLY:
13b7203622 2011-02-23        kinaba: 			ptr->onOK();
13b7203622 2011-02-23        kinaba: 			return TRUE;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 		break;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	case WM_COMMAND:
13b7203622 2011-02-23        kinaba: 		if( lp )
13b7203622 2011-02-23        kinaba: 			switch( HIWORD(wp) )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 			case BN_CLICKED:
13b7203622 2011-02-23        kinaba: 			if((HWND)lp==::GetFocus())
13b7203622 2011-02-23        kinaba: 			case EN_CHANGE:
13b7203622 2011-02-23        kinaba: 			case CBN_SELCHANGE:
13b7203622 2011-02-23        kinaba: 				PropSheet_Changed( ptr->parent()->hwnd(), dlg );
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 		break;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	case WM_DESTROY:
13b7203622 2011-02-23        kinaba: 		BOOL ans=ptr->proc( msg, wp, lp );
13b7203622 2011-02-23        kinaba: 		ptr->detachHwnd();
13b7203622 2011-02-23        kinaba: 		return ans;
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	return ptr->proc( msg, wp, lp );
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: UINT CALLBACK kiPropSheet::page_initProc( HWND dlg, UINT msg, LPPROPSHEETPAGE ppsp )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( msg == PSPCB_CREATE )
13b7203622 2011-02-23        kinaba: 		preCreate( (kiWindow*)(ppsp->lParam) );
13b7203622 2011-02-23        kinaba: 	return TRUE;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void kiPropSheetPage::setInfo( PROPSHEETPAGE* p )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	p->pszTemplate = MAKEINTRESOURCE( getRsrcID() );
13b7203622 2011-02-23        kinaba: 	p->lParam      = (LPARAM)this;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	if( m_hIcon )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		p->dwFlags|= PSP_USEHICON;
13b7203622 2011-02-23        kinaba: 		p->hIcon = m_hIcon;
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: