/*! インスタンス ハンドルを保存して、メイン ウィンドウを作成します。 この関数で、グローバル変数でインスタンス ハンドルを保存し、 メイン プログラム ウィンドウを作成および表示します。 @param[in] hInstance インスタンスハンドル @param[in] nCmdShow 起動時の表示状態 */ BOOL InitInstance( HINSTANCE hInstance, int nCmdShow ) { HWND hWnd; INT xxx, yyy; RECT rect; BOOL bHotRslt; ghInst = hInstance; // グローバル変数にインスタンス処理を格納します。 // 設定ファイル位置確認 GetModuleFileName( hInstance, gatIniPath, MAX_PATH ); PathRemoveFileSpec( gatIniPath ); PathAppend( gatIniPath, INI_FILE ); // ここらで初期設定確保 gbClipSteal = InitParamValue( INIT_LOAD, VL_COLLECT_AON, 0 ); // コピペ保存・デフォは起動時OFF gGetMsgOn = InitParamValue( INIT_LOAD, VL_USE_BALLOON, 1 ); gbUniRadixHex = InitParamValue( INIT_LOAD, VL_UNIRADIX_HEX, 0 ); // 初期設定は Ctrl+Shift+C gbHotMod = InitParamValue( INIT_LOAD, VL_COLHOT_MODY, (MOD_CONTROL | MOD_SHIFT) ); gbHotVkey = InitParamValue( INIT_LOAD, VL_COLHOT_VKEY, VK_C ); hWnd = GetDesktopWindow( ); GetWindowRect( hWnd, &rect ); xxx = ( rect.right - WCL_WIDTH ) / 2; yyy = ( rect.bottom - WCL_HEIGHT ) / 2; hWnd = CreateWindowEx( WS_EX_TOOLWINDOW | WS_EX_APPWINDOW, gatWindowClass, gatTitle, WS_CAPTION | WS_POPUPWINDOW, xxx, yyy, WCL_WIDTH, WCL_HEIGHT, NULL, NULL, hInstance, NULL); if( !hWnd ){ return FALSE; } // タスクトレイがあぼ〜んしたときの再起動メッセージ番号を確保 grdTaskbarResetID = RegisterWindowMessage( TEXT("TaskbarCreated") ); // クリップボードチェーンに自分を登録 ghNextViewer = SetClipboardViewer( hWnd ); FileListViewInit( hWnd ); // リスト初期化 FileListViewGet( hWnd, 0, gatClipFile ); // 取り込みファイルを確保しておく FileTypeCheck( gatClipFile ); // ASTかそうでないかを確認 if( gGetMsgOn ){ Button_SetCheck( GetDlgItem(hWnd,IDB_CLIP_USE_BALLOON) , BST_CHECKED ); } if( gbUniRadixHex ){ Button_SetCheck( GetDlgItem(hWnd,IDB_CLIP_UNIRADIX_HEX) , BST_CHECKED ); } if( gbClipSteal ){ Button_SetCheck( GetDlgItem(hWnd,IDB_CLIP_STEAL_ACT_ON) , BST_CHECKED ); } TasktrayIconAdd( hWnd ); // とりあえず、Ctrl+Shift+C bHotRslt = RegisterHotKey( hWnd, IDHK_CLIPSTEAL_FILECHANGE, gbHotMod, gbHotVkey ); ShowWindow( hWnd, SW_HIDE ); // SW_HIDE return TRUE; }
/*! ウインドウプロシージャ @param[in] hWnd ウインドウハンドル @param[in] iWidth 新しいアイテム幅 @param[in] iHeight 新しいアイテム高さ @return HRESULT 終了状態コード */ HRESULT DraughtFrameResize( HWND hWnd, INT iWidth, INT iHeight ) { INT iBrdrWid = 0; INT iScWid = 0, iScHei; INT iCapHei, iXfrm, iYfrm; LONG rigOffs = 0; RECT rect; giItemWidth = iWidth; giItemHeight = iHeight; iCapHei = GetSystemMetrics( SM_CYSMCAPTION ); iXfrm = GetSystemMetrics( SM_CXFIXEDFRAME ); iYfrm = GetSystemMetrics( SM_CYFIXEDFRAME ); rect.left = gstViewLsPt.x; rect.top = gstViewLsPt.y; rect.right = (giItemWidth * TPNL_HORIZ) + (iXfrm * 2); rect.bottom = (giItemHeight * TPNL_VERTI); iScHei = rect.bottom; rect.bottom += ((iYfrm * 2) + iCapHei); if( gbThumb ) // サムネモード { rigOffs = rect.right; iScWid = GetSystemMetrics( SM_CXVSCROLL ); // 垂直スクロールバーの幅確保 rect.right += iScWid; iBrdrWid = GetSystemMetrics( SM_CXFIXEDFRAME ); // 枠の幅確保 rect.right += (iBrdrWid*2); } // ウインドウサイズ変更 SetWindowPos( ghDraughtWnd, HWND_TOP, rect.left, rect.top, rect.right, rect.bottom, SWP_NOMOVE ); if( gbThumb ) // サムネモード・スクロールバーの位置変更 { SetWindowPos( ghScrBarWnd, HWND_TOP, rigOffs, 0, iScWid, iScHei, SWP_NOZORDER ); } InvalidateRect( ghDraughtWnd, NULL, TRUE ); // 記録 InitParamValue( INIT_SAVE, VL_THUMB_HORIZ, giItemWidth ); InitParamValue( INIT_SAVE, VL_THUMB_VERTI, giItemHeight ); return S_OK; }
/*! 全設定をセーブする @param[in] hWnd ウインドウハンドル @param[in] bActOn 起動時コピペ保存機能ONにしておくか */ HRESULT InitSettingSave( HWND hWnd, UINT bActOn ) { HWND hLvWnd = GetDlgItem( hWnd, IDLV_CLIPSTEAL_FILELISTVW ); INT iCount, i; TCHAR atBuff[MAX_PATH]; iCount = ListView_GetItemCount( hLvWnd ); // 一旦セクションを空にする ZeroMemory( atBuff, sizeof(atBuff) ); WritePrivateProfileSection( TEXT("Collector"), atBuff, gatIniPath ); InitParamValue( INIT_SAVE, VL_USE_BALLOON, gGetMsgOn ); InitParamValue( INIT_SAVE, VL_UNIRADIX_HEX, gbUniRadixHex ); InitParamValue( INIT_SAVE, VL_CLIPFILECNT, iCount ); InitParamValue( INIT_SAVE, VL_COLLECT_AON, bActOn ); InitParamValue( INIT_SAVE, VL_COLHOT_MODY, gbHotMod ); InitParamValue( INIT_SAVE, VL_COLHOT_VKEY, gbHotVkey ); for( i = 0; iCount > i; i++ ) { FileListViewGet( hWnd, i, atBuff ); InitClipStealOpen( INIT_SAVE, i, atBuff ); } return S_OK; }
/*! MAA窓の背景色選択ダイヤログの面倒見る @param[in] hWnd オーナーウインドウハンドル @return HRESULT 終了状態コード */ HRESULT MaaBackColourChoose( HWND hWnd ) { BOOL bRslt; COLORREF adColourTemp[16], dColour; CHOOSECOLOR stChColour; ZeroMemory( adColourTemp, sizeof(adColourTemp) ); dColour = (COLORREF)InitParamValue( INIT_LOAD, VL_MAA_BKCOLOUR, 0x00FFFFFF ); adColourTemp[0] = dColour; ZeroMemory( &stChColour, sizeof(CHOOSECOLOR) ); stChColour.lStructSize = sizeof(CHOOSECOLOR); stChColour.hwndOwner = hWnd; // stChColour.hInstance = GetModuleHandle( NULL ); stChColour.rgbResult = dColour; stChColour.lpCustColors = adColourTemp; stChColour.Flags = CC_RGBINIT; bRslt = ChooseColor( &stChColour ); // 色ダイヤログ使う if( bRslt ) { dColour = stChColour.rgbResult; InitParamValue( INIT_SAVE, VL_MAA_BKCOLOUR, (INT)dColour ); DeleteBrush( ghBkBrush ); // ブラシ作り直し ghBkBrush = CreateSolidBrush( dColour ); InvalidateRect( ghItemsWnd, NULL, TRUE ); return S_OK; } return E_ABORT; }
/*! リストビュー書き直し @param[in] hWnd 親ウインドウのハンドル */ HRESULT FileListViewInit( HWND hWnd ) { UINT dItems, d; TCHAR atFilePath[MAX_PATH]; HWND hLvWnd = GetDlgItem( hWnd, IDLV_CLIPSTEAL_FILELISTVW ); ListView_DeleteAllItems( hLvWnd ); dItems = InitParamValue( INIT_LOAD, VL_CLIPFILECNT, 1 ); for( d = 0; dItems > d; d++ ) { InitClipStealOpen( INIT_LOAD, d, atFilePath ); FileListViewAdd( hWnd, atFilePath ); } return S_OK; }
/*! おぷしょんダイヤログのプロシージャ @param[in] hDlg ダイヤログハンドル @param[in] message ウインドウメッセージの識別番号 @param[in] wParam 追加の情報1 @param[in] lParam 追加の情報2 @retval 0 メッセージは処理していない @retval no0 なんか処理された */ INT_PTR CALLBACK OptionDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { UINT id; INT dValue, dBuff; switch( message ) { case WM_INITDIALOG: // MAA一覧 Edit_SetText( GetDlgItem(hDlg,IDE_AA_DIRECTORY), TEXT("AAディレクトリはプロファイルから設定してね") ); EnableWindow( GetDlgItem(hDlg,IDE_AA_DIRECTORY), FALSE ); ShowWindow( GetDlgItem(hDlg,IDB_AADIR_SEARCH), SW_HIDE ); // MAAポップアップについて dValue = InitParamValue( INIT_LOAD, VL_MAATIP_SIZE, 16 ); // サイズ確認 if( FONTSZ_REDUCE == dValue ) CheckRadioButton( hDlg, IDRB_POPUP_NOMAL, IDRB_POPUP_REDUCE, IDRB_POPUP_REDUCE ); else CheckRadioButton( hDlg, IDRB_POPUP_NOMAL, IDRB_POPUP_REDUCE, IDRB_POPUP_NOMAL ); dValue = InitParamValue( INIT_LOAD, VL_MAATIP_VIEW, 1 ); // ポッパップするか CheckDlgButton( hDlg, IDCB_POPUP_VISIBLE, dValue ? BST_CHECKED : BST_UNCHECKED ); // 複数行テンプレをクルックしたときの動作 dValue = InitParamValue( INIT_LOAD, VL_MAA_LCLICK, MAA_SJISCLIP ); switch( dValue ) { case MAA_UNICLIP: id = IDRB_SEL_CLIP_UNI; break; default: case MAA_SJISCLIP: id = IDRB_SEL_CLIP_SJIS; break; case MAA_DRAUGHT: id = IDRB_SEL_DRAUGHT; break; } CheckRadioButton( hDlg, IDRB_SEL_INS_EDIT, IDRB_SEL_DRAUGHT, id ); dValue = InitParamValue( INIT_LOAD, VL_MAA_MCLICK, MAA_SJISCLIP ); switch( dValue ) { case MAA_UNICLIP: id = IDRB_SELSUB_CLIP_UNI; break; default: case MAA_SJISCLIP: id = IDRB_SELSUB_CLIP_SJIS; break; case MAA_DRAUGHT: id = IDRB_SELSUB_DRAUGHT; break; } CheckRadioButton( hDlg, IDRB_SELSUB_INS_EDIT, IDRB_SELSUB_DRAUGHT, id ); return (INT_PTR)TRUE; case WM_COMMAND: id = LOWORD(wParam); switch( id ) { case IDB_APPLY://適用 case IDOK: // MAAポップアップについて dValue = FONTSZ_NORMAL; if( IsDlgButtonChecked( hDlg, IDRB_POPUP_REDUCE ) ){ dValue = FONTSZ_REDUCE; } InitParamValue( INIT_SAVE, VL_MAATIP_SIZE, dValue ); dBuff = IsDlgButtonChecked( hDlg, IDCB_POPUP_VISIBLE ); AaItemsTipSizeChange( dValue, dBuff ); InitParamValue( INIT_SAVE, VL_MAATIP_VIEW, dBuff ); // MAAの操作 if( IsDlgButtonChecked( hDlg, IDRB_SEL_CLIP_UNI ) ){ dValue = MAA_UNICLIP; } else if( IsDlgButtonChecked( hDlg, IDRB_SEL_DRAUGHT ) ){ dValue = MAA_DRAUGHT; } else{ dValue = MAA_SJISCLIP; } InitParamValue( INIT_SAVE, VL_MAA_LCLICK, dValue ); gdUseMode = dValue; gdClickDrt = gdUseMode; if( IsDlgButtonChecked( hDlg, IDRB_SELSUB_CLIP_UNI ) ){ dValue = MAA_UNICLIP; } else if( IsDlgButtonChecked( hDlg, IDRB_SELSUB_DRAUGHT ) ){ dValue = MAA_DRAUGHT; } else{ dValue = MAA_SJISCLIP; } InitParamValue( INIT_SAVE, VL_MAA_MCLICK, dValue ); gdUseSubMode = dValue; // OKなら閉じちゃう if( IDOK == id ){ EndDialog( hDlg, IDOK ); } return (INT_PTR)TRUE; case IDCANCEL: EndDialog( hDlg, IDCANCEL ); return (INT_PTR)TRUE; default: break; } break; default: break; } return (INT_PTR)FALSE; }
/*! アプリケーションのエントリポイント @param[in] hInstance このモジュールのインスタンスハンドル @param[in] hPrevInstance 前のインスタンス。今は未使用 @param[in] lpCmdLine コマンドライン。トークン分解はされてない、ただの文字列 @param[in] nCmdShow 起動時の表示状態が入ってる。表示とかそういうの @retval FALSE 途中終了 */ INT APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow ) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: ここにコードを挿入してください。 MSG msg; HACCEL hAccelTable; INT msRslt; #ifdef _DEBUG //_CRTDBG_ALLOC_MEM_DF; // 指定が必要なフラグ //_CRTDBG_CHECK_ALWAYS_DF; // メモリをチェック _CRTDBG_CHECK_EVERY_128_DF //_CRTDBG_LEAK_CHECK_DF; // 終了時にメモリリークをチェック //_CRTDBG_DELAY_FREE_MEM_DF; // // ここで使用するフラグを指定 _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF ); #endif INITCOMMONCONTROLSEX iccex; iccex.dwSize = sizeof(INITCOMMONCONTROLSEX); iccex.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx( &iccex ); // 設定ファイル位置確認 GetCurrentDirectory( MAX_PATH, gatIniPath ); PathAppend( gatIniPath, INI_FILE ); SplitBarClass( hInstance ); // スプリットバーの準備 gdUseMode = InitParamValue( INIT_LOAD, VL_MAA_LCLICK, MAA_SJISCLIP ); gdUseSubMode = InitParamValue( INIT_LOAD, VL_MAA_MCLICK, MAA_SJISCLIP ); ViewingFontNameLoad( ); // フォント名確保 // アプリケーションの初期化を実行します: ghMaaWnd = MaaTmpltInitialise( hInstance, GetDesktopWindow(), NULL ); if( !(ghMaaWnd) ) return (-1); #ifdef USE_HOVERTIP HoverTipInitialise( hInstance, ghMaaWnd ); #endif DraughtInitialise( hInstance, ghMaaWnd ); gdClickDrt = gdUseMode; hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_ORINRINVIEWER)); // メインメッセージループ for(;;) { msRslt = GetMessage( &msg, NULL, 0, 0 ); if( 1 != msRslt ) break; // MAA検索ダイヤログ if( ghMaaFindDlg ) { //トップに来てるかどうか判断する if( ghMaaFindDlg == GetForegroundWindow( ) ) { if( TranslateAccelerator( ghMaaFindDlg, hAccelTable, &msg ) ) continue; if( IsDialogMessage( ghMaaFindDlg, &msg ) ) continue; } } if( !TranslateAccelerator( msg.hwnd, hAccelTable, &msg ) ) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int)msg.wParam; }
/*! 壱行テンプレウインドウの作成 @param[in] hInstance アプリのインスタンス @param[in] hParentWnd 親ウインドウのハンドル @param[in] pstFrame メインクライヤント領域 @return 作ったビューのウインドウハンドル */ HWND LineTmpleInitialise( HINSTANCE hInstance, HWND hParentWnd, LPRECT pstFrame ) { WNDCLASSEX wcex; RECT wdRect, clRect, rect, cbxRect; UINT_PTR dItems, i; DWORD dwExStyle, dwStyle; HWND hPrWnd; INT spPos; TTTOOLINFO stToolInfo; LVCOLUMN stLvColm; ZeroMemory( &wcex, sizeof(WNDCLASSEX) ); wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = LineTmpleProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = NULL; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = LINETEMPLATE_CLASS; wcex.hIconSm = NULL; gTmpleAtom = RegisterClassEx( &wcex ); //テンプレデータ読み出し TemplateItemLoad( AA_LIST_FILE, LineTmpleItemData ); InitWindowPos( INIT_LOAD, WDP_LNTMPL, &rect ); if( 0 == rect.right || 0 == rect.bottom ) // 幅高さが0はデータ無し { GetWindowRect( hParentWnd, &wdRect ); rect.left = wdRect.right; rect.top = wdRect.top; rect.right = LT_WIDTH; rect.bottom = LT_HEIGHT; InitWindowPos( INIT_SAVE, WDP_LNTMPL, &rect );//起動時保存 } // カラム数確認 gLnClmCnt = InitParamValue( INIT_LOAD, VL_LINETMP_CLM, 4 ); if( gbTmpltDock ) { spPos = grdSplitPos - SPLITBAR_WIDTH; // 右からのオフセット hPrWnd = hParentWnd; dwExStyle = 0; dwStyle = WS_CHILD | WS_VISIBLE; rect = *pstFrame; // クライヤントに使える領域 rect.left = rect.right - spPos; rect.right = PLIST_DOCK; rect.bottom >>= 1; rect.top += rect.bottom; // ブラシと切換タブを作成 ghDockTabWnd = DockingTabCreate( hInstance, hPrWnd, &rect ); } else {
/*! 全体又は選択範囲を右に寄せる @param[in] pXdot 今のドット位置を受けて戻す @param[in] dLine 今の行数 @return HRESULT 終了状態コード */ HRESULT DocRightSlide( PINT pXdot, INT dLine ) { UINT_PTR iLines; INT iTop, iBottom, i; INT dSliDot, dRitDot, dPaDot, dInBgn; INT dMozi, dLefDot, dAdDot; BOOLEAN bFirst = TRUE; LPTSTR ptBuffer = NULL; LINE_ITR itLine; TRACE( TEXT("右寄せ") ); // 右寄せ限界確認 dSliDot = InitParamValue( INIT_LOAD, VL_RIGHT_SLIDE, 790 ); // 範囲確認 iLines = DocNowFilePageLineCount( ); iTop = (*gitFileIt).vcCont.at( gixFocusPage ).dSelLineTop; iBottom = (*gitFileIt).vcCont.at( gixFocusPage ).dSelLineBottom; if( 0 > iTop ) iTop = 0; if( 0 > iBottom ) iBottom = iLines - 1; ViewSelPageAll( -1 ); // 選択範囲無くなる dRitDot = DocPageMaxDotGet( iTop, iBottom ); // 一番右のドット確認 dPaDot = dSliDot - dRitDot; if( 0 > dPaDot ) { NotifyBalloonExist( TEXT("はみ出してるみたい"), TEXT("失敗"), NIIF_ERROR ); return E_FAIL; } itLine = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin(); std::advance( itLine, iTop ); // 位置合わせ for( i = iTop; iBottom >= i; i++, itLine++ ) { dAdDot = dPaDot; // 行頭の開き状態を確認 dLefDot = LayerHeadSpaceCheck( &(itLine->vcLine), &dMozi ); if( 0 < dLefDot ) { dAdDot += dLefDot; // 手前に空白があるなら、その分含めてずらし用スペースを計算 DocRangeDeleteByMozi( 0, i, 0, dMozi, &bFirst ); bFirst = FALSE; } // 先頭からうめちゃう dInBgn = 0; ptBuffer = DocPaddingSpaceWithPeriod( dAdDot, NULL, NULL, NULL, TRUE ); DocInsertString( &dInBgn, &i, NULL, ptBuffer, 0, bFirst ); bFirst = FALSE; FREE(ptBuffer); ViewRedrawSetLine( i ); } // キャレット位置適当に調整 *pXdot = 0; DocLetterPosGetAdjust( pXdot, dLine, 0 ); // キャレット位置適当に調整 ViewDrawCaret( *pXdot, dLine, 1 ); DocPageInfoRenew( -1, 1 ); return S_OK; }
/*! 頁番号挿入のアレ @param[in] hInst アプリの実存 @param[in] hWnd 親ウインドウハンドル・NULLで破壊処理 @return HRESULT 終了状態コード */ HRESULT DocPageNumInsert( HINSTANCE hInst, HWND hWnd ) { INT dNowPageBuffer; INT iLine, iDot; INT_PTR iRslt, maxPage, iNow; UINT ixNumber; BOOLEAN bFirst = TRUE; TCHAR atText[MAX_PATH]; PAGENUMINFO stInfo; // 今の頁を待避 dNowPageBuffer = gixFocusPage; maxPage = DocNowFilePageCount( ); // 頁数を確認 ZeroMemory( &stInfo, sizeof(PAGENUMINFO) ); stInfo.dStartNum = 1; // 設定を確認 stInfo.bInUnder = InitParamValue( INIT_LOAD, VL_PAGE_UNDER, BST_UNCHECKED ); // 頁番号を最下行に挿入するか stInfo.bOverride = InitParamValue( INIT_LOAD, VL_PAGE_OVWRITE, BST_UNCHECKED ); // 該当行の内容を削除して上書するか // 文字列フォーマット StringCchCopy( stInfo.atStyle, MAX_PATH, TEXT("%u") ); // デフォ設定 InitParamString( INIT_LOAD, VS_PAGE_FORMAT, stInfo.atStyle ); iRslt = DialogBoxParam( hInst, MAKEINTRESOURCE(IDD_PAGENUMBER_DLG), hWnd, PageNumDlgProc, (LPARAM)(&stInfo) ); if( IDOK == iRslt ) // 挿入する { #pragma message("ディレイロードしたら、頁番号挿入がおかしくなるはず") ixNumber = stInfo.dStartNum; // 開始番号について InitParamString( INIT_SAVE, VS_PAGE_FORMAT, stInfo.atStyle ); // 設定を保存 InitParamValue( INIT_SAVE, VL_PAGE_UNDER, stInfo.bInUnder ); InitParamValue( INIT_SAVE, VL_PAGE_OVWRITE, stInfo.bOverride ); for( iNow = 0; maxPage > iNow; iNow++, ixNumber++ ) { StringCchPrintf( atText, MAX_PATH, stInfo.atStyle, ixNumber ); if( NowPageInfoGet( iNow, NULL ) ) // ディレってないなら0 { // ディレイ文字列を操作するか DocDelayPageNumInsert( gitFileIt, iNow, &stInfo, atText ); // 展開する・頁が多いと重い・しなくていい //DocDelayPageLoad( gitFileIt, iNow ); } else { gixFocusPage = iNow; // 内部操作 if( stInfo.bInUnder ) // 頁最下部に挿入 { if( stInfo.bOverride ) // 該当行消して挿入である { iLine = DocPageParamGet( NULL, NULL ); iLine--; if( 0 > iLine ){ iLine = 0; } DocLineErase( iLine , &bFirst ); // 中でアンドゥ操作変換 } else { iLine = DocAdditionalLine( 1, &bFirst );// bFirst = FALSE; } } else // 壱行目に挿入 { iDot = 0; iLine = 0; if( stInfo.bOverride ) // 該当行消して挿入である { DocLineErase( 0 , &bFirst ); // 中でアンドゥ操作変換 } else { DocInsertString( &iDot, &iLine, NULL, CH_CRLFW, 0, bFirst ); bFirst = FALSE; } iLine = 0; } iDot = 0; // 頁番号の内容挿入 DocInsertString( &iDot, &iLine, NULL, atText, 0, bFirst ); bFirst = FALSE; } } // 頁元に戻す gixFocusPage = dNowPageBuffer; ViewRedrawSetLine( -1 ); } return S_OK; }
/*! テンポラったAAを表示するウインドウの作成 @param[in] hInstance アプリのインスタンス @param[in] hPtWnd メイン窓ウインドウハンドル @return 終了状態コード */ HRESULT DraughtInitialise( HINSTANCE hInstance, HWND hPtWnd ) { WNDCLASSEX wcex; if( hInstance ) { ZeroMemory( &wcex, sizeof(WNDCLASSEX) ); wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = DraughtProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = NULL; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = DRAUGHT_BOARD_CLASS; wcex.hIconSm = NULL; gDraughtAtom = RegisterClassEx( &wcex ); ghNonItemDC = NULL; // サイズ併せ giItemWidth = InitParamValue( INIT_LOAD, VL_THUMB_HORIZ, DTHMSZ_REGULAR ); giItemHeight = InitParamValue( INIT_LOAD, VL_THUMB_VERTI, DTHMSZ_REGULAR ); // サイズ表示用フォント ghAreaFont = CreateFont( FONTSZ_REDUCE, 0, 0, 0, FW_REGULAR, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, VARIABLE_PITCH, TEXT("MS UI Gothic") ); ghPtWnd = hPtWnd; // 初期状態 //gstMainLsPt.x = -1; gstViewLsPt.x = -1; giItemSel = -1; #ifndef _ORRVW // クルック動作指定ロード・デフォ動作は通常挿入 gdClickDrt = InitParamValue( INIT_LOAD, VL_DRT_LCLICK, MAA_INSERT ); gdSubClickDrt = InitParamValue( INIT_LOAD, VL_DRT_MCLICK, MAA_INSERT ); // Viewerの場合はコピーモードに従う #endif } else { if( ghNonItemDC ) { SelectBitmap( ghNonItemDC, ghOldBmp ); SelectPen( ghNonItemDC, GetStockPen(NULL_PEN) ); DeleteObject( ghNonItemDC ); } if( ghNonItemBMP ){ DeleteBitmap( ghNonItemBMP ); } if( ghLinePen ){ DeletePen( ghLinePen ); } if( ghAreaFont ){ DeleteFont( ghAreaFont ); } #ifdef MAA_TOOLTIP FREE( gptTipBuffer ); #endif DraughtItemDelete( -1 ); } return S_OK; }
/*! コンテキストメニュー呼びだし(右クルック) @param[in] hWnd ウインドウハンドル @param[in] hWndContext 右クルックした子ウインドウハンドル @param[in] xPos マウスカーソルのスクリーンX座標 @param[in] yPos マウスカーソルのスクリーンY座標 @return なし */ VOID Aai_OnContextMenu( HWND hWnd, HWND hWndContext, UINT xPos, UINT yPos ) { HMENU hMenu, hSubMenu; UINT dRslt; INT dOpen; // 全ツリーとお気にリスト開いてるの LPSTR pcConts = NULL; UINT_PTR rdLength; INT sx, sy; dOpen = TabMultipleNowSel( ); // 開いてるので処理かえる // ACT_ALLTREE ACT_FAVLIST #pragma message ("Editorとviewerの、メニューリソースの整合性に注意セヨ") hMenu = LoadMenu( GetModuleHandle(NULL), MAKEINTRESOURCE(IDM_AALIST_POPUP) ); hSubMenu = GetSubMenu( hMenu, 0 ); #ifdef _ORRVW // 使用リストのみ、削除を有効に、変更すること・標準で無効にしておく if( ACT_FAVLIST == dOpen ){ EnableMenuItem( hSubMenu, IDM_MAA_FAV_DELETE , MF_ENABLED ); } // 一般アイテムも削除出来るようにする #endif // ツールチップの表示・非表示のトゴゥ if( gbAAtipView ){ CheckMenuItem( hSubMenu, IDM_MAA_AATIP_TOGGLE, MF_CHECKED ); } #ifndef _ORRVW // フォーカス戻すかどうか if( gbMaaRetFocus ){ CheckMenuItem( hSubMenu, IDM_MAA_RETURN_FOCUS, MF_CHECKED ); } #endif // マルチモニタしてると、座標値がマイナスになることがある。 sx = (SHORT)xPos; sy = (SHORT)yPos; // gixNowSelは、何も無いところだと−1になる // フラグにTPM_RETURNCMDを指定すると、WM_COMMANDが飛ばない dRslt = TrackPopupMenu( hSubMenu, TPM_RETURNCMD, sx, sy, 0, hWnd, NULL ); // TPM_CENTERALIGN | TPM_VCENTERALIGN | DestroyMenu( hMenu ); switch( dRslt ) { case IDM_MAA_FAV_DELETE: if( ACT_FAVLIST == dOpen ) // 使用の場合 { pcConts = AacAsciiArtGet( gixNowSel ); // 該当するインデックスAAを引っ張ってくる if( !pcConts ){ return; } rdLength = strlen( pcConts ); // 文字列の長さ取得 AaItemsFavDelete( pcConts, rdLength ); // 削除Commando発行 FavContsRedrawRequest( hWnd ); // 再描画しなきゃだね } #ifndef _ORRVW else // それ以外なら、主タブか副タブ { AacItemDelete( hWnd, gixNowSel ); } #endif break; #ifndef _ORRVW case IDM_MAA_INSERT_EDIT: AaItemsDoSelect( hWnd, MAA_INSERT, TRUE ); break; case IDM_MAA_INTERRUPT_EDIT: AaItemsDoSelect( hWnd, MAA_INTERRUPT, TRUE ); break; case IDM_MAA_SET_LAYERBOX: AaItemsDoSelect( hWnd, MAA_LAYERED, TRUE ); break; #endif case IDM_MAA_CLIP_UNICODE: AaItemsDoSelect( hWnd, MAA_UNICLIP, TRUE ); break; case IDM_MAA_CLIP_SHIFTJIS: AaItemsDoSelect( hWnd, MAA_SJISCLIP, TRUE ); break; case IDM_DRAUGHT_ADDING: AaItemsDoSelect( hWnd, MAA_DRAUGHT, TRUE ); break; #ifdef _ORRVW case IDM_DRAUGHT_OPEN: Maa_OnCommand( hWnd, IDM_DRAUGHT_OPEN, NULL, 0 ); break; #endif case IDM_MAA_AATIP_TOGGLE: gbAAtipView = gbAAtipView ? FALSE : TRUE; InitParamValue( INIT_SAVE, VL_MAATIP_VIEW, gbAAtipView ); break; case IDM_MAA_SEP_STYLE_TOGGLE: gbLineSep = gbLineSep ? FALSE : TRUE; InitParamValue( INIT_SAVE, VL_MAASEP_STYLE, gbLineSep ); InvalidateRect( ghItemsWnd, NULL, TRUE ); break; case IDM_MAA_THUMBNAIL_OPEN: Maa_OnCommand( hWnd , IDM_MAA_THUMBNAIL_OPEN, NULL, 0 ); break; case IDM_MAAITEM_BKCOLOUR: MaaBackColourChoose( hWnd ); break; #ifndef _ORRVW case IDM_MAA_RETURN_FOCUS: gbMaaRetFocus = gbMaaRetFocus ? FALSE : TRUE; InitParamValue( INIT_SAVE, VL_MAA_RETFCS, gbMaaRetFocus ); break; #ifdef MAA_IADD_PLUS // 途中追加 case IDM_MAA_ITEM_INSERT: AacItemInsert( hWnd, gixNowSel ); break; #endif #endif } return; }
/*! 全ツリーやお気にリストの内容を表示するスタティックとか作る @param[in] hWnd 親ウインドウハンドル・NULLなら破壊 @param[in] hInst アプリの実存 @param[in] ptRect クライアント領域のサイズ @return HRESULT 終了状態コード */ HRESULT AaItemsInitialise( HWND hWnd, HINSTANCE hInst, LPRECT ptRect ) { #ifdef MAA_TOOLTIP INT ttSize; TTTOOLINFO stToolInfo; #endif SCROLLINFO stScrollInfo; RECT rect; LOGFONT stFont; COLORREF dBkColour; if( !(hWnd) ) { free( gptTipBuffer ); SetWindowFont( ghItemsWnd, GetStockFont(DEFAULT_GUI_FONT), FALSE ); #ifdef MAA_TOOLTIP SetWindowFont( ghToolTipWnd, GetStockFont(DEFAULT_GUI_FONT), FALSE ); DeleteFont( ghTipFont ); #endif DeleteFont( ghAaFont ); DeletePen( ghSepPen ); DeleteBrush( ghBkBrush ); return S_FALSE; } //ウインドウのサイズは、あとで変更が飛んでくるので、ここでは固定値で作っておk ghSepPen = CreatePen( PS_SOLID, 1, RGB(0xAA,0xAA,0xAA) ); // 1なら区切り線スタイル gbLineSep = InitParamValue( INIT_LOAD, VL_MAASEP_STYLE, 0 ); dBkColour = (COLORREF)InitParamValue( INIT_LOAD, VL_MAA_BKCOLOUR, 0x00FFFFFF ); ghBkBrush = CreateSolidBrush( dBkColour ); #ifndef _ORRVW // 選択したらフォーカスを編集窓に戻す? gbMaaRetFocus = InitParamValue( INIT_LOAD, VL_MAA_RETFCS, 0 ); #endif gptTipBuffer = NULL; gixTopItem = 0; gixNowSel = -1; #ifdef USE_HOVERTIP gixNowToolTip = -1; #endif #ifdef MAA_TEXT_FIND ZeroMemory( gatFindText, sizeof(gatFindText) ); #endif #ifdef MAA_TOOLTIP // ツールチップ作る ghToolTipWnd = CreateWindowEx( WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL, TTS_NOPREFIX | TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hWnd, NULL, hInst, NULL ); #endif // 見出しコンボックス ghComboxWnd = CreateWindowEx( 0, WC_COMBOBOX, TEXT(""), WS_VISIBLE | WS_CHILD | WS_BORDER | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_NOINTEGRALHEIGHT, TREE_WIDTH + SPLITBAR_WIDTH, 0, ptRect->right - TREE_WIDTH - LSSCL_WIDTH, TITLECBX_HEI, hWnd, (HMENU)IDCB_AAITEMTITLE, hInst, NULL ); GetClientRect( ghComboxWnd, &rect ); // サブクラス化 gpfOrgAaTitleCbxProc = SubclassWindow( ghComboxWnd, gpfAaTitleCbxProc ); // AA一覧のスタティックつくる・オーナードローで描画 ghItemsWnd = CreateWindowEx( WS_EX_CLIENTEDGE | WS_EX_ACCEPTFILES, WC_STATIC, TEXT(""), WS_VISIBLE | WS_CHILD | SS_OWNERDRAW | SS_NOTIFY, TREE_WIDTH + SPLITBAR_WIDTH, rect.bottom, ptRect->right - TREE_WIDTH - LSSCL_WIDTH, ptRect->bottom - rect.bottom, hWnd, (HMENU)IDSO_AAITEMS, hInst, NULL ); //DragAcceptFiles( ghItemsWnd, TRUE ); WS_EX_ACCEPTFILESでおk // サブクラス化 gpfOrgAaItemsProc = SubclassWindow( ghItemsWnd, gpfAaItemsProc ); // 一覧のスクロールバー ghScrollWnd = CreateWindowEx( 0, WC_SCROLLBAR, TEXT("scroll"), WS_VISIBLE | WS_CHILD | SBS_VERT, ptRect->right - LSSCL_WIDTH, rect.bottom, LSSCL_WIDTH, ptRect->bottom - rect.bottom, hWnd, (HMENU)IDSB_LISTSCROLL, hInst, NULL ); ZeroMemory( &stScrollInfo, sizeof(SCROLLINFO) ); stScrollInfo.cbSize = sizeof(SCROLLINFO); stScrollInfo.fMask = SIF_DISABLENOSCROLL; SetScrollInfo( ghScrollWnd, SB_CTL, &stScrollInfo, TRUE ); // 表示用メインフォント ViewingFontGet( &stFont ); ghAaFont = CreateFontIndirect( &stFont ); // gstBaseFont SetWindowFont( ghItemsWnd, ghAaFont, TRUE ); #ifdef MAA_TOOLTIP // ポッパップチップ用・12/9pt兼用 ttSize = InitParamValue( INIT_LOAD, VL_MAATIP_SIZE, FONTSZ_REDUCE ); // サイズ確認 stFont.lfHeight = (FONTSZ_REDUCE == ttSize) ? FONTSZ_REDUCE : FONTSZ_NORMAL; ghTipFont = CreateFontIndirect( &stFont ); SetWindowFont( ghToolTipWnd, ghTipFont, TRUE ); // ツールチップをコールバックで割り付け ZeroMemory( &stToolInfo, sizeof(TTTOOLINFO) ); stToolInfo.cbSize = sizeof(TTTOOLINFO); stToolInfo.uFlags = TTF_SUBCLASS; stToolInfo.hinst = NULL; // stToolInfo.hwnd = ghItemsWnd; stToolInfo.uId = IDSO_AAITEMS; GetClientRect( ghItemsWnd, &stToolInfo.rect ); stToolInfo.lpszText = LPSTR_TEXTCALLBACK; // コレを指定するとコールバックになる SendMessage( ghToolTipWnd, TTM_ADDTOOL, 0, (LPARAM)&stToolInfo ); SendMessage( ghToolTipWnd, TTM_SETMAXTIPWIDTH, 0, 0 ); // チップの幅。0設定でいい。これしとかないと改行されない #endif return S_OK; }