ceditview.cpp
来自「日本的开源编辑器源码」· C++ 代码 · 共 2,141 行 · 第 1/5 页
CPP
2,141 行
if( NULL != pLine ){
/* 指定された桁に対応する行のデータ内の位置を調べる */
nIdxFrom = LineColmnToIndex( pcLayout, m_nCaretPosX );
if( nIdxFrom >= nLineLen ||
pLine[nIdxFrom] == CR || pLine[nIdxFrom] == LF ||
pLine[nIdxFrom] == TAB ){
nCaretWidth = ( m_nCharWidth + m_pcEditDoc->GetDocumentAttribute().m_nColmSpace );
}else{
nCharChars = CMemory::MemCharNext( pLine, nLineLen, &pLine[nIdxFrom] ) - &pLine[nIdxFrom];
if( 0 < nCharChars ){
nCaretWidth = ( m_nCharWidth + m_pcEditDoc->GetDocumentAttribute().m_nColmSpace ) * nCharChars;
}
}
}
}
}else
if( 1 == m_pShareData->m_Common.GetCaretType() ){ /* カーソルのタイプ 0=win 1=dos */
if( m_pShareData->m_Common.m_bIsINSMode ){
nCaretHeight = m_nCharHeight / 2; /* キャレットの高さ */
}else{
nCaretHeight = m_nCharHeight; /* キャレットの高さ */
}
const CLayout* pcLayout;
nCaretWidth = ( m_nCharWidth + m_pcEditDoc->GetDocumentAttribute().m_nColmSpace );
pLine = m_pcEditDoc->m_cLayoutMgr.GetLineStr( m_nCaretPosY, &nLineLen, &pcLayout );
if( NULL != pLine ){
/* 指定された桁に対応する行のデータ内の位置を調べる */
nIdxFrom = LineColmnToIndex( pcLayout, m_nCaretPosX );
if( nIdxFrom >= nLineLen ||
pLine[nIdxFrom] == CR || pLine[nIdxFrom] == LF ||
pLine[nIdxFrom] == TAB ){
nCaretWidth = ( m_nCharWidth + m_pcEditDoc->GetDocumentAttribute().m_nColmSpace );
}else{
nCharChars = CMemory::MemCharNext( pLine, nLineLen, &pLine[nIdxFrom] ) - &pLine[nIdxFrom];
if( 0 < nCharChars ){
nCaretWidth = ( m_nCharWidth + m_pcEditDoc->GetDocumentAttribute().m_nColmSpace ) * nCharChars;
}
}
}
}
#if 0
hdc = ::GetDC( m_hWnd );
#endif
if( m_nCaretWidth == 0 ){
/* キャレットがなかった場合 */
/* キャレットの作成 */
::CreateCaret( m_hWnd, (HBITMAP)NULL, nCaretWidth, nCaretHeight );
m_bCaretShowFlag = false; // 2002/07/22 novice
}else{
if( m_nCaretWidth != nCaretWidth || m_nCaretHeight != nCaretHeight ){
/* キャレットはあるが、大きさが変わった場合 */
/* 現在のキャレットを削除 */
::DestroyCaret();
/* キャレットの作成 */
::CreateCaret( m_hWnd, (HBITMAP)NULL, nCaretWidth, nCaretHeight );
m_bCaretShowFlag = false; // 2002/07/22 novice
}else{
/* キャレットはあるし、大きさも変わっていない場合 */
/* キャレットを隠す */
HideCaret_( m_hWnd ); // 2002/07/22 novice
}
}
/* キャレットの位置を調整 */
int nPosX = m_nViewAlignLeft + (m_nCaretPosX - m_nViewLeftCol) * ( m_nCharWidth + m_pcEditDoc->GetDocumentAttribute().m_nColmSpace );
int nPosY = m_nViewAlignTop + (m_nCaretPosY - m_nViewTopLine) * ( m_pcEditDoc->GetDocumentAttribute().m_nLineSpace + m_nCharHeight ) + m_nCharHeight - nCaretHeight;
::SetCaretPos( nPosX, nPosY );
if ( m_nViewAlignLeft <= nPosX && m_nViewAlignTop <= nPosY ){
/* キャレットの表示 */
ShowCaret_( m_hWnd ); // 2002/07/22 novice
}
m_nCaretWidth = nCaretWidth;
m_nCaretHeight = nCaretHeight; /* キャレットの高さ */
SetIMECompFormPos();
#if 0
2002/05/12 YAZAKI ShowEditCaretで仕事をしすぎ。
//2002.02.27 Add By KK アンダーラインのちらつきを低減
if (m_nOldUnderLineY != m_nViewAlignTop + (m_nCaretPosY - m_nViewTopLine) * ( m_pcEditDoc->GetDocumentAttribute().m_nLineSpace + m_nCharHeight ) + m_nCharHeight) {
//アンダーラインの描画位置が、前回のアンダーライン描画位置と異なっていたら、アンダーラインを描き直す。
CaretUnderLineOFF(TRUE);
CaretUnderLineON(TRUE);
}
/* ルーラー描画 */
DispRuler( hdc );
::ReleaseDC( m_hWnd, hdc );
#endif
return;
}
/* 入力フォーカスを受け取ったときの処理 */
void CEditView::OnSetFocus( void )
{
//NG /* 1999.11.15 */
//NG ::SetFocus( m_hwndParent );
//NG ::SetFocus( m_hWnd );
// 2004.04.02 Moca EOFのみのレイアウト行は、0桁目のみ有効.EOFより下の行のある場合は、EOF位置にする
{
int nPosX = m_nCaretPosX;
int nPosY = m_nCaretPosY;
if( GetAdjustCursorPos( &nPosX, &nPosY ) ){
MoveCursor( nPosX, nPosY, FALSE );
m_nCaretPosX_Prev = m_nCaretPosX;
}
}
ShowEditCaret();
// SetIMECompFormPos(); YAZAKI ShowEditCaretで作業済み
SetIMECompFormFont();
/* ルーラのカーソルをグレーから黒に変更する */
HDC hdc = ::GetDC( m_hWnd );
DispRuler( hdc );
::ReleaseDC( m_hWnd, hdc );
// 03/02/18 対括弧の強調表示(描画) ai
m_bDrawBracketPairFlag = TRUE;
DrawBracketPair( true );
return;
}
/* 入力フォーカスを失ったときの処理 */
void CEditView::OnKillFocus( void )
{
// 03/02/18 対括弧の強調表示(消去) ai
DrawBracketPair( false );
m_bDrawBracketPairFlag = FALSE;
DestroyCaret();
/* ルーラー描画 */
/* ルーラのカーソルを黒からグレーに変更する */
HDC hdc = ::GetDC( m_hWnd );
DispRuler( hdc );
::ReleaseDC( m_hWnd, hdc );
/* 辞書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;
}
/*! 垂直スクロールバーメッセージ処理
@param nScrollCode [in] スクロール種別 (Windowsから渡されるもの)
@param nPos [in] スクロール位置(THUMBTRACK用)
@retval 実際にスクロールした行数
@date 2004.09.11 genta スクロール行数を返すように.
未使用のhwndScrollBar引数削除.
*/
int CEditView::OnVScroll( int nScrollCode, int nPos )
{
int nScrollVal = 0;
switch( nScrollCode ){
case SB_LINEDOWN:
// for( i = 0; i < 4; ++i ){
// ScrollAtV( m_nViewTopLine + 1 );
// }
nScrollVal = ScrollAtV( m_nViewTopLine + m_pShareData->m_Common.m_nRepeatedScrollLineNum );
break;
case SB_LINEUP:
// for( i = 0; i < 4; ++i ){
// ScrollAtV( m_nViewTopLine - 1 );
// }
nScrollVal = ScrollAtV( m_nViewTopLine - m_pShareData->m_Common.m_nRepeatedScrollLineNum );
break;
case SB_PAGEDOWN:
nScrollVal = ScrollAtV( m_nViewTopLine + m_nViewRowNum );
break;
case SB_PAGEUP:
nScrollVal = ScrollAtV( m_nViewTopLine - m_nViewRowNum );
break;
case SB_THUMBPOSITION:
nScrollVal = ScrollAtV( nPos );
break;
case SB_THUMBTRACK:
nScrollVal = ScrollAtV( nPos );
break;
case SB_TOP:
nScrollVal = ScrollAtV( 0 );
break;
case SB_BOTTOM:
nScrollVal = ScrollAtV(( m_pcEditDoc->m_cLayoutMgr.GetLineCount() ) - m_nViewRowNum );
break;
default:
break;
}
return nScrollVal;
}
/*! 水平スクロールバーメッセージ処理
@param nScrollCode [in] スクロール種別 (Windowsから渡されるもの)
@param nPos [in] スクロール位置(THUMBTRACK用)
@retval 実際にスクロールした桁数
@date 2004.09.11 genta スクロール桁数を返すように.
未使用のhwndScrollBar引数削除.
*/
int CEditView::OnHScroll( int nScrollCode, int nPos )
{
int nScrollVal = 0;
m_bRedrawRuler = true; // YAZAKI
switch( nScrollCode ){
case SB_LINELEFT:
nScrollVal = ScrollAtH( m_nViewLeftCol - 4 );
break;
case SB_LINERIGHT:
nScrollVal = ScrollAtH( m_nViewLeftCol + 4 );
break;
case SB_PAGELEFT:
nScrollVal = ScrollAtH( m_nViewLeftCol - m_nViewColNum );
break;
case SB_PAGERIGHT:
nScrollVal = ScrollAtH( m_nViewLeftCol + m_nViewColNum );
break;
case SB_THUMBPOSITION:
nScrollVal = ScrollAtH( nPos );
// MYTRACE( "nPos=%d\n", nPos );
break;
case SB_THUMBTRACK:
nScrollVal = ScrollAtH( nPos );
// MYTRACE( "nPos=%d\n", nPos );
break;
case SB_LEFT:
nScrollVal = ScrollAtH( 0 );
break;
case SB_RIGHT:
nScrollVal = ScrollAtH( m_pcEditDoc->GetDocumentAttribute().m_nMaxLineSize - m_nViewColNum );
break;
}
return nScrollVal;
}
//void CEditView::Draw3dRect( HDC hdc, int x, int y, int cx, int cy,
// COLORREF clrTopLeft, COLORREF clrBottomRight )
//{
// return;
//}
//
//void CEditView::FillSolidRect( HDC hdc, int x, int y, int cx, int cy, COLORREF clr )
//{
// RECT rc;
// ::SetBkColor( hdc, clr );
// ::SetRect( &rc, x, y, x + cx, y + cy );
// ::ExtTextOut( hdc, 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL );
// return;
//}
#if 0//////////////////////////////////////////////
/************************************************************************
*
* 関数: OpenDIB( LPSTR szFile )
*
* 目的: DIBファイルを開いてメモリDIBを作成します。また、BITMAPINFO、
* パレットデータ、ビットを含むメモリハンドルを作成します。
*
* 戻り値: DIBを識別するハンドル
*
************************************************************************/
HANDLE CEditView::OpenDIB ( LPCSTR szFile )
{
unsigned fh;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
DWORD dwLen = 0;
DWORD dwBits;
HANDLE hdib;
HANDLE h;
OFSTRUCT of;
/* ファイルを開いてDIB情報を読み取る */
fh = OpenFile( szFile, &of, OF_READ );
if( fh == -1 )
return NULL;
hdib = ReadDibBitmapInfo( fh );
if( !hdib )
return NULL;
DibInfo( hdib, &bi );
/* DIBの保持に必要なメモリ量を計算 */
dwBits = bi.biSizeImage;
dwLen = bi.biSize + (DWORD)PaletteSize( &bi ) + dwBits;
/* DIBを保持するビットマップ情報バッファサイズを増やす */
h = GlobalReAlloc( hdib, dwLen, GHND );
if( !h ){
GlobalFree( hdib );
hdib = NULL;
}
else
hdib = h;
/* ビットを読み取る */
if( hdib ){
lpbi = (LPBITMAPINFOHEADER)GlobalLock( hdib );
lread( fh, (LPSTR)lpbi + (WORD)lpbi->biSize + PaletteSize(lpbi), dwBits );
GlobalUnlock( hdib );
}
_lclose( fh );
return hdib;
}
/************************************************************************
*
* 関数: ReadDibBitmapInfo( int fh )
*
* 目的: DIB形式のファイルを読み取り、そのBITMAPINFOの
* グローバルハンドルを返します。
* この関数は以前の(BITMAPCOREHEADER)形式と新しい(BITMAPINFOHEADER)形式の
* 両方を処理できますが、返すのはつねに新しいBITMAPINFOです。
*
* 戻り値: ファイル内のDIBのBITMAPINFOを識別するハンドル
*
************************************************************************/
HANDLE CEditView::ReadDibBitmapInfo ( int fh )
{
DWORD off;
HANDLE hbi = NULL;
int size;
int i;
WORD nNumColors;
RGBQUAD FAR *pRgb;
BITMAPINFOHEADER bi;
BITMAPCOREHEADER bc;
LPBITMAPINFOHEADER lpbi;
BITMAPFILEHEADER bf;
DWORD dwWidth = 0;
DWORD dwHeight = 0;
WORD wPlanes, wBitCount;
if( fh == -1 )
return NULL;
/* ファイルポインタをリセットし、ファイルヘッダーを読み取る */
off = _llseek( fh, 0L, SEEK_CUR );
if( sizeof( bf ) != _lread( fh, (LPSTR)&bf, sizeof( bf ) ) )
return FALSE;
/* RCヘッダーがあるか調べる */
if( !ISDIB( bf.bfType ) ){
bf.bfOffBits = 0L;
_llseek( fh, off, SEEK_SET );
}
if( sizeof( bi ) != _lread( fh, (LPSTR)&bi, sizeof( bi ) ) )
return FALSE;
nNumColors = DibNumColors( &bi );
/*
* 情報ブロックの内容(BITMAPINFOまたはBITMAPCORE)をチェックし、
* それに従って情報を取得する。BITMAPCOREHEADERならば、情報を
* BITMAPINFOHEADER形式のブロックに転送する。
*/
switch ( size = (int)bi.biSize ){
case sizeof( BITMAPINFOHEADER ):
break;
case sizeof( BITMAPCOREHEADER ):
bc = *(BITMAPCOREHEADER*)&bi;
dwWidth = (DWORD)bc.bcWidth;
dwHeight = (DWORD)bc.bcHeight;
wPlanes = bc.bcPlanes;
wBitCount = bc.bcBitCount;
bi.biSize = sizeof( BITMAPINFOHEADER );
bi.biWidth = dwWidth;
bi.biHeight = dwHeight;
bi.biPlanes = wPlanes;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = nNumColors;
bi.biClrImportant = nNumColors;
_llseek( fh, (LONG)sizeof( BITMAPCOREHEADER ) - sizeof( BITMAPINFOHEADER ), SEEK_CUR );
break;
default:
/* DIBではない */
return NULL;
}
/* 0ならばデフォルト値を設定 */
if( bi.biSizeImage == 0 ){
bi.biSizeImage = WIDTHBYTES( (DWORD)bi.biWidth * bi.biBitCount ) * bi.biHeight;
}
if( bi.biClrUsed == 0 )
bi.biClrUsed = DibNumColors(&bi);
/* BITMAPINFO構造体とカラーテーブルを割り当てる */
hbi = GlobalAlloc( GHND, (LONG)bi.biSize + nNumColors * sizeof( RGBQUAD ) );
if( !hbi )
return NULL;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?