/* * MainWindowProc - procedure for main (root) window */ WINEXPORT LRESULT CALLBACK MainWindowProc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam ) { RECT rect; vi_rc rc; HANDLE hfileinfo; int cnt, i; char *buff; switch( msg ) { case WM_CREATE: Root = hwnd; GetClientRect( hwnd, &rect ); EditContainer = CreateContainerWindow( &rect ); InitWindows(); DragAcceptFiles( hwnd, TRUE ); timerID = SetTimer( hwnd, TIMER_ID, 60L * 1000L, NULL ); break; case WM_DROPFILES: hfileinfo = (HANDLE) wparam; cnt = DragQueryFile( hfileinfo, (UINT)-1, NULL, 0 ); buff = alloca( FILENAME_MAX + 2 ); /* we add a " at the beginning and at the end so we can handle path- and filenames with spaces */ if( buff != NULL ) { buff[0] = '"'; /* one " at the beginning of the filename */ for( i = 0; i < cnt; i++ ) { if( DragQueryFile( hfileinfo, i, buff + 1, FILENAME_MAX ) == (UINT)-1 ) { break; } strcat( buff, "\"" ); rc = EditFile( buff, FALSE ); if( rc > ERR_NO_ERR ) { Error( GetErrorMsg( rc ) ); } } } DragFinish( hfileinfo ); break; case WM_TIMER: UpdateStatusWindow(); break; case WM_KEYDOWN: if( WindowsKeyPush( wparam, HIWORD( lparam ) ) ) { return( 0 ); } break; case WM_SIZE: DefFrameProc( hwnd, EditContainer, msg, wparam, lparam ); RootState = wparam; if( wparam != SIZE_MINIMIZED ) { ResizeRoot(); GetWindowRect( hwnd, &RootRect ); if( wparam != SIZE_MAXIMIZED ) { RootState = 0; } } return( 0 ); case WM_MOVE: DefFrameProc( hwnd, EditContainer, msg, wparam, lparam ); if( RootState != SIZE_MINIMIZED ) { GetWindowRect( hwnd, &RootRect ); } return( 0 ); case WM_ACTIVATEAPP: if( BAD_ID( CurrentWindow ) ) { break; } SetFocus( Root ); #if 0 if( !wparam ) { InactiveWindow( CurrentWindow ); } else { SendMessage( EditContainer, WM_MDIACTIVATE, (WPARAM)CurrentWindow, 0L ); } #endif if( wparam ) { ResetEditWindowCursor( CurrentWindow ); } else { GoodbyeCursor( CurrentWindow ); } break; case WM_MOUSEACTIVATE: SetFocus( hwnd ); return( MA_ACTIVATE ); case WM_SETFOCUS: if( BAD_ID( CurrentWindow ) ) { break; } if( !IsIconic( CurrentWindow ) ) { SendMessage( EditContainer, WM_MDIACTIVATE, (WPARAM)CurrentWindow, 0L ); DCUpdate(); SetWindowCursor(); SetWindowCursorForReal(); return( 0 ); } break; case WM_NCLBUTTONDBLCLK: break; case WM_COMMAND: if( LOWORD( wparam ) > 0xF000 ) { break; } else { rc = MenuCommand( LOWORD( wparam ) ); if( rc != MENU_COMMAND_NOT_HANDLED ) { DCUpdateAll(); if( rc > ERR_NO_ERR ) { char *msg; msg = GetErrorMsg( rc ); Error( msg ); } } SetWindowCursor(); } return( 0 ); case WM_INITMENU: if( (HMENU)wparam == GetMenu( hwnd ) ) { HandleInitMenu( (HMENU)wparam ); } else { ResetMenuBits(); } break; case WM_MENUSELECT: HandleMenuSelect( wparam, lparam ); break; case WM_ENDSESSION: if( wparam ) { ExitEditor( 0 ); // will not return } return( 0 ); case WM_QUERYENDSESSION: return( ExitWithPrompt( FALSE, TRUE ) ); case WM_CLOSE: ExitWithPrompt( TRUE, TRUE ); return( 0 ); #ifdef __NT__ case WM_MOUSEWHEEL: { int i, increment; ULONG linesPerNotch; HWND activeWnd; activeWnd = (HWND)SendMessage( EditContainer, WM_MDIGETACTIVE, 0, 0 ); SystemParametersInfo( SPI_GETWHEELSCROLLLINES, 0, &linesPerNotch, 0 ); increment = GET_WHEEL_DELTA_WPARAM( wparam ) / 120; // see WM_MOUSEWHEEL-documentation for information about the "120" if( increment > 0 ) { for( i = 0; i < increment * (int)linesPerNotch; i++ ) { SendMessage( activeWnd, WM_VSCROLL, SB_LINEUP, 0 ); } } else { for( i = 0; i < (-increment) * (int)linesPerNotch; i++ ) { SendMessage( activeWnd, WM_VSCROLL, SB_LINEDOWN, 0 ); } } } return( 0 ); #endif case WM_DESTROY: DestroyToolBar(); DragAcceptFiles( hwnd, FALSE ); EditContainer = 0; if( timerID ) { KillTimer( hwnd, TIMER_ID ); } return( 0 ); } return( DefFrameProc( hwnd, EditContainer, msg, wparam, lparam ) ); } /* MainWindowProc */
/* ツールバー作成 @date @@@ 2002.01.03 YAZAKI m_tbMyButtonなどをCShareDataからCMenuDrawerへ移動したことによる修正。 @date 2005.08.29 aroka ツールバーの折り返し @date 2006.06.17 ryoji ビジュアルスタイルが有効の場合はツールバーを Rebar に入れてサイズ変更時のちらつきを無くす */ void CMainToolBar::CreateToolBar( void ) { if( m_hwndToolBar )return; REBARINFO rbi; REBARBANDINFO rbBand; int nFlag; TBBUTTON tbb; int i; int nIdx; LONG_PTR lToolType; nFlag = 0; // 2006.06.17 ryoji // Rebar ウィンドウの作成 if( IsVisualStyle() ){ // ビジュアルスタイル有効 m_hwndReBar = ::CreateWindowEx( WS_EX_TOOLWINDOW, REBARCLASSNAME, //レバーコントロール NULL, WS_CHILD/* | WS_VISIBLE*/ | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | // 2007.03.08 ryoji WS_VISIBLE 除去 RBS_BANDBORDERS | CCS_NODIVIDER, 0, 0, 0, 0, m_pOwner->GetHwnd(), NULL, CEditApp::getInstance()->GetAppInstance(), NULL ); if( NULL == m_hwndReBar ){ TopWarningMessage( m_pOwner->GetHwnd(), LS(STR_ERR_DLGEDITWND04) ); return; } if( GetDllShareData().m_Common.m_sToolBar.m_bToolBarIsFlat ){ /* フラットツールバーにする/しない */ PreventVisualStyle( m_hwndReBar ); // ビジュアルスタイル非適用のフラットな Rebar にする } ::ZeroMemory(&rbi, sizeof(rbi)); rbi.cbSize = sizeof(rbi); Rebar_SetbarInfo(m_hwndReBar, &rbi); nFlag = CCS_NORESIZE | CCS_NODIVIDER | CCS_NOPARENTALIGN | TBSTYLE_FLAT; // ツールバーへの追加スタイル } /* ツールバーウィンドウの作成 */ m_hwndToolBar = ::CreateWindowEx( 0, TOOLBARCLASSNAME, NULL, WS_CHILD/* | WS_VISIBLE*/ | WS_CLIPCHILDREN | /*WS_BORDER | */ // 2006.06.17 ryoji WS_CLIPCHILDREN 追加 // 2007.03.08 ryoji WS_VISIBLE 除去 /* WS_EX_WINDOWEDGE| */ TBSTYLE_TOOLTIPS | // TBSTYLE_WRAPABLE | // TBSTYLE_ALTDRAG | // CCS_ADJUSTABLE | nFlag, 0, 0, 0, 0, m_pOwner->GetHwnd(), (HMENU)ID_TOOLBAR, CEditApp::getInstance()->GetAppInstance(), NULL ); if( NULL == m_hwndToolBar ){ if( GetDllShareData().m_Common.m_sToolBar.m_bToolBarIsFlat ){ /* フラットツールバーにする/しない */ GetDllShareData().m_Common.m_sToolBar.m_bToolBarIsFlat = FALSE; } TopWarningMessage( m_pOwner->GetHwnd(), LS(STR_ERR_DLGEDITWND05) ); DestroyToolBar(); // 2006.06.17 ryoji } else{ // 2006.09.06 ryoji ツールバーをサブクラス化する g_pOldToolBarWndProc = (WNDPROC)::SetWindowLongPtr( m_hwndToolBar, GWLP_WNDPROC, (LONG_PTR)ToolBarWndProc ); Toolbar_SetButtonSize( m_hwndToolBar, DpiScaleX(22), DpiScaleY(22) ); // 2009.10.01 ryoji 高DPI対応スケーリング Toolbar_ButtonStructSize( m_hwndToolBar, sizeof(TBBUTTON) ); // Oct. 12, 2000 genta // 既に用意されているImage Listをアイコンとして登録 m_pcIcons->SetToolBarImages( m_hwndToolBar ); /* ツールバーにボタンを追加 */ int count = 0; //@@@ 2002.06.15 MIK int nToolBarButtonNum = 0;// 2005/8/29 aroka // From Here 2005.08.29 aroka // はじめにツールバー構造体の配列を作っておく TBBUTTON *pTbbArr = new TBBUTTON[GetDllShareData().m_Common.m_sToolBar.m_nToolBarButtonNum]; for( i = 0; i < GetDllShareData().m_Common.m_sToolBar.m_nToolBarButtonNum; ++i ){ nIdx = GetDllShareData().m_Common.m_sToolBar.m_nToolBarButtonIdxArr[i]; pTbbArr[nToolBarButtonNum] = m_pOwner->GetMenuDrawer().getButton(nIdx); // セパレータが続くときはひとつにまとめる // 折り返しボタンもTBSTYLE_SEP属性を持っているので // 折り返しの前のセパレータは全て削除される. if( (pTbbArr[nToolBarButtonNum].fsStyle & TBSTYLE_SEP) && (nToolBarButtonNum!=0)){ if( (pTbbArr[nToolBarButtonNum-1].fsStyle & TBSTYLE_SEP) ){ pTbbArr[nToolBarButtonNum-1] = pTbbArr[nToolBarButtonNum]; nToolBarButtonNum--; } } // 仮想折返しボタンがきたら直前のボタンに折返し属性を付ける if( pTbbArr[nToolBarButtonNum].fsState & TBSTATE_WRAP ){ if( nToolBarButtonNum!=0 ){ pTbbArr[nToolBarButtonNum-1].fsState |= TBSTATE_WRAP; } continue; } nToolBarButtonNum++; } // To Here 2005.08.29 aroka for( i = 0; i < nToolBarButtonNum; ++i ){ tbb = pTbbArr[i]; //@@@ 2002.06.15 MIK start switch( tbb.fsStyle ) { case TBSTYLE_DROPDOWN: //ドロップダウン //拡張スタイルに設定 Toolbar_SetExtendedStyle( m_hwndToolBar, TBSTYLE_EX_DRAWDDARROWS ); Toolbar_AddButtons( m_hwndToolBar, 1, &tbb ); count++; break; case TBSTYLE_COMBOBOX: //コンボボックス { RECT rc; TBBUTTONINFO tbi; TBBUTTON my_tbb; LOGFONT lf; switch( tbb.idCommand ) { case F_SEARCH_BOX: if( m_hwndSearchBox ) { break; } //セパレータ作る memset_raw( &my_tbb, 0, sizeof(my_tbb) ); my_tbb.fsStyle = TBSTYLE_BUTTON; //ボタンにしないと描画が乱れる 2005/8/29 aroka my_tbb.idCommand = tbb.idCommand; //同じIDにしておく if( tbb.fsState & TBSTATE_WRAP ){ //折り返し 2005/8/29 aroka my_tbb.fsState |= TBSTATE_WRAP; } Toolbar_AddButtons( m_hwndToolBar, 1, &my_tbb ); count++; //サイズを設定する tbi.cbSize = sizeof(tbi); tbi.dwMask = TBIF_SIZE; tbi.cx = (WORD)DpiScaleX(160); //ボックスの幅 // 2009.10.01 ryoji 高DPI対応スケーリング Toolbar_SetButtonInfo( m_hwndToolBar, tbb.idCommand, &tbi ); //位置とサイズを取得する rc.right = rc.left = rc.top = rc.bottom = 0; Toolbar_GetItemRect( m_hwndToolBar, count-1, &rc ); //コンボボックスを作る // Mar. 8, 2003 genta 検索ボックスを1ドット下にずらした m_hwndSearchBox = CreateWindow( _T("COMBOBOX"), _T("Combo"), WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWN /*| CBS_SORT*/ | CBS_AUTOHSCROLL /*| CBS_DISABLENOSCROLL*/, rc.left, rc.top + 1, rc.right - rc.left, (rc.bottom - rc.top) * 10, m_hwndToolBar, (HMENU)(INT_PTR)tbb.idCommand, CEditApp::getInstance()->GetAppInstance(), NULL ); if( m_hwndSearchBox ) { m_pOwner->SetCurrentFocus(0); lf = m_pOwner->GetLogfont(); //memset_raw( &lf, 0, sizeof(lf) ); lf.lfHeight = DpiPointsToPixels(-9); // Jan. 14, 2003 genta ダイアログにあわせてちょっと小さく // 2009.10.01 ryoji 高DPI対応(ポイント数から算出) lf.lfWidth = 0; lf.lfEscapement = 0; lf.lfOrientation = 0; lf.lfWeight = FW_NORMAL; lf.lfItalic = FALSE; lf.lfUnderline = FALSE; lf.lfStrikeOut = FALSE; //lf.lfCharSet = GetDllShareData().m_Common.m_sView.m_lf.lfCharSet; lf.lfOutPrecision = OUT_TT_ONLY_PRECIS; // Raster Font を使わないように //lf.lfClipPrecision = GetDllShareData().m_Common.m_sView.m_lf.lfClipPrecision; //lf.lfQuality = GetDllShareData().m_Common.m_sView.m_lf.lfQuality; //lf.lfPitchAndFamily = GetDllShareData().m_Common.m_sView.m_lf.lfPitchAndFamily; //_tcsncpy( lf.lfFaceName, GetDllShareData().m_Common.m_sView.m_lf.lfFaceName, _countof(lf.lfFaceName)); // 画面のフォントに設定 2012/11/27 Uchi m_hFontSearchBox = ::CreateFontIndirect( &lf ); if( m_hFontSearchBox ) { ::SendMessage( m_hwndSearchBox, WM_SETFONT, (WPARAM)m_hFontSearchBox, MAKELONG (TRUE, 0) ); } // //入力長制限 // Combo_LimitText( m_hwndSearchBox, (WPARAM)_MAX_PATH - 1 ); //検索ボックスを更新 // 関数化 2010/6/6 Uchi AcceptSharedSearchKey(); m_comboDel = SComboBoxItemDeleter(); // 再表示用の初期化 m_comboDel.pRecent = &m_cRecentSearch; CDialog::SetComboBoxDeleter(m_hwndSearchBox, &m_comboDel); } break; default: break; } } break; case TBSTYLE_BUTTON: //ボタン case TBSTYLE_SEP: //セパレータ default: Toolbar_AddButtons( m_hwndToolBar, 1, &tbb ); count++; break; } //@@@ 2002.06.15 MIK end } if( GetDllShareData().m_Common.m_sToolBar.m_bToolBarIsFlat ){ /* フラットツールバーにする/しない */ lToolType = ::GetWindowLongPtr(m_hwndToolBar, GWL_STYLE); lToolType |= (TBSTYLE_FLAT); ::SetWindowLongPtr(m_hwndToolBar, GWL_STYLE, lToolType); ::InvalidateRect(m_hwndToolBar, NULL, TRUE); } delete []pTbbArr;// 2005/8/29 aroka } // 2006.06.17 ryoji // ツールバーを Rebar に入れる if( m_hwndReBar && m_hwndToolBar ){ // ツールバーの高さを取得する DWORD dwBtnSize = Toolbar_GetButtonSize( m_hwndToolBar ); DWORD dwRows = Toolbar_GetRows( m_hwndToolBar ); // バンド情報を設定する // 以前のプラットフォームに _WIN32_WINNT >= 0x0600 で定義される構造体のフルサイズを渡すと失敗する // 2007.12.21 ryoji rbBand.cbSize = CCSIZEOF_STRUCT( REBARBANDINFO, wID ); rbBand.fMask = RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE; rbBand.fStyle = RBBS_CHILDEDGE; rbBand.hwndChild = m_hwndToolBar; // ツールバー rbBand.cxMinChild = 0; rbBand.cyMinChild = HIWORD(dwBtnSize) * dwRows; rbBand.cx = 250; // バンドを追加する Rebar_InsertBand( m_hwndReBar, -1, &rbBand ); ::ShowWindow( m_hwndToolBar, SW_SHOW ); } return; }