本文整理汇总了C++中CNativeW::GetStringPtr方法的典型用法代码示例。如果您正苦于以下问题:C++ CNativeW::GetStringPtr方法的具体用法?C++ CNativeW::GetStringPtr怎么用?C++ CNativeW::GetStringPtr使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CNativeW
的用法示例。
在下文中一共展示了CNativeW::GetStringPtr方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: CHelpManager
/* 外部ヘルプ1
@date 2012.09.26 Moca HTMLHELP対応
*/
void CViewCommander::Command_EXTHELP1( void )
{
retry:;
if( CHelpManager().ExtWinHelpIsSet( &(GetDocument()->m_cDocType.GetDocumentAttribute()) ) == false){
// if( 0 == wcslen( GetDllShareData().m_Common.m_szExtHelp1 ) ){
ErrorBeep();
//From Here Sept. 15, 2000 JEPRO
// [Esc]キーと[x]ボタンでも中止できるように変更
if( IDYES == ::MYMESSAGEBOX( NULL, MB_YESNOCANCEL | MB_ICONEXCLAMATION | MB_APPLMODAL | MB_TOPMOST, GSTR_APPNAME,
//To Here Sept. 15, 2000
LS(STR_ERR_CEDITVIEW_CMD01)
) ){
/* 共通設定 プロパティシート */
if( !CEditApp::getInstance()->OpenPropertySheet( ID_PROPCOM_PAGENUM_HELPER ) ){
return;
}
goto retry;
}
// Jun. 15, 2000 genta
else{
return;
}
}
CNativeW cmemCurText;
const TCHAR* helpfile = CHelpManager().GetExtWinHelp( &(GetDocument()->m_cDocType.GetDocumentAttribute()) );
/* 現在カーソル位置単語または選択範囲より検索等のキーを取得 */
m_pCommanderView->GetCurrentTextForSearch( cmemCurText, false );
TCHAR path[_MAX_PATH];
if( _IS_REL_PATH( helpfile ) ){
// 2003.06.23 Moca 相対パスは実行ファイルからのパス
// 2007.05.21 ryoji 相対パスは設定ファイルからのパスを優先
GetInidirOrExedir( path, helpfile );
}else{
auto_strcpy( path, helpfile );
}
// 2012.09.26 Moca HTMLHELP対応
TCHAR szExt[_MAX_EXT];
_tsplitpath( path, NULL, NULL, NULL, szExt );
if( 0 == _tcsicmp(szExt, _T(".chi")) || 0 == _tcsicmp(szExt, _T(".chm")) || 0 == _tcsicmp(szExt, _T(".col")) ){
std::wstring pathw = to_wchar(path);
Command_EXTHTMLHELP( pathw.c_str(), cmemCurText.GetStringPtr() );
}else{
::WinHelp( m_pCommanderView->m_hwndParent, path, HELP_KEY, (ULONG_PTR)cmemCurText.GetStringPtr() );
}
return;
}
示例2: ReadLineW
wstring CTextInputStream::ReadLineW()
{
//$$ 非効率だけど今のところは許して。。
CNativeW line;
line.AllocStringBuffer(60);
for (;;) {
int c=getc(GetFp());
if(c==EOF)break; //EOFで終了
if(c=='\r'){ c=getc(GetFp()); if(c!='\n')ungetc(c,GetFp()); break; } //"\r" または "\r\n" で終了
if(c=='\n')break; //"\n" で終了
if( line._GetMemory()->capacity() < line._GetMemory()->GetRawLength() + 10 ){
line._GetMemory()->AllocBuffer( line._GetMemory()->GetRawLength() * 2 );
}
line._GetMemory()->AppendRawData(&c,sizeof(char));
}
//UTF-8 → UNICODE
if(m_bIsUtf8){
CUtf8::UTF8ToUnicode(*(line._GetMemory()), &line);
}
//Shift_JIS → UNICODE
else{
CShiftJis::SJISToUnicode(*(line._GetMemory()), &line);
}
return wstring().assign( line.GetStringPtr(), line.GetStringLength() ); // EOL まで NULL 文字も含める
}
示例3: UnicodeToEUC
EConvertResult CEuc::UnicodeToEUC(const CNativeW& cSrc, CMemory* pDstMem)
{
// エラー状態
bool bError = false;
const wchar_t* pSrc = cSrc.GetStringPtr();
int nSrcLen = cSrc.GetStringLength();
// 必要なバッファサイズを調べてメモリを確保
char* pDst;
try{
pDst = new char[nSrcLen * 2];
}catch( ... ){
pDst = NULL;
}
if( pDst == NULL ){
return RESULT_FAILURE;
}
// 変換
int nDstLen = UniToEucjp( pSrc, nSrcLen, pDst, &bError );
// pDstMem を更新
pDstMem->SetRawDataHoldBuffer( pDst, nDstLen );
// 後始末
delete [] pDst;
if( bError == false ){
return RESULT_COMPLETE;
}else{
return RESULT_LOSESOME;
}
}
示例4: Command_GREP_REPLACE_DLG
/*! GREP置換ダイアログの表示
*/
void CViewCommander::Command_GREP_REPLACE_DLG( void )
{
CNativeW cmemCurText;
CDlgGrepReplace& cDlgGrepRep = GetEditWindow()->m_cDlgGrepReplace;
// 複数Grepウィンドウを使い分けている場合などに影響しないように、未設定のときだけHistoryを見る
bool bGetHistory = cDlgGrepRep.m_bSetText == false;
m_pCommanderView->GetCurrentTextForSearchDlg( cmemCurText, bGetHistory );
if( 0 < cmemCurText.GetStringLength() ){
cDlgGrepRep.m_strText = cmemCurText.GetStringPtr();
cDlgGrepRep.m_bSetText = true;
}
if( 0 < GetDllShareData().m_sSearchKeywords.m_aReplaceKeys.size() ){
if( cDlgGrepRep.m_nReplaceKeySequence < GetDllShareData().m_Common.m_sSearch.m_nReplaceKeySequence ){
cDlgGrepRep.m_strText2 = GetDllShareData().m_sSearchKeywords.m_aReplaceKeys[0];
}
}
int nRet = cDlgGrepRep.DoModal( G_AppInstance(), m_pCommanderView->GetHwnd(), GetDocument()->m_cDocFile.GetFilePath(), (LPARAM)m_pCommanderView );
if( !nRet ){
return;
}
HandleCommand(F_GREP_REPLACE, TRUE, 0, 0, 0, 0); // GREPコマンドの発行
}
示例5: out
/*! 外部ファイルを指定でのファイルを表示
*/
BOOL CEditView::MakeDiffTmpFile2( TCHAR* tmpName, const TCHAR* orgName, ECodeType code, ECodeType saveCode )
{
//一時
TCHAR* pszTmpName = _ttempnam( NULL, SAKURA_DIFF_TEMP_PREFIX );
if( NULL == pszTmpName ){
WarningMessage( NULL, LS(STR_DIFF_FAILED) );
return FALSE;
}
_tcscpy( tmpName, pszTmpName );
free( pszTmpName );
bool bBom = false;
const STypeConfigMini* typeMini;
CDocTypeManager().GetTypeConfigMini( CDocTypeManager().GetDocumentTypeOfPath( orgName ), &typeMini );
CFileLoad cfl( typeMini->m_encoding );
CTextOutputStream out(tmpName, saveCode, true, false);
if(!out){
WarningMessage( NULL, LS(STR_DIFF_FAILED_TEMP) );
return FALSE;
}
try{
bool bBigFile;
#ifdef _WIN64
bBigFile = true;
#else
bBigFile = false;
#endif
cfl.FileOpen( orgName, bBigFile, code, GetDllShareData().m_Common.m_sFile.GetAutoMIMEdecode(), &bBom );
CNativeW cLine;
CEol cEol;
while( RESULT_FAILURE != cfl.ReadLine( &cLine, &cEol ) ) {
const wchar_t* pLineData;
CLogicInt nLineLen;
pLineData= cLine.GetStringPtr(&nLineLen);
if( 0 == nLineLen || NULL == pLineData ) break;
if( bBom ){
CNativeW cLine2(L"\ufeff");
cLine2.AppendString(pLineData, nLineLen);
out.WriteString(cLine2.GetStringPtr(), cLine2.GetStringLength());
bBom = false;
}else{
out.WriteString(pLineData,nLineLen);
}
}
if( bBom ){
out.WriteString(L"\ufeff", 1);
}
}
catch(...){
out.Close();
_tunlink( tmpName ); //関数の実行に失敗したとき、一時ファイルの削除は関数内で行う。
WarningMessage( NULL, LS(STR_DIFF_FAILED_TEMP) );
return FALSE;
}
return TRUE;
}
示例6: IsEqual
/* 等しい内容か */
bool CNativeW::IsEqual( const CNativeW& cmem1, const CNativeW& cmem2 )
{
if(&cmem1==&cmem2)return true;
const wchar_t* psz1;
const wchar_t* psz2;
int nLen1;
int nLen2;
psz1 = cmem1.GetStringPtr( &nLen1 );
psz2 = cmem2.GetStringPtr( &nLen2 );
if( nLen1 == nLen2 ){
if( 0 == wmemcmp( psz1, psz2, nLen1 ) ){
return true;
}
}
return false;
}
示例7: ReadProfileRes
/*! Profileをリソースから読み出す
@param pName [in] リソース名
@param pType [in] リソースタイプ
@retval true 成功
@retval false 失敗
@date 2010/5/19 MainMenu用に作成
1行300文字までに制限
*/
bool CProfile::ReadProfileRes( const TCHAR* pName, const TCHAR* pType, std::vector<std::wstring>* pData )
{
static const BYTE UTF8_BOM[]={0xEF,0xBB,0xBF};
HRSRC hRsrc;
HGLOBAL hGlobal;
size_t nSize;
char* psMMres;
char* p;
char sLine[300+1];
char* pn;
size_t lnsz;
wstring line;
CMemory cmLine;
CNativeW cmLineW;
m_strProfileName = _T("-Res-");
if (( hRsrc = ::FindResource( 0, pName, pType )) != NULL
&& ( hGlobal = ::LoadResource( 0, hRsrc )) != NULL
&& ( psMMres = (char *)::LockResource(hGlobal)) != NULL
&& ( nSize = (size_t)::SizeofResource( 0, hRsrc )) != 0) {
p = psMMres;
if (nSize >= sizeof(UTF8_BOM) && memcmp( p, UTF8_BOM, sizeof(UTF8_BOM) )==0) {
// Skip BOM
p += sizeof(UTF8_BOM);
}
for (; p < psMMres + nSize ; p = pn) {
// 1行切り取り(長すぎた場合切捨て)
pn = strpbrk(p, "\n");
if (pn == NULL) {
// 最終行
pn = psMMres + nSize;
}
else {
pn++;
}
lnsz = (pn-p)<=300 ? (pn-p) : 300;
memcpy(sLine, p, lnsz);
sLine[lnsz] = '\0';
if (sLine[lnsz-1] == '\n') sLine[--lnsz] = '\0';
if (sLine[lnsz-1] == '\r') sLine[--lnsz] = '\0';
// UTF-8 -> UNICODE
cmLine.SetRawDataHoldBuffer( sLine, lnsz );
CUtf8::UTF8ToUnicode( cmLine, &cmLineW );
line = cmLineW.GetStringPtr();
if( pData ){
pData->push_back(line);
}else{
//解析
ReadOneline(line);
}
}
}
return true;
}
示例8: CopyCurLine
/*!
カーソル行をクリップボードにコピーする
@date 2007.10.08 ryoji 新規(Command_COPY()から処理抜き出し)
*/
void CEditView::CopyCurLine(
bool bAddCRLFWhenCopy, //!< [in] 折り返し位置に改行コードを挿入するか?
EEolType neweol, //!< [in] コピーするときのEOL。
bool bEnableLineModePaste //!< [in] ラインモード貼り付けを可能にする
)
{
if( GetSelectionInfo().IsTextSelected() ){
return;
}
const CLayout* pcLayout = m_pcEditDoc->m_cLayoutMgr.SearchLineByLayoutY( GetCaret().GetCaretLayoutPos().y );
if( NULL == pcLayout ){
return;
}
/* クリップボードに入れるべきテキストデータを、cmemBufに格納する */
CNativeW cmemBuf;
cmemBuf.SetString( pcLayout->GetPtr(), pcLayout->GetLengthWithoutEOL() );
if( pcLayout->GetLayoutEol().GetLen() != 0 ){
cmemBuf.AppendString(
( neweol == EOL_UNKNOWN ) ?
pcLayout->GetLayoutEol().GetValue2() : CEol(neweol).GetValue2()
);
}else if( bAddCRLFWhenCopy ){ // 2007.10.08 ryoji bAddCRLFWhenCopy対応処理追加
cmemBuf.AppendString(
( neweol == EOL_UNKNOWN ) ?
WCODE::CRLF : CEol(neweol).GetValue2()
);
}
/* クリップボードにデータcmemBufの内容を設定 */
BOOL bSetResult = MySetClipboardData(
cmemBuf.GetStringPtr(),
cmemBuf.GetStringLength(),
false,
bEnableLineModePaste
);
if( !bSetResult ){
ErrorBeep();
}
}
示例9: Command_GREP_DIALOG
/*! GREPダイアログの表示
@date 2005.01.10 genta CEditView_Commandより移動
@author Yazaki
*/
void CViewCommander::Command_GREP_DIALOG( void )
{
CNativeW cmemCurText;
// 2014.07.01 複数Grepウィンドウを使い分けている場合などに影響しないように、未設定のときだけHistoryを見る
bool bGetHistory = GetEditWindow()->m_cDlgGrep.m_bSetText == false;
/* 現在カーソル位置単語または選択範囲より検索等のキーを取得 */
bool bSet = m_pCommanderView->GetCurrentTextForSearchDlg( cmemCurText, bGetHistory ); // 2006.08.23 ryoji ダイアログ専用関数に変更
if( bSet ){
GetEditWindow()->m_cDlgGrep.m_strText = cmemCurText.GetStringPtr();
GetEditWindow()->m_cDlgGrep.m_bSetText = true;
}
/* Grepダイアログの表示 */
int nRet = GetEditWindow()->m_cDlgGrep.DoModal( G_AppInstance(), m_pCommanderView->GetHwnd(), GetDocument()->m_cDocFile.GetFilePath() );
// MYTRACE( _T("nRet=%d\n"), nRet );
if( !nRet ){
return;
}
HandleCommand(F_GREP, true, 0, 0, 0, 0); // GREPコマンドの発行
}
示例10: DoDecode
/* Uudecode (デコード)*/
bool CDecode_UuDecode::DoDecode( const CNativeW& pcSrc, CMemory* pcDst )
{
const WCHAR *psrc, *pline;
int nsrclen;
char *pw, *pw_base;
int nlinelen, ncuridx;
CEol ceol;
bool bsuccess = false;
pcDst->Clear();
psrc = pcSrc.GetStringPtr();
nsrclen = pcSrc.GetStringLength();
if( nsrclen < 1 ){
pcDst->_AppendSz("");
return false;
}
pcDst->AllocBuffer( (nsrclen / 4) * 3 + 10 );
pw_base = pw = static_cast<char *>( pcDst->GetRawPtr() );
// 先頭の改行・空白文字をスキップ
for( ncuridx = 0; ncuridx < nsrclen; ++ncuridx ){
WCHAR c = psrc[ncuridx];
if( !WCODE::IsLineDelimiterBasic(c) && c != L' ' && c != L'\t' ){
break;
}
}
// ヘッダーを解析
pline = GetNextLineW( psrc, nsrclen, &nlinelen, &ncuridx, &ceol, false );
if( !CheckUUHeader(pline, nlinelen, m_aFilename) ){
pcDst->_AppendSz("");
return false;
}
// ボディーを処理
while( (pline = GetNextLineW(psrc, nsrclen, &nlinelen, &ncuridx, &ceol, false)) != NULL ){
if( ceol.GetType() != EOL_CRLF ){
pcDst->_AppendSz("");
return false;
}
if( nlinelen < 1 ){
pcDst->_AppendSz("");
return false;
}
if( nlinelen == 1 ){
// データの最後である場合
if( pline[0] == L' ' || pline[0] == L'`' || pline[0] == L'~' ){
bsuccess = true;
break;
}
}
pw += _DecodeUU_line( pline, nlinelen, pw );
}
if( bsuccess == false ){
return false;
}
pline += 3; // '`' 'CR' 'LF' の分をスキップ
// フッターを解析
if( !CheckUUFooter(pline, nsrclen-ncuridx) ){
pcDst->_AppendSz("");
return false;
}
pcDst->_SetRawLength( pw - pw_base );
return true;
}
示例11: LoadKeyMacro
//.........这里部分代码省略.........
MB_OK | MB_ICONSTOP | MB_TOPMOST,
MACRO_ERROR_TITLE,
LS(STR_ERR_DLGKEYMACMGR5),
line,
szFuncName,
nArgs + 1,
cQuote
);
m_nReady = false;
nEnd = i - 1; // nEndは終わりの次の文字(')
break;
}
}
// Jun. 16, 2002 genta
if( !m_nReady ){
break;
}
CNativeW cmemWork;
cmemWork.SetString( strLine.c_str() + nBgn, nEnd - nBgn );
// 2014.01.28 「"\\'"」のような場合の不具合を修正
cmemWork.Replace( L"\\\\", L"\\\1" ); // 一時置換(最初に必要)
cmemWork.Replace( LTEXT("\\\'"), LTEXT("\'") );
// Jun. 16, 2002 genta double quotationもエスケープ解除
cmemWork.Replace( LTEXT("\\\""), LTEXT("\"") );
cmemWork.Replace( L"\\r", L"\r" );
cmemWork.Replace( L"\\n", L"\n" );
cmemWork.Replace( L"\\t", L"\t" );
{
// \uXXXX 置換
size_t nLen = cmemWork.GetStringLength();
size_t nBegin = 0;
const wchar_t* p = cmemWork.GetStringPtr();
CNativeW cmemTemp;
for( size_t n = 0; n < nLen; n++ ){
if( n + 1 < nLen && p[n] == L'\\' && p[n+1] == L'u' ){
size_t k;
for( k = n + 2; k < nLen && k < n + 2 + 4
&& (WCODE::Is09(p[k])
|| (L'a' <= p[k] && p[k] <= L'f')
|| (L'A' <= p[k] && p[k] <= L'F')); k++ ){
}
cmemTemp.AppendString( p + nBegin, n - nBegin );
nBegin = k;
if( 0 < k - n - 2 ){
wchar_t hex[5];
wcsncpy( hex, &p[n+2], k - n - 2 );
hex[k - n - 2] = L'\0';
wchar_t* pEnd = NULL;
wchar_t c = static_cast<wchar_t>(wcstol(hex, &pEnd, 16));
cmemTemp.AppendString( &c, 1 );
}
n = k - 1;
}
}
if( nBegin != 0 ){
if( 0 < nLen - nBegin ){
cmemTemp.AppendString( p + nBegin, nLen - nBegin );
}
cmemWork.swap( cmemTemp );
}
}
cmemWork.Replace( L"\\\1", L"\\" ); // 一時置換を\に戻す(最後でないといけない)
macro->AddStringParam( cmemWork.GetStringPtr(), cmemWork.GetStringLength() ); // 引数を文字列として追加
}
示例12: SetDocLineString
void CDocLine::SetDocLineString(const CNativeW& cData)
{
SetDocLineString(cData.GetStringPtr(), cData.GetStringLength());
}
示例13: AppendNativeData
//! バッファの最後にデータを追加する
void CNativeW::AppendNativeData( const CNativeW& cmemData )
{
CNative::AppendRawData(cmemData.GetStringPtr(), cmemData.GetRawLength());
}
示例14: ReadFile_To_CDocLineMgr
/*!
ファイルを読み込んで格納する(分割読み込みテスト版)
@version 2.0
@note Windows用にコーディングしてある
@retval TRUE 正常読み込み
@retval FALSE エラー(またはユーザによるキャンセル?)
@date 2002/08/30 Moca 旧ReadFileを元に作成 ファイルアクセスに関する部分をCFileLoadで行う
@date 2003/07/26 ryoji BOMの状態の取得を追加
*/
EConvertResult CReadManager::ReadFile_To_CDocLineMgr(
CDocLineMgr* pcDocLineMgr, //!< [out]
const SLoadInfo& sLoadInfo, //!< [in]
SFileInfo* pFileInfo //!< [out]
)
{
LPCTSTR pszPath = sLoadInfo.cFilePath.c_str();
// 文字コード種別
const STypeConfigMini* type;
CDocTypeManager().GetTypeConfigMini( sLoadInfo.nType, &type );
ECodeType eCharCode = sLoadInfo.eCharCode;
if (CODE_AUTODETECT == eCharCode) {
CCodeMediator cmediator( type->m_encoding );
eCharCode = cmediator.CheckKanjiCodeOfFile( pszPath );
}
if (!IsValidCodeOrCPType( eCharCode )) {
eCharCode = type->m_encoding.m_eDefaultCodetype; // 2011.01.24 ryoji デフォルト文字コード
}
bool bBom;
if (eCharCode == type->m_encoding.m_eDefaultCodetype) {
bBom = type->m_encoding.m_bDefaultBom; // 2011.01.24 ryoji デフォルトBOM
}
else{
bBom = CCodeTypeName( eCharCode ).IsBomDefOn();
}
pFileInfo->SetCodeSet( eCharCode, bBom );
/* 既存データのクリア */
pcDocLineMgr->DeleteAllLine();
/* 処理中のユーザー操作を可能にする */
if( !::BlockingHook( NULL ) ){
return RESULT_FAILURE; //######INTERRUPT
}
EConvertResult eRet = RESULT_COMPLETE;
try{
CFileLoad cfl(type->m_encoding);
bool bBigFile;
#ifdef _WIN64
bBigFile = true;
#else
bBigFile = false;
#endif
// ファイルを開く
// ファイルを閉じるにはFileCloseメンバ又はデストラクタのどちらかで処理できます
// Jul. 28, 2003 ryoji BOMパラメータ追加
cfl.FileOpen( pszPath, bBigFile, eCharCode, GetDllShareData().m_Common.m_sFile.GetAutoMIMEdecode(), &bBom );
pFileInfo->SetBomExist( bBom );
/* ファイル時刻の取得 */
FILETIME FileTime;
if( cfl.GetFileTime( NULL, NULL, &FileTime ) ){
pFileInfo->SetFileTime( FileTime );
}
// ReadLineはファイルから 文字コード変換された1行を読み出します
// エラー時はthrow CError_FileRead を投げます
int nLineNum = 0;
CEol cEol;
CNativeW cUnicodeBuffer;
EConvertResult eRead;
while( RESULT_FAILURE != (eRead = cfl.ReadLine( &cUnicodeBuffer, &cEol )) ){
if(eRead==RESULT_LOSESOME){
eRet = RESULT_LOSESOME;
}
const wchar_t* pLine = cUnicodeBuffer.GetStringPtr();
int nLineLen = cUnicodeBuffer.GetStringLength();
++nLineNum;
CDocEditAgent(pcDocLineMgr).AddLineStrX( pLine, nLineLen );
//経過通知
if(nLineNum%512==0){
NotifyProgress(cfl.GetPercent());
// 処理中のユーザー操作を可能にする
if( !::BlockingHook( NULL ) ){
throw CAppExitException(); //中断検出
}
}
}
// ファイルをクローズする
cfl.FileClose();
}
catch(CAppExitException){
//WM_QUITが発生した
return RESULT_FAILURE;
}
catch( CError_FileOpen ){
//.........这里部分代码省略.........
示例15: ReplaceData
/* 指定範囲のデータを置換(削除 & データを挿入)
Fromを含む位置からToの直前を含むデータを削除する
Fromの位置へテキストを挿入する
*/
void CSearchAgent::ReplaceData( DocLineReplaceArg* pArg )
{
// MY_RUNNINGTIMER( cRunningTimer, "CDocLineMgr::ReplaceData()" );
/* 挿入によって増えた行の数 */
pArg->nInsLineNum = CLogicInt(0);
/* 削除した行の総数 */
pArg->nDeletedLineNum = CLogicInt(0);
/* 削除されたデータ */
if( pArg->pcmemDeleted ){
pArg->pcmemDeleted->clear();
}
CDocLine* pCDocLine;
CDocLine* pCDocLinePrev;
CDocLine* pCDocLineNext;
int nWorkPos;
int nWorkLen;
const wchar_t* pLine;
int nLineLen;
int i;
CLogicInt nAllLinesOld;
int nProgress;
CDocLine::MarkType markNext;
// May 15, 2000
HWND hwndCancel = NULL; // 初期化
HWND hwndProgress = NULL; // 初期化
pArg->ptNewPos = pArg->sDelRange.GetFrom();
/* 大量のデータを操作するとき */
CDlgCancel* pCDlgCancel = NULL;
class CDLgCandelCloser{
CDlgCancel*& m_pDlg;
public:
CDLgCandelCloser(CDlgCancel*& pDlg): m_pDlg(pDlg){}
~CDLgCandelCloser(){
if( NULL != m_pDlg ){
// 進捗ダイアログを表示しない場合と同じ動きになるようにダイアログは遅延破棄する
// ここで pCDlgCancel を delete すると delete から戻るまでの間に
// ダイアログ破棄 -> 編集画面へフォーカス移動 -> キャレット位置調整
// まで一気に動くので無効なレイアウト情報参照で異常終了することがある
m_pDlg->DeleteAsync(); // 自動破棄を遅延実行する // 2008.05.28 ryoji
}
}
};
CDLgCandelCloser closer(pCDlgCancel);
const CLogicInt nDelLines = pArg->sDelRange.GetTo().y - pArg->sDelRange.GetFrom().y;
const CLogicInt nEditLines = std::max<CLogicInt>(CLogicInt(1), nDelLines + CLogicInt(pArg->pInsData ? pArg->pInsData->size(): 0));
if( 3000 < nEditLines ){
/* 進捗ダイアログの表示 */
pCDlgCancel = new CDlgCancel;
if( NULL != ( hwndCancel = pCDlgCancel->DoModeless( ::GetModuleHandle( NULL ), NULL, IDD_OPERATIONRUNNING ) ) ){
hwndProgress = ::GetDlgItem( hwndCancel, IDC_PROGRESS );
Progress_SetRange( hwndProgress, 0, 101 );
Progress_SetPos( hwndProgress, 0 );
}
}
int nProgressOld = 0;
// バッファを確保
if( pArg->pcmemDeleted ){
pArg->pcmemDeleted->reserve( pArg->sDelRange.GetTo().y + CLogicInt(1) - pArg->sDelRange.GetFrom().y );
}
// 2012.01.10 行内の削除&挿入のときの操作を1つにする
bool bChangeOneLine = false; // 行内の挿入
bool bInsOneLine = false;
bool bLastEOLReplace = false; // 「最後改行」を「最後改行」で置換
if( pArg->pInsData && 0 < pArg->pInsData->size() ){
const CNativeW& cmemLine = pArg->pInsData->back().cmemLine;
int nLen = cmemLine.GetStringLength();
const wchar_t* pInsLine = cmemLine.GetStringPtr();
if( 0 < nLen && WCODE::IsLineDelimiter(pInsLine[nLen - 1], GetDllShareData().m_Common.m_sEdit.m_bEnableExtEol) ){
// 行挿入
bLastEOLReplace = true; // 仮。後で修正
}else{
if( 1 == pArg->pInsData->size() ){
bChangeOneLine = true; // 「abc\ndef」=>「123」のような置換もtrueなのに注意
}
}
}
const wchar_t* pInsData = L"";
int nInsLen = 0;
int nSetSeq = 0;
if( bChangeOneLine ){
nInsLen = pArg->pInsData->back().cmemLine.GetStringLength();
pInsData = pArg->pInsData->back().cmemLine.GetStringPtr();
nSetSeq = pArg->pInsData->back().nSeq;
}
/* 現在行の情報を得る */
pCDocLine = m_pcDocLineMgr->GetLine( pArg->sDelRange.GetTo().GetY2() );
i = pArg->sDelRange.GetTo().y;
if( 0 < pArg->sDelRange.GetTo().y && NULL == pCDocLine ){
pCDocLine = m_pcDocLineMgr->GetLine( pArg->sDelRange.GetTo().GetY2() - CLogicInt(1) );
//.........这里部分代码省略.........