File Annotation

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