/*! クリップボードに1文字だけ入れる @param[in] ch 入れたい文字 @return HRESULT 終了状態コード */ HRESULT DocClipLetter( TCHAR ch ) { TCHAR atBuff[3]; ZeroMemory( atBuff, sizeof(atBuff) ); atBuff[0] = ch; DocClipboardDataSet( atBuff, 4, D_UNI ); return S_OK; }
/*! MAAからSJISを受け取って処理する・Editor側にもある @param[in] hWnd ウインドウハンドル @param[in] pcCont AAの文字列 @param[in] cbSize バイト数・末端NULLは含まない @param[in] dMode 使用モード・デフォもしくは個別指定 @return 非0デフォ動作した 0指定モードだった */ UINT ViewMaaMaterialise( HWND hWnd, LPSTR pcCont, UINT cbSize, UINT dMode ) { LPTSTR ptString; UINT_PTR cchSize; UINT uRslt = TRUE; // デフォ動作であるならTRUE<いつでもTRUEにした // FLASHWINFO stFshWInfo; // デフォ動作であるかどうか // if( dMode == gdUseMode ){ uRslt = TRUE; } if( MAA_DEFAULT == dMode ){ dMode = gdUseMode; } if( MAA_SUBDEFAULT== dMode ){ dMode = gdUseSubMode; } if( MAA_UNICLIP == dMode ) // ユニコード { ptString = SjisDecodeAlloc( pcCont ); // ユニコードにしておく StringCchLength( ptString, STRSAFE_MAX_CCH, &cchSize ); // ユニコード的にクリッペ DocClipboardDataSet( ptString, (cchSize + 1) * 2, D_UNI ); FREE(ptString); } else if( MAA_DRAUGHT == dMode ){ DraughtItemAdding( hWnd, pcCont ); } // ドラフトボードに追加 else{ DocClipboardDataSet( pcCont, (cbSize + 1), D_SJIS ); } // SJISコピー //ZeroMemory( &stFshWInfo, sizeof(FLASHWINFO) ); //stFshWInfo.cbSize = sizeof(FLASHWINFO); // この構造体のサイズ //stFshWInfo.hwnd = ghMaaWnd; // wktkさせたいウインダウのハンドル //stFshWInfo.dwFlags = FLASHW_ALL; // キャプションとタスクバーのボタン両方 //stFshWInfo.uCount = 2; // wktkさせる回数 //stFshWInfo.dwTimeout = 0; // 間隔。0でデフォルト的な間隔 //FlashWindowEx( &stFshWInfo ); // wktkさせる return uRslt; }
/*! 頁全体をコピーする @param[in] bStyle ユニコードかシフトJIS @return HRESULT 終了状態コード */ HRESULT DocPageAllCopy( UINT bStyle ) { INT cbSize; LPVOID pString = NULL; // SJISの場合は、ユニコード文字は&#dddd;で確保される // cbSize = DocPageTextAllGetAlloc( bStyle, &pString ); cbSize = DocPageGetAlloc( bStyle, &pString ); TRACE( TEXT("BYTE:%d"), cbSize ); DocClipboardDataSet( pString, cbSize, bStyle ); FREE( pString ); return S_OK; }
/*! 選択範囲のデータをクリップボードする @param[in] bStyle 1ユニコードかシフトJISで、矩形かどうか @return コピーしたバイト数・NULLターミネータも含む */ INT DocExClipSelect( UINT bStyle ) { INT cbSize; LPVOID pString = NULL; // SJISの場合は、ユニコード文字は&#dddd;で確保される cbSize = DocSelectTextGetAlloc( bStyle, &pString, NULL ); TRACE( TEXT("BYTE:%d"), cbSize ); // もし選択範囲なかったら、Focus行の内容をコピるとか DocClipboardDataSet( pString, cbSize, bStyle ); FREE( pString ); return cbSize; }
/*! ホットキーによる投下の調整 @return HRESULT 終了状態コード */ HRESULT DocThreadDropCopy( VOID ) { CHAR acBuf[260]; TCHAR atTitle[64], atInfo[256]; INT cbSize, maxPage;//, dFocusBuf; LPVOID pcString = NULL; // dFocusBuf = gixFocusPage; // 現在頁を一旦待避させて // gixFocusPage = gixDropPage; // 投下用頁にして // cbSize = DocPageTextAllGetAlloc( D_SJIS, &pcString ); cbSize = DocPageTextGetAlloc( gitFileIt, gixDropPage, D_SJIS, &pcString, FALSE ); // gixFocusPage = dFocusBuf; // 終わったら戻す TRACE( TEXT("%d 頁をコピー"), gixDropPage ); DocClipboardDataSet( pcString, cbSize, D_SJIS ); ZeroMemory( acBuf, sizeof(acBuf) ); StringCchCopyNA( acBuf, 260, (LPCSTR)pcString, 250 ); ZeroMemory( atInfo, sizeof(atInfo) ); MultiByteToWideChar( CP_ACP, 0, acBuf, (INT)strlen(acBuf), atInfo, 256 ); StringCchPrintf( atTitle, 64, TEXT("%d 頁をコピーしたよ"), gixDropPage + 1 ); NotifyBalloonExist( atInfo, atTitle, NIIF_INFO ); FREE( pcString ); gixDropPage++; // 次の頁へ maxPage = DocNowFilePageCount( ); if( maxPage <= gixDropPage ) gixDropPage = 0; // 最終頁までイッたら先頭に戻る return S_OK; }
/*! 抽出対象領域を取り出す @param[in] hInst 実存値 @return HRESULT 終了状態コード */ HRESULT DocExtractExecute( HINSTANCE hInst ) { INT dOffDot, dCount; BOOLEAN bLnFirst, bMzFirst, bIsVoid; LPTSTR ptSpace, ptString; UINT_PTR cch;//, i; LINE_ITR itLnFirst, itLnLast, itLnErate, itLnEnd; LETR_ITR itMozi, itMzEnd; wstring wsBuffer; if( 0 >= DocNowFilePageCount( ) ) return S_FALSE; // 開始行と終止行・オフセット量を検索 itLnErate = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin(); itLnEnd = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.end(); itLnFirst = itLnErate; itLnLast = itLnEnd; dOffDot = DocPageMaxDotGet( -1, -1 ); // MAX位置を初期にしとけばおk bLnFirst = TRUE; for( ; itLnEnd != itLnErate; itLnErate++ ) // 行サーチ { itMozi = itLnErate->vcLine.begin(); itMzEnd = itLnErate->vcLine.end(); dCount = 0; for( ; itMzEnd != itMozi; itMozi++ ) // 文字サーチ { if( CT_SELECT & itMozi->mzStyle ) // 選択状態発見 { if( bLnFirst ) // 最初の行が未発見であれば { itLnFirst = itLnErate; // 今の行を記録する bLnFirst = FALSE; } itLnLast = itLnErate; // 選択状態があるので終止行を更新 // そこまでのオフセット量よりさらに小さければ更新 if( dOffDot > dCount ) dOffDot = dCount; break; // 次の行に移動 } dCount += itMozi->rdWidth; // そこまでのドット数をため込む } } if( itLnLast != itLnEnd ) itLnLast++; // 終止の次の行を示しておく if( bLnFirst ) return S_FALSE; // 選択範囲がなかったら死にます wsBuffer.clear(); // 開始行から内容を確保していく for( itLnErate = itLnFirst; itLnLast != itLnErate; itLnErate++ ) // 行サーチ { itMozi = itLnErate->vcLine.begin(); itMzEnd = itLnErate->vcLine.end(); bMzFirst = TRUE; bIsVoid = FALSE; dCount = 0; for( ; itMzEnd != itMozi; itMozi++ ) // 文字サーチ { if( CT_SELECT & itMozi->mzStyle ) // 選択状態発見 { if( bIsVoid ) // 直前まで未選択状態 { if( bMzFirst ) // 最初の空白部分であれば { dCount -= dOffDot; // オフセットする if( 0 > dCount ) dCount = 0; bMzFirst = FALSE; } // 埋めSpaceを作る・不可ならNULLが返る ptSpace = DocPaddingSpaceMake( dCount ); if( ptSpace ) { wsBuffer += ptSpace; //StringCchLength( ptSpace, STRSAFE_MAX_CCH, &cch ); //for( i = 0; cch > i; i++ ) //{ // wsBuffer += (ptSpace[i]); //} FREE(ptSpace); } } wsBuffer += itMozi->cchMozi; dCount = 0; // リセット bIsVoid = FALSE; } else { dCount += itMozi->rdWidth; // そこまでのドット数をため込む bIsVoid = TRUE; } } wsBuffer += CH_CRLFW; // 改行追加 } // この時点で、wsBufferに全体が入っているはず cch = wsBuffer.size( ) + 1; ptString = (LPTSTR)malloc( cch * sizeof(TCHAR) ); StringCchCopy( ptString, cch, wsBuffer.c_str( ) ); if( hInst ) // 実存してるならレイヤボックスへ { LayerBoxVisibalise( hInst, ptString, 0x00 ); } else // ないならクルッペボード { DocClipboardDataSet( ptString, cch * sizeof(TCHAR), D_UNI ); } FREE(ptString); return S_OK; }