diff --git a/sakura_core/cmd/CViewCommander_CustMenu.cpp b/sakura_core/cmd/CViewCommander_CustMenu.cpp index f55ead6eca..7ca5db467e 100644 --- a/sakura_core/cmd/CViewCommander_CustMenu.cpp +++ b/sakura_core/cmd/CViewCommander_CustMenu.cpp @@ -23,33 +23,21 @@ /* 右クリックメニュー */ void CViewCommander::Command_MENU_RBUTTON( void ) { - int nId; - int nLength; -// HGLOBAL hgClip; -// char* pszClip; - int i; /* ポップアップメニュー(右クリック) */ - nId = m_pCommanderView->CreatePopUpMenu_R(); + auto nId = m_pCommanderView->CreatePopUpMenu_R(); if( 0 == nId ){ return; } switch( nId ){ case IDM_COPYDICINFO: { - nLength = m_pCommanderView->m_cTipWnd.m_cInfo.GetStringLength(); - const WCHAR* pszStr = m_pCommanderView->m_cTipWnd.m_cInfo.GetStringPtr(); - WCHAR* pszWork = _wcsdup( pszStr ); + CNativeW cInfo = m_pCommanderView->m_cTipWnd.GetInfoText(); + + // 貼り付けで扱いやすいように、改行記号を CR+LF に置換する + cInfo.Replace( L"\n", L"\r\n" ); - // 見た目と同じように、\n を CR+LFへ変換する - for( i = 0; i < nLength ; ++i){ - if( pszWork[i] == L'\\' && pszWork[i + 1] == L'n'){ - pszWork[i] = WCODE::CR; - pszWork[i + 1] = WCODE::LF; - } - } /* クリップボードにデータを設定 */ - m_pCommanderView->MySetClipboardData( pszWork, nLength, false ); - free( pszWork ); + m_pCommanderView->MySetClipboardData( cInfo.GetStringPtr(), cInfo.GetStringLength(), false ); break; } @@ -68,7 +56,6 @@ void CViewCommander::Command_MENU_RBUTTON( void ) default: /* コマンドコードによる処理振り分け */ -// HandleCommand( nId, true, 0, 0, 0, 0 ); ::PostMessageCmd( GetMainWindow(), WM_COMMAND, MAKELONG( nId, 0 ), (LPARAM)NULL ); break; } diff --git a/sakura_core/view/CEditView.cpp b/sakura_core/view/CEditView.cpp index f335fc79ea..5e73ac9406 100644 --- a/sakura_core/view/CEditView.cpp +++ b/sakura_core/view/CEditView.cpp @@ -1296,7 +1296,7 @@ VOID CEditView::OnTimer( bool bHide; if( MiniMapCursorLineTip( &po, &rc, &bHide ) ){ m_cTipWnd.m_bAlignLeft = true; - m_cTipWnd.Show( po.x, po.y + m_pcEditWnd->GetActiveView().GetTextMetrics().GetHankakuHeight(), NULL ); + m_cTipWnd.Show( po.x, po.y + m_pcEditWnd->GetActiveView().GetTextMetrics().GetHankakuHeight() ); }else{ if( bHide && 0 == m_dwTipTimer ){ m_cTipWnd.Hide(); @@ -1305,7 +1305,7 @@ VOID CEditView::OnTimer( }else{ if( FALSE != KeyWordHelpSearchDict( LID_SKH_ONTIMER, &po, &rc ) ){ // 2006.04.10 fon /* 辞書Tipを表示 */ - m_cTipWnd.Show( po.x, po.y + GetTextMetrics().GetHankakuHeight(), NULL ); + m_cTipWnd.Show( po.x, po.y + GetTextMetrics().GetHankakuHeight() ); } } } @@ -2662,7 +2662,7 @@ bool CEditView::ShowKeywordHelp( POINT po, LPCWSTR pszHelp, LPRECT prcHokanWin) // 2001/06/19 End /* 辞書Tipを表示 */ - m_cTipWnd.Show( po.x, po.y , NULL , &rcTipWin); + m_cTipWnd.Show( po.x, po.y, &rcTipWin ); return true; } } diff --git a/sakura_core/view/CEditView_Search.cpp b/sakura_core/view/CEditView_Search.cpp index 10e27b90ae..e628162404 100644 --- a/sakura_core/view/CEditView_Search.cpp +++ b/sakura_core/view/CEditView_Search.cpp @@ -133,9 +133,8 @@ BOOL CEditView::KeySearchCore( const CNativeW* pcmemCurText ) m_pTypeData->m_KeyHelpArr[i].m_szPath, &nLine ); - if(nSearchResult){ - /* 該当するキーがある */ - LPWSTR pszWork = pcmemRefText->GetStringPtr(); + /* 該当するキーがある */ + if( nSearchResult ){ /* 有効になっている辞書を全部なめて、ヒットの都度説明の継ぎ増し */ if(m_pTypeData->m_bUseKeyHelpAllSearch){ /* ヒットした次の辞書も検索 */ // 2006.04.10 fon /* バッファに前のデータが詰まっていたらseparator挿入 */ @@ -155,8 +154,11 @@ BOOL CEditView::KeySearchCore( const CNativeW* pcmemCurText ) if(m_pTypeData->m_bUseKeyHelpPrefix){ /* 選択範囲で前方一致検索 */ m_cTipWnd.m_cInfo.AppendString( pcmemRefKey->GetStringPtr() ); m_cTipWnd.m_cInfo.AppendString( L" >>\n" ); - }/* 調査した「意味」を挿入 */ - m_cTipWnd.m_cInfo.AppendString( pszWork ); + } + + /* 調査した「意味」を挿入 */ + m_cTipWnd.m_cInfo.AppendString( UnEscapeInfoText( *pcmemRefText ) ); + delete pcmemRefText; delete pcmemRefKey; // 2006.07.02 genta /* タグジャンプ用の情報を残す */ @@ -178,7 +180,8 @@ BOOL CEditView::KeySearchCore( const CNativeW* pcmemCurText ) } /* 調査した「意味」を挿入 */ - m_cTipWnd.m_cInfo.AppendString( pszWork ); + m_cTipWnd.m_cInfo.AppendString( UnEscapeInfoText( *pcmemRefText ) ); + delete pcmemRefText; delete pcmemRefKey; // 2006.07.02 genta /* タグジャンプ用の情報を残す */ diff --git a/sakura_core/window/CTipWnd.cpp b/sakura_core/window/CTipWnd.cpp index 4281ead03a..874c7e4ec1 100644 --- a/sakura_core/window/CTipWnd.cpp +++ b/sakura_core/window/CTipWnd.cpp @@ -24,6 +24,14 @@ // ダミー文字列 static constexpr WCHAR szDummy[] = { L" " }; +/* Tipの内容データを設定するためにエスケープ解除を行う */ +const WCHAR* UnEscapeInfoText( CNativeW& cInfo ) +{ + cInfo.Replace( L"\\n", L"\n" ); + cInfo.Replace( L"\\\\", L"\\" ); + return cInfo.GetStringPtr(); +} + /* CTipWndクラス デストラクタ */ CTipWnd::CTipWnd() : CWnd(L"::CTipWnd") @@ -98,15 +106,11 @@ void CTipWnd::AfterCreateWindow( void ) } /* Tipを表示 */ -void CTipWnd::Show( int nX, int nY, const WCHAR* szText, RECT* pRect ) +void CTipWnd::Show( int nX, int nY, RECT* pRect ) { HDC hdc; RECT rc; - if( NULL != szText ){ - m_cInfo.SetString( szText ); - } - hdc = ::GetDC( GetHwnd() ); // サイズを計算済み 2001/06/19 asa-o @@ -166,7 +170,7 @@ void CTipWnd::ComputeWindowSize( const bool isEndOfText = ( pszText[i] == '\0' ); // iの位置にNUL終端、または"\n"がある場合 if ( isEndOfText - || ( i + 1 < cchText && pszText[i] == '\\' && pszText[i + 1] == 'n' ) ) { + || pszText[i] == '\n' ) { // 計測結果を格納する矩形 CMyRect rc; // 計測対象の文字列がブランクでない場合 @@ -197,7 +201,7 @@ void CTipWnd::ComputeWindowSize( } // 次の行の開始位置を設定する - nLineBgn = i + 2; // "\\n" の文字数 + nLineBgn = i + 1; // "\n" の文字数 i = nLineBgn; }else{ // 現在位置の文字がTCHAR単位で何文字に当たるか計算してインデックスを進める @@ -247,7 +251,7 @@ void CTipWnd::DrawTipText( const bool isEndOfText = ( pszText[i] == '\0' ); // iの位置にNUL終端、または"\n"がある場合 if ( isEndOfText - || ( i + 1 < cchText && pszText[i] == '\\' && pszText[i + 1] == 'n' ) ) { + || pszText[i] == '\n' ) { int nHeight; // 計測対象の文字列がブランクでない場合 if ( 0 < i - nLineBgn ) { @@ -269,7 +273,7 @@ void CTipWnd::DrawTipText( } // 次の行の開始位置を設定する - nLineBgn = i + 2; // "\\n" の文字数 + nLineBgn = i + 1; // "\n" の文字数 i = nLineBgn; }else{ // 現在位置の文字がTCHAR単位で何文字に当たるか計算してインデックスを進める diff --git a/sakura_core/window/CTipWnd.h b/sakura_core/window/CTipWnd.h index cd6e047328..034bc5ac56 100644 --- a/sakura_core/window/CTipWnd.h +++ b/sakura_core/window/CTipWnd.h @@ -21,7 +21,8 @@ class CTipWnd; #include "CWnd.h" -#include "mem/CMemory.h" +#include "mem/CNativeW.h" + /*----------------------------------------------------------------------- クラスの宣言 -----------------------------------------------------------------------*/ @@ -38,7 +39,7 @@ class CTipWnd final : public CWnd /* || Attributes & Operations */ - void Show( int nX, int nY, const WCHAR* szText, RECT* pRect = NULL ); /* Tipを表示 */ + void Show( int nX, int nY, RECT* pRect = NULL ); /* Tipを表示 */ void Hide( void ); /* Tipを消す */ void GetWindowSize(LPRECT pRect); // 2001/06/19 asa-o ウィンドウのサイズを得る @@ -74,5 +75,13 @@ class CTipWnd final : public CWnd /* 仮想関数 メッセージ処理 詳しくは実装を参照 */ LRESULT OnPaint(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) override;/* 描画処理 */ + +public: + /* Tipの内容データを取得する */ + const CNativeW& GetInfoText() const { return m_cInfo; } }; + +/* Tipの内容データを設定するためにエスケープ解除を行う */ +const WCHAR* UnEscapeInfoText( CNativeW& cInfo ); + #endif /* SAKURA_CTIPWND_E3DB6CF2_888C_42F5_953E_D923221F0B16_H_ */