diff --git a/help/sakura/res/HLP000105.html b/help/sakura/res/HLP000105.html
index 2c002c9585..457ffdea67 100644
--- a/help/sakura/res/HLP000105.html
+++ b/help/sakura/res/HLP000105.html
@@ -23,6 +23,7 @@
キーワードヘルプ
・キーワードは複数指定可能です(同義語)。半角カンマで区切って下さい
・'\n'で訳語に改行を入れられます
+・'\x5C'で訳語に'\'を入れられます。'\x5c'では入れられないので注意して下さい
・一つの定義(行)は、10キロバイト程度までです
・一桁目が';'ならコメント行とみなします
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..7af4b58136 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"\\x5C", 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_ */