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: