/*! 保持構造体に文字列を記録する @param[in] *pvcUnits 保持ベクータへのポインター @param[in] ptText 記録する文字列 @param[in] cchSize 文字数 @return HRESULT 終了状態コード */ HRESULT UserDefSetString( vector<ONELINE> *pvcUnits, LPCTSTR ptText, UINT cchSize ) { UINT i; INT yLine; ONELINE stLine; LETTER stLetter; ZeroONELINE( &stLine ); pvcUnits->push_back( stLine ); // 壱発目 yLine = 0; for( i = 0; cchSize > i; i++ ) { if( CC_CR == ptText[i] && CC_LF == ptText[i+1] ) // 改行であったら { pvcUnits->push_back( stLine ); i++; // 0x0D,0x0Aだから、壱文字飛ばすのがポイント yLine++; // 改行したからFocusは次の行へ } else if( CC_TAB == ptText[i] ) { // タブは挿入しない } else { DocLetterDataCheck( &stLetter, ptText[i] ); //ZeroMemory( &stLetter, sizeof(LETTER) ); //stLetter.cchMozi = ptText[i]; //stLetter.rdWidth = ViewLetterWidthGet( ptText[i] ); //stLetter.mzStyle = CT_NORMAL; //if( iswspace( ptText[i] ) ){ stLetter.mzStyle |= CT_SPACE; } //// 非シフトJIS文字を確認 //if( !( DocIsSjisTrance( ptText[i], stLetter.acSjis ) ) ){ stLetter.mzStyle |= CT_CANTSJIS; } //DocLetterByteCheck( &stLetter ); // バイト数確認 pvcUnits->at( yLine ).vcLine.push_back( stLetter ); pvcUnits->at( yLine ).iDotCnt += stLetter.rdWidth; pvcUnits->at( yLine ).iByteSz += stLetter.mzByte; } } // 末尾とかの空白も含めてテンプレかなと思ってる return S_OK; }
/*! 指定行のドット位置(キャレット位置)に壱文字追加する・この函数内ではアンドゥの面倒は見ない @param[in] nowDot 挿入するドット位置 @param[in] rdLine 対象の行番号・絶対0インデックスか @param[in] ch 追加したい文字 @return INT 追加した文字のドット数 */ INT DocInputLetter( INT nowDot, INT rdLine, TCHAR ch ) { INT_PTR iLetter, iCount, iLines; LETTER stLetter; LETR_ITR vcItr; LINE_ITR itLine; // アンドゥリドゥは呼んだところで #ifdef DO_TRY_CATCH try{ #endif if( 0 == ch ) { TRACE( TEXT("NULL文字が入った") ); return 0; } iLines = DocNowFilePageLineCount( ); if( iLines <= rdLine ) { TRACE( TEXT("OutOfRange 指定[%d] 行数[%d]"), rdLine, iLines ); return 0; } iLetter = DocLetterPosGetAdjust( &nowDot, rdLine, 0 ); // 今の文字位置を確認 itLine = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin(); std::advance( itLine, rdLine ); // 対象行までイテレートする // 文字数確認 iCount = itLine->vcLine.size( ); // データ作成 DocLetterDataCheck( &stLetter, ch ); // 指定行のドット位置(キャレット位置)に壱文字追加するとき if( iLetter >= iCount ) // 文字数同じなら末端に追加ということ { itLine->vcLine.push_back( stLetter ); } else // そうでないなら途中に追加 { vcItr = itLine->vcLine.begin( ); vcItr += iLetter; itLine->vcLine.insert( vcItr, stLetter ); } itLine->iDotCnt += stLetter.rdWidth; itLine->iByteSz += stLetter.mzByte; (*gitFileIt).vcCont.at( gixFocusPage ).dByteSz += stLetter.mzByte; // DocBadSpaceCheck( rdLine ); 呼んだところでまとめてやる #ifdef DO_TRY_CATCH } catch( exception &err ){ return ETC_MSG( err.what(), 0 ); } catch( ... ){ return ETC_MSG( ("etc error"), 0 ); } #endif return stLetter.rdWidth; }