ceditview.cpp
来自「日本的开源编辑器源码」· C++ 代码 · 共 2,141 行 · 第 1/5 页
CPP
2,141 行
// add this string into text buffer of application
GlobalUnlock( hstr );
GlobalFree( hstr );
return DefWindowProc( hwnd, uMsg, wParam, lParam );
// return 0;
}else{
return DefWindowProc( hwnd, uMsg, wParam, lParam );
}
case WM_IME_CHAR:
if( FALSE == m_pShareData->m_Common.m_bIsINSMode ){ /* 上書きモードか? */
HandleCommand( F_IME_CHAR, TRUE, wParam, 0, 0, 0 );
}
return 0L;
// if( NULL != m_pcOpeBlk ){ /* 操作ブロック */
// return 1L;
// }
// /* コマンドの実行中 */
// m_bCommandRunning = TRUE;
//
// if( NULL != m_pcOpeBlk ){ /* 操作ブロック */
//// while( NULL != m_pcOpeBlk ){}
// delete m_pcOpeBlk;
// }
// m_pcOpeBlk = new COpeBlk;
//
// Command_IME_CHAR( (WORD)( (((WORD)wParam&0x00ff)<<8) | (((WORD)wParam&0xff00)>>8) ) ); /* 2バイト文字入力 */
//
// /* アンドゥバッファの処理 */
// if( 0 < m_pcOpeBlk->GetNum() ){ /* 操作の数を返す */
// /* 操作の追加 */
// m_pcEditDoc->m_cOpeBuf.AppendOpeBlk( m_pcOpeBlk );
// }else{
// delete m_pcOpeBlk;
// }
// m_pcOpeBlk = NULL;
// m_bCommandRunning = FALSE;
// return 0L;
case WM_KEYUP:
/* キーリピート状態 */
m_bPrevCommand = 0;
return 0L;
// 2004.04.27 Moca From Here ALT+xでALTを押したままだとキーリピートがOFFにならない対策
case WM_SYSKEYUP:
m_bPrevCommand = 0;
// 念のため呼ぶ
return ::DefWindowProc( hwnd, uMsg, wParam, lParam );
// 2004.04.27 To Here
// case WM_MBUTTONDBLCLK:
case WM_LBUTTONDBLCLK:
// MYTRACE( " WM_LBUTTONDBLCLK wParam=%08xh, x=%d y=%d\n", wParam, LOWORD( lParam ), HIWORD( lParam ) );
OnLBUTTONDBLCLK( wParam, (short)LOWORD( lParam ), (short)HIWORD( lParam ) );
return 0L;
// novice 2004/10/11 マウス中ボタン対応
case WM_MBUTTONDOWN:
OnMBUTTONDOWN( wParam, (short)LOWORD( lParam ), (short)HIWORD( lParam ) );
return 0L;
case WM_LBUTTONDOWN:
// case WM_RBUTTONDOWN:
::SetFocus( ::GetParent( m_hwndParent ) );
if( m_nMyIndex != m_pcEditDoc->GetActivePane() ){
/* アクティブなペインを設定 */
m_pcEditDoc->SetActivePane( m_nMyIndex );
}
// MYTRACE( " WM_LBUTTONDOWN wParam=%08xh, x=%d y=%d\n", wParam, LOWORD( lParam ), HIWORD( lParam ) );
OnLBUTTONDOWN( wParam, (short)LOWORD( lParam ), (short)HIWORD( lParam ) );
return 0L;
// case WM_MBUTTONUP:
case WM_LBUTTONUP:
// MYTRACE( " WM_LBUTTONUP wParam=%08xh, x=%d y=%d\n", wParam, LOWORD( lParam ), HIWORD( lParam ) );
OnLBUTTONUP( wParam, (short)LOWORD( lParam ), (short)HIWORD( lParam ) );
return 0L;
case WM_MOUSEMOVE:
OnMOUSEMOVE( wParam, (short)LOWORD( lParam ), (short)HIWORD( lParam ) );
return 0L;
case WM_RBUTTONDBLCLK:
::SetFocus( ::GetParent( m_hwndParent ) );
// MYTRACE( " WM_RBUTTONDBLCLK wParam=%08xh, x=%d y=%d\n", wParam, LOWORD( lParam ), HIWORD( lParam ) );
return 0L;
// case WM_RBUTTONDOWN:
// MYTRACE( " WM_RBUTTONDOWN wParam=%08xh, x=%d y=%d\n", wParam, LOWORD( lParam ), HIWORD( lParam ) );
// OnRBUTTONDOWN( wParam, (short)LOWORD( lParam ), (short)HIWORD( lParam ) );
// if( m_nMyIndex != m_pcEditDoc->GetActivePane() ){
// /* アクティブなペインを設定 */
// m_pcEditDoc->SetActivePane( m_nMyIndex );
// }
// return 0L;
case WM_RBUTTONUP:
// MYTRACE( " WM_RBUTTONUP wParam=%08xh, x=%d y=%d\n", wParam, LOWORD( lParam ), HIWORD( lParam ) );
OnRBUTTONUP( wParam, (short)LOWORD( lParam ), (short)HIWORD( lParam ) );
return 0L;
// novice 2004/10/10 マウスサイドボタン対応
case WM_XBUTTONDOWN:
switch ( HIWORD(wParam) ){
case XBUTTON1:
OnXLBUTTONDOWN( wParam, (short)LOWORD( lParam ), (short)HIWORD( lParam ) );
break;
case XBUTTON2:
OnXRBUTTONDOWN( wParam, (short)LOWORD( lParam ), (short)HIWORD( lParam ) );
break;
}
return 0L;
case WM_VSCROLL:
::SetFocus( ::GetParent( m_hwndParent ) );
// MYTRACE( " WM_VSCROLL nPos=%d\n", GetScrollPos( m_hwndVScrollBar, SB_CTL ) );
// Sep. 11, 2004 genta 同期スクロールの関数化
{
int Scroll = OnVScroll(
(int) LOWORD( wParam ), ((int) HIWORD( wParam )) * m_nVScrollRate );
// シフトキーが押されていないときだけ同期スクロール
if(( ::GetKeyState( VK_SHIFT ) & 0x8000 ) == 0 ){
SyncScrollV( Scroll );
}
}
if( m_nMyIndex != m_pcEditDoc->GetActivePane() ){
/* アクティブなペインを設定 */
m_pcEditDoc->SetActivePane( m_nMyIndex );
}
return 0L;
case WM_HSCROLL:
::SetFocus( ::GetParent( m_hwndParent ) );
// MYTRACE( " WM_HSCROLL nPos=%d\n", GetScrollPos( m_hwndHScrollBar, SB_CTL ) );
// Sep. 11, 2004 genta 同期スクロールの関数化
{
int Scroll = OnHScroll(
(int) LOWORD( wParam ), ((int) HIWORD( wParam )) );
// シフトキーが押されていないときだけ同期スクロール
if(( ::GetKeyState( VK_SHIFT ) & 0x8000 ) == 0 ){
SyncScrollH( Scroll );
}
}
if( m_nMyIndex != m_pcEditDoc->GetActivePane() ){
/* アクティブなペインを設定 */
m_pcEditDoc->SetActivePane( m_nMyIndex );
}
return 0L;
case WM_ENTERMENULOOP:
m_bInMenuLoop = TRUE; /* メニュー モーダル ループに入っています */
/* 辞書Tipが起動されている */
if( 0 == m_dwTipTimer ){
/* 辞書Tipを消す */
m_cTipWnd.Hide();
m_dwTipTimer = ::GetTickCount(); /* 辞書Tip起動タイマー */
}
if( m_bHokan ){
m_pcEditDoc->m_cHokanMgr.Hide();
m_bHokan = FALSE;
}
return 0L;
case WM_EXITMENULOOP:
m_bInMenuLoop = FALSE; /* メニュー モーダル ループに入っています */
return 0L;
case WM_PAINT:
hdc = ::BeginPaint( hwnd, &ps );
OnPaint( hdc, &ps, FALSE );
::EndPaint(hwnd, &ps);
return 0L;
case WM_CLOSE:
// MYTRACE( " WM_CLOSE\n" );
DestroyWindow( hwnd );
return 0L;
case WM_DESTROY:
// CDropTarget::Revoke_DropTarget();
m_pcDropTarget->Revoke_DropTarget();
// ::RevokeDragDrop( m_hWnd );
// ::OleUninitialize();
/* タイマー終了 */
::KillTimer( m_hWnd, IDT_ROLLMOUSE );
// MYTRACE( " WM_DESTROY\n" );
/*
||子ウィンドウの破棄
*/
if( NULL != m_hwndHScrollBar ){
DestroyWindow( m_hwndVScrollBar );
m_hwndVScrollBar = NULL;
}
if( NULL != m_hwndHScrollBar ){
DestroyWindow( m_hwndHScrollBar );
m_hwndHScrollBar = NULL;
}
if( NULL != m_hwndSizeBox ){
DestroyWindow( m_hwndSizeBox );
m_hwndSizeBox = NULL;
}
if( NULL != m_pcsbwVSplitBox ){ /* 垂直分割ボックス */
delete m_pcsbwVSplitBox;
m_pcsbwVSplitBox = NULL;
}
if( NULL != m_pcsbwHSplitBox ){ /* 垂直分割ボックス */
delete m_pcsbwHSplitBox;
m_pcsbwHSplitBox = NULL;
}
m_hWnd = NULL;
return 0L;
case MYWM_DOSPLIT:
nPosX = (int)wParam;
nPosY = (int)lParam;
// MYTRACE( "MYWM_DOSPLIT nPosX=%d nPosY=%d\n", nPosX, nPosY );
::SendMessage( m_hwndParent, MYWM_DOSPLIT, wParam, lParam );
return 0L;
case MYWM_SETACTIVEPANE:
m_pcEditDoc->SetActivePane( m_nMyIndex );
::PostMessage( m_hwndParent, MYWM_SETACTIVEPANE, (WPARAM)m_nMyIndex, 0 );
return 0L;
case MYWM_IME_REQUEST: /* 再変換 by minfu 2002.03.27 */ // 20020331 aroka
//if( (wParam == IMR_RECONVERTSTRING) && IsTextSelected() && ( !m_bBeginBoxSelect) ){
// // lParamにIMEが用意した再変換用構造体のポインタが入っている。
// return RequestedReconversion((PRECONVERTSTRING)lParam);
//}
// 2002.04.09 switch case に変更 minfu
switch ( wParam ){
case IMR_RECONVERTSTRING:
return SetReconvertStruct((PRECONVERTSTRING)lParam, false);
case IMR_CONFIRMRECONVERTSTRING:
return SetSelectionFromReonvert((PRECONVERTSTRING)lParam, false);
}
return 0L;
default:
// << 20020331 aroka 再変換対応 for 95/NT
if( (m_uMSIMEReconvertMsg && (uMsg == m_uMSIMEReconvertMsg))
|| (m_uATOKReconvertMsg && (uMsg == m_uATOKReconvertMsg))){
// 2002.04.08 switch case に変更 minfu
switch ( wParam ){
case IMR_RECONVERTSTRING:
return SetReconvertStruct((PRECONVERTSTRING)lParam, true);
case IMR_CONFIRMRECONVERTSTRING:
return SetSelectionFromReonvert((PRECONVERTSTRING)lParam, true);
}
// if( uMsg == m_uMSIMEReconvertMsg || uMsg == m_uATOKReconvertMsg){
// if( (wParam == IMR_RECONVERTSTRING) && IsTextSelected() && ( !m_bBeginBoxSelect) ){
// // lParamにIMEが用意した再変換用構造体のポインタが入っている。
// return RequestedReconversionW((PRECONVERTSTRING)lParam);
// }
return 0L;
}
// >> by aroka
return DefWindowProc( hwnd, uMsg, wParam, lParam );
}
}
void CEditView::OnMove( int x, int y, int nWidth, int nHeight )
{
MoveWindow( m_hWnd, x, y, nWidth, nHeight, TRUE );
return;
}
/* ウィンドウサイズの変更処理 */
void CEditView::OnSize( int cx, int cy )
{
if( NULL == m_hWnd ){
return;
}
if( cx == 0 && cy == 0 ){
return;
}
int nCxHScroll;
int nCyHScroll;
int nCxVScroll;
int nCyVScroll;
int nVSplitHeight; /* 垂直分割ボックスの高さ */
int nHSplitWidth; /* 水平分割ボックスの幅 */
nVSplitHeight = 0; /* 垂直分割ボックスの高さ */
nHSplitWidth = 0; /* 水平分割ボックスの幅 */
HDC hdc;
nCxHScroll = ::GetSystemMetrics( SM_CXHSCROLL );
nCyHScroll = ::GetSystemMetrics( SM_CYHSCROLL );
nCxVScroll = ::GetSystemMetrics( SM_CXVSCROLL );
nCyVScroll = ::GetSystemMetrics( SM_CYVSCROLL );
hdc = ::GetDC( m_hWnd );
/* 垂直分割ボックス */
if( NULL != m_pcsbwVSplitBox ){
nVSplitHeight = 7;
::MoveWindow( m_pcsbwVSplitBox->m_hWnd, cx - nCxVScroll , 0, nCxVScroll, nVSplitHeight, TRUE );
}
/* 水平分割ボックス */
if( NULL != m_pcsbwHSplitBox ){
nHSplitWidth = 7;
::MoveWindow( m_pcsbwHSplitBox->m_hWnd,0, cy - nCyHScroll, nHSplitWidth, nCyHScroll, TRUE );
}
/* 垂直スクロールバー */
if( NULL != m_hwndVScrollBar ){
::MoveWindow( m_hwndVScrollBar, cx - nCxVScroll , 0 + nVSplitHeight, nCxVScroll, cy - nCyVScroll - nVSplitHeight, TRUE );
}
/* 水平スクロールバー */
if( NULL != m_hwndHScrollBar ){
::MoveWindow( m_hwndHScrollBar, 0 + nHSplitWidth, cy - nCyHScroll, cx - nCxVScroll - nHSplitWidth, nCyHScroll, TRUE );
}
/* サイズボックス */
if( NULL != m_hwndSizeBox ){
::MoveWindow( m_hwndSizeBox, cx - nCxVScroll, cy - nCyHScroll, nCxHScroll, nCyVScroll, TRUE );
}else{
}
m_nViewCx = cx - nCxVScroll - m_nViewAlignLeft; /* 表示域の幅 */
m_nViewCy = cy - ((NULL != m_hwndHScrollBar)?nCyHScroll:0) - m_nViewAlignTop; /* 表示域の高さ */
m_nViewColNum = m_nViewCx / ( m_nCharWidth + m_pcEditDoc->GetDocumentAttribute().m_nColmSpace ); /* 表示域の桁数 */
m_nViewRowNum = m_nViewCy / ( m_nCharHeight + m_pcEditDoc->GetDocumentAttribute().m_nLineSpace ); /* 表示域の行数 */
//1999.12.1 仕様変更
// /* ウィンドウリサイズ時にキャレット位置へスクロール */
// MoveCursor( m_nCaretPosX, m_nCaretPosY, TRUE );
/* スクロールバーの状態を更新する */
AdjustScrollBars();
/* 再描画用メモリBMP */
if( m_hbmpCompatBMP != NULL ){
::SelectObject( m_hdcCompatDC, m_hbmpCompatBMPOld ); /* 再描画用メモリBMP(OLD) */
::DeleteObject( m_hbmpCompatBMP );
}
m_hbmpCompatBMP = ::CreateCompatibleBitmap( hdc, cx, cy );
m_hbmpCompatBMPOld = (HBITMAP)::SelectObject( m_hdcCompatDC, m_hbmpCompatBMP );
::ReleaseDC( m_hWnd, hdc );
/* 親ウィンドウのタイトルを更新 */
SetParentCaption(); // [Q] genta 本当に必要?
return;
}
/* キャレットの表示?更新 */
void CEditView::ShowEditCaret( void )
{
const char* pLine;
int nLineLen;
int nCaretWidth = 0;
int nCaretHeight = 0;
int nIdxFrom;
int nCharChars;
// HDC hdc;
// const CLayout* pcLayout;
// HPEN hPen, hPenOld;
//if( m_nMyIndex == 0 && m_nCaretPosX == 0 && m_nCaretPosY == 0 ){
// MYTRACE( "ShowEditCaret() m_nMyIndex=%d m_nCaretWidth=%d\n", m_nMyIndex, m_nCaretWidth );
//}
/*
なんかフレームウィンドウがアクティブでないときに内部的にカーソル移動すると
カーソルがないのに、カーソルがあるということになってしまう
のでアクティブにしてもカーソルが出てこないときがある
フレームウィンドウがアクティブでないときは、カーソルがないことにする
*/
if( ::GetActiveWindow() != ::GetParent( m_hwndParent ) ){
m_nCaretWidth = 0;
// MYTRACE( "アクティブでないのにカーソル作っちゃったから消しちゃった。\n" );
return;
}
/* アクティブなペインを取得 */
if( m_nMyIndex != m_pcEditDoc->GetActivePane() ){
m_nCaretWidth = 0;
//if( m_nMyIndex == 0 && m_nCaretPosX == 0 && m_nCaretPosY == 0 ){
// MYTRACE( "m_nMyIndex[%s] != m_pcEditDoc->GetActivePane()\n", m_nMyIndex, m_pcEditDoc->GetActivePane() );
//}
return;
}
/* キャレットの幅、高さを決定 */
if( 0 == m_pShareData->m_Common.GetCaretType() ){ /* カーソルのタイプ 0=win 1=dos */
nCaretHeight = m_nCharHeight; /* キャレットの高さ */
if( m_pShareData->m_Common.m_bIsINSMode ){
nCaretWidth = 2;
}else{
const CLayout* pcLayout;
nCaretWidth = ( m_nCharWidth + m_pcEditDoc->GetDocumentAttribute().m_nColmSpace );
pLine = m_pcEditDoc->m_cLayoutMgr.GetLineStr( m_nCaretPosY, &nLineLen, &pcLayout );
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?