ceditview.cpp
来自「日本的开源编辑器源码」· C++ 代码 · 共 2,141 行 · 第 1/5 页
CPP
2,141 行
lf.lfUnderline = TRUE;
lf.lfWeight += 300;
if( 1000 < lf.lfWeight ){
lf.lfWeight = 1000;
}
m_hFont_HAN_FAT_UL = CreateFontIndirect( &lf );
// 2004.02.08 m_hFont_ZENは未使用により削除
m_dwTipTimer = ::GetTickCount(); /* 辞書Tip起動タイマー */
m_bInMenuLoop = FALSE; /* メニュー モーダル ループに入っています */
// MYTRACE( "CEditView::CEditView()おわり\n" );
m_bHokan = FALSE;
m_hFontOld = NULL;
// Aug. 31, 2000 genta
m_cHistory->SetMax( 30 );
// from here 2002.04.09 minfu OSによって再変換の方式を変える
// YAZAKI COsVersionInfoのカプセル化は守りましょ。
COsVersionInfo cOs;
// POSVERSIONINFO pOsVer;
// pOsVer = cOs.GetOsVersionInfo();
if( cOs.OsDoesNOTSupportReconvert() ){
// 95 or NTならば
m_uMSIMEReconvertMsg = ::RegisterWindowMessage( RWM_RECONVERT );
m_uATOKReconvertMsg = ::RegisterWindowMessage( MSGNAME_ATOK_RECONVERT ) ;
m_uWM_MSIME_RECONVERTREQUEST = ::RegisterWindowMessage("MSIMEReconvertRequest");
m_hAtokModule = LoadLibrary("ATOK10WC.DLL");
AT_ImmSetReconvertString = NULL;
if ( NULL != m_hAtokModule ) {
AT_ImmSetReconvertString =(BOOL (WINAPI *)( HIMC , int ,PRECONVERTSTRING , DWORD ) ) GetProcAddress(m_hAtokModule,"AT_ImmSetReconvertString");
}
}else{
// それ以外のOSのときはOS標準を使用する
m_uMSIMEReconvertMsg = 0;
m_uATOKReconvertMsg = 0 ;
m_hAtokModule = 0; //@@@ 2002.04.14 MIK
}
// to here 2002.04.10 minfu
// 2002/07/22 novice
// m_bCaretShowFlag = false;
//2004.10.23 isearch
m_nISearchMode = 0;
//m_pcmigemo = CMigemo::getInstance();
//m_pcmigemo->Init();
m_pcmigemo = NULL;
return;
}
CEditView::~CEditView()
{
DeleteObject( m_hFont_HAN );
DeleteObject( m_hFont_HAN_FAT );
DeleteObject( m_hFont_HAN_UL );
DeleteObject( m_hFont_HAN_FAT_UL );
if( m_hWnd != NULL ){
DestroyWindow( m_hWnd );
}
/* 再描画用メモリBMP */
if( m_hbmpCompatBMP != NULL ){
/* 再描画用メモリBMP(OLD) */
::SelectObject( m_hdcCompatDC, m_hbmpCompatBMPOld );
::DeleteObject( m_hbmpCompatBMP );
}
/* 再描画用コンパチブルDC */
if( m_hdcCompatDC != NULL ){
::DeleteDC( m_hdcCompatDC );
}
delete m_pcDropTarget;
m_pcDropTarget = NULL;
delete m_cHistory;
delete m_cRegexKeyword; //@@@ 2001.11.17 add MIK
//再変換 2002.04.10 minfu
if(m_hAtokModule)
FreeLibrary(m_hAtokModule);
return;
}
BOOL CEditView::Create(
HINSTANCE hInstance,
HWND hwndParent,
CEditDoc* pcEditDoc,
int nMyIndex,
BOOL bShow
)
{
WNDCLASS wc;
SCROLLINFO si;
HDC hdc;
m_hInstance = hInstance;
m_hwndParent = hwndParent;
m_pcEditDoc = pcEditDoc;
m_nMyIndex = nMyIndex;
m_cRegexKeyword = new CRegexKeyword; //@@@ 2001.11.17 add MIK
m_cRegexKeyword->RegexKeySetTypes(&(m_pcEditDoc->GetDocumentAttribute())); //@@@ 2001.11.17 add MIK
m_nTopYohaku = m_pShareData->m_Common.m_nRulerBottomSpace; /* ルーラーとテキストの隙間 */
m_nViewAlignTop = m_nTopYohaku; /* 表示域の上端座標 */
/* ルーラー表示 */
// if( m_pShareData->m_Common.m_bRulerDisp ){
if( m_pcEditDoc->GetDocumentAttribute().m_ColorInfoArr[COLORIDX_RULER].m_bDisp ){
m_nViewAlignTop += m_pShareData->m_Common.m_nRulerHeight; /* ルーラー高さ */
}
/* ウィンドウクラスの登録 */
// Apr. 27, 2000 genta
// サイズ変更時のちらつきを抑えるためCS_HREDRAW | CS_VREDRAW を外した
wc.style = CS_DBLCLKS | CS_BYTEALIGNCLIENT | CS_BYTEALIGNWINDOW;
wc.lpfnWndProc = (WNDPROC)EditViewWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = sizeof( LONG_PTR );
wc.hInstance = m_hInstance;
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wc.hCursor = NULL/*LoadCursor( NULL, IDC_IBEAM )*/;
wc.hbrBackground = (HBRUSH)NULL/*(COLOR_WINDOW + 1)*/;
wc.lpszMenuName = NULL;
wc.lpszClassName = m_pszAppName;
if( 0 == ::RegisterClass( &wc ) ){
}
/* エディタウィンドウの作成 */
g_m_pcEditView = this;
m_hWnd = ::CreateWindowEx(
0
/*| WS_EX_CLIENTEDGE */
| WS_EX_STATICEDGE
, // extended window style
m_pszAppName, // pointer to registered class name
m_pszAppName, // pointer to window name
0
| WS_VISIBLE
| WS_CHILD
| WS_CLIPCHILDREN
/*| WS_BORDER*/
, // window style
CW_USEDEFAULT, // horizontal position of window
0, // vertical position of window
CW_USEDEFAULT, // window width
0, // window height
hwndParent, // handle to parent or owner window
NULL, // handle to menu or child-window identifier
m_hInstance, // handle to application instance
(LPVOID)this // pointer to window-creation data
);
if( NULL == m_hWnd ){
return FALSE;
}
// CDropTarget::Register_DropTarget( m_hWnd );
m_pcDropTarget->Register_DropTarget( m_hWnd );
// ::OleInitialize(NULL);
// if( FAILED( ::RegisterDragDrop( m_hWnd, this ) ) ){
// ::MYMESSAGEBOX( m_hWnd, MB_OK | MB_ICONEXCLAMATION | MB_TOPMOST, GSTR_APPNAME,
// "::RegisterDragDrop()\n失敗"
// );
//
// }
/* 辞書Tip表示ウィンドウ作成 */
m_cTipWnd.Create( m_hInstance, m_hWnd/*m_pShareData->m_hwndTray*/ );
/* 再描画用コンパチブルDC */
hdc = ::GetDC( m_hWnd );
m_hdcCompatDC = ::CreateCompatibleDC( hdc );
::ReleaseDC( m_hWnd, hdc );
/* 垂直分割ボックス */
m_pcsbwVSplitBox = new CSplitBoxWnd;
m_pcsbwVSplitBox->Create( m_hInstance, m_hWnd, TRUE );
/* 水平分割ボックス */
m_pcsbwHSplitBox = new CSplitBoxWnd;
m_pcsbwHSplitBox->Create( m_hInstance, m_hWnd, FALSE );
/* スクロールバーの作成 */
m_hwndVScrollBar = ::CreateWindowEx(
0L, /* no extended styles */
"SCROLLBAR", /* scroll bar control class */
(LPSTR) NULL, /* text for window title bar */
WS_VISIBLE | WS_CHILD | SBS_VERT, /* scroll bar styles */
0, /* horizontal position */
0, /* vertical position */
200, /* width of the scroll bar */
CW_USEDEFAULT, /* default height */
m_hWnd, /* handle of main window */
(HMENU) NULL, /* no menu for a scroll bar */
m_hInstance, /* instance owning this window */
(LPVOID) NULL /* pointer not needed */
);
si.cbSize = sizeof( si );
si.fMask = SIF_ALL | SIF_DISABLENOSCROLL;
si.nMin = 0;
si.nMax = 29;
si.nPage = 10;
si.nPos = 0;
si.nTrackPos = 1;
::SetScrollInfo( m_hwndVScrollBar, SB_CTL, &si, TRUE );
::ShowScrollBar( m_hwndVScrollBar, SB_CTL, TRUE );
/* スクロールバーの作成 */
m_hwndHScrollBar = NULL;
if( m_pShareData->m_Common.m_bScrollBarHorz ){ /* 水平スクロールバーを使う */
m_hwndHScrollBar = ::CreateWindowEx(
0L, /* no extended styles */
"SCROLLBAR", /* scroll bar control class */
(LPSTR) NULL, /* text for window title bar */
WS_VISIBLE | WS_CHILD | SBS_HORZ, /* scroll bar styles */
0, /* horizontal position */
0, /* vertical position */
200, /* width of the scroll bar */
CW_USEDEFAULT, /* default height */
m_hWnd, /* handle of main window */
(HMENU) NULL, /* no menu for a scroll bar */
m_hInstance, /* instance owning this window */
(LPVOID) NULL /* pointer not needed */
);
si.cbSize = sizeof( si );
si.fMask = SIF_ALL | SIF_DISABLENOSCROLL;
si.nMin = 0;
si.nMax = 29;
si.nPage = 10;
si.nPos = 0;
si.nTrackPos = 1;
::SetScrollInfo( m_hwndHScrollBar, SB_CTL, &si, TRUE );
::ShowScrollBar( m_hwndHScrollBar, SB_CTL, TRUE );
}
/* サイズボックス */
if( m_pShareData->m_Common.m_nFUNCKEYWND_Place == 0 ){ /* ファンクションキー表示位置/0:上 1:下 */
m_hwndSizeBox = ::CreateWindowEx(
WS_EX_CONTROLPARENT/*0L*/, /* no extended styles */
"SCROLLBAR", /* scroll bar control class */
(LPSTR) NULL, /* text for window title bar */
WS_VISIBLE | WS_CHILD | SBS_SIZEBOX | SBS_SIZEGRIP, /* scroll bar styles */
0, /* horizontal position */
0, /* vertical position */
200, /* width of the scroll bar */
CW_USEDEFAULT, /* default height */
m_hWnd, /* handle of main window */
(HMENU) NULL, /* no menu for a scroll bar */
m_hInstance, /* instance owning this window */
(LPVOID) NULL /* pointer not needed */
);
}else{
m_hwndSizeBox = ::CreateWindowEx(
0L, /* no extended styles */
"STATIC", /* scroll bar control class */
(LPSTR) NULL, /* text for window title bar */
WS_VISIBLE | WS_CHILD/* | SBS_SIZEBOX | SBS_SIZEGRIP*/, /* scroll bar styles */
0, /* horizontal position */
0, /* vertical position */
200, /* width of the scroll bar */
CW_USEDEFAULT, /* default height */
m_hWnd, /* handle of main window */
(HMENU) NULL, /* no menu for a scroll bar */
m_hInstance, /* instance owning this window */
(LPVOID) NULL /* pointer not needed */
);
}
SetFont();
/* スクロールバーの状態を更新する */
// AdjustScrollBars();
if( bShow ){
ShowWindow( m_hWnd, SW_SHOW );
}
/* 親ウィンドウのタイトルを更新 */
SetParentCaption();
// /* 入力補完ウィンドウ作成 */
// m_cHokanMgr.DoModeless( m_hInstance , m_hWnd, (LPARAM)this );
/* キーボードの現在のリピート間隔を取得 */
int nKeyBoardSpeed;
SystemParametersInfo( SPI_GETKEYBOARDSPEED, 0, &nKeyBoardSpeed, 0 );
// nKeyBoardSpeed *= 2;
/* タイマー起動 */
if( 0 == ::SetTimer( m_hWnd, IDT_ROLLMOUSE, nKeyBoardSpeed, (TIMERPROC)EditViewTimerProc ) ){
::MYMESSAGEBOX( m_hWnd, MB_OK | MB_ICONEXCLAMATION, GSTR_APPNAME,
"CEditView::Create()\nタイマーが起動できません。\nシステムリソースが不足しているのかもしれません。"
);
}
/* アンダーライン */
m_cUnderLine.SetView( this );
return TRUE;
}
/*
|| メッセージディスパッチャ
*/
LRESULT CEditView::DispatchEvent(
HWND hwnd, // handle of window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
HDC hdc;
PAINTSTRUCT ps;
// int nPos;
int nPosX;
int nPosY;
// WORD fwKeys;
// short zDelta;
// short xPos;
// short yPos;
// int i;
// int nScrollCode;
switch ( uMsg ){
//- case WM_DESTROYCLIPBOARD:
//- MYTRACE( "CEditView WM_DESTROYCLIPBOARD\n" );
//- return 0;
case WM_MOUSEWHEEL:
return OnMOUSEWHEEL( wParam, lParam );
case WM_CREATE:
::SetWindowLongPtr( hwnd, 0, (LONG_PTR) this );
// /* キーボードの現在のリピート間隔を取得 */
// int nKeyBoardSpeed;
// SystemParametersInfo( SPI_GETKEYBOARDSPEED, 0, &nKeyBoardSpeed, 0 );
// /* タイマー起動 */
// ::SetTimer( hwnd, IDT_ROLLMOUSE, nKeyBoardSpeed, (TIMERPROC)EditViewTimerProc );
return 0L;
case WM_SIZE:
// MYTRACE( " WM_SIZE\n" );
OnSize( LOWORD( lParam ), HIWORD( lParam ) );
return 0L;
case WM_SETFOCUS:
// MYTRACE( " WM_SETFOCUS m_nMyIndex=%d\n", m_nMyIndex );
OnSetFocus();
/* 親ウィンドウのタイトルを更新 */
SetParentCaption();
return 0L;
case WM_KILLFOCUS:
OnKillFocus();
// /* 親ウィンドウのタイトルを更新 */
// SetParentCaption( TRUE );
return 0L;
case WM_CHAR:
// MYTRACE( "WM_CHAR\n" );
HandleCommand( F_CHAR, TRUE, wParam, 0, 0, 0 );
return 0L;
case WM_IME_COMPOSITION:
if( m_pShareData->m_Common.m_bIsINSMode /* 挿入モードか? */
&& lParam & GCS_RESULTSTR
){
HIMC hIMC;
DWORD dwSize;
HGLOBAL hstr;
LPSTR lpstr;
hIMC = ImmGetContext( hwnd );
if( !hIMC ){
return 0;
// MyError( ERROR_NULLCONTEXT );
}
// Get the size of the result string.
dwSize = ImmGetCompositionString(hIMC, GCS_RESULTSTR, NULL, 0);
// increase buffer size for NULL terminator,
// maybe it is in Unicode
dwSize += sizeof( WCHAR );
hstr = GlobalAlloc( GHND, dwSize );
if( hstr == NULL ){
return 0;
// MyError( ERROR_GLOBALALLOC );
}
lpstr = (LPSTR)GlobalLock( hstr );
if( lpstr == NULL ){
return 0;
// MyError( ERROR_GLOBALLOCK );
}
// Get the result strings that is generated by IME into lpstr.
ImmGetCompositionString(hIMC, GCS_RESULTSTR, lpstr, dwSize);
// MYTRACE( "lpstr=[%s]", lpstr );
/* テキストを貼り付け */
HandleCommand( F_INSTEXT, TRUE, (LPARAM)lpstr, TRUE, 0, 0 );
ImmReleaseContext( hwnd, hIMC );
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?