ceditview.cpp

来自「日本的开源编辑器源码」· C++ 代码 · 共 2,141 行 · 第 1/5 页

CPP
2,141
字号
	lpbi = (LPBITMAPINFOHEADER)GlobalLock( hbi );
	*lpbi = bi;
	/* カラーテーブルを指すポインタを取得 */
	pRgb = (RGBQUAD FAR *)( (LPSTR)lpbi + bi.biSize );
	if (nNumColors){
		if( size == sizeof( BITMAPCOREHEADER ) ){
			/*
			 * 古いカラーテーブル(3バイトのRGBTRIPLE)を新しいカラーテーブル(4バイトのRGBQUAD)に変換
			 */
			_lread( fh, (LPSTR)pRgb, nNumColors * sizeof( RGBTRIPLE ) );
			for( i = nNumColors - 1; i >= 0; i-- ){
				RGBQUAD rgb;
				rgb.rgbRed		= ((RGBTRIPLE FAR *)pRgb)[i].rgbtRed;
				rgb.rgbBlue		= ((RGBTRIPLE FAR *)pRgb)[i].rgbtBlue;
				rgb.rgbGreen	= ((RGBTRIPLE FAR *)pRgb)[i].rgbtGreen;
				rgb.rgbReserved = (BYTE)0;
				pRgb[i]			= rgb;
			}
		}
		else
			_lread( fh, (LPSTR)pRgb, nNumColors * sizeof( RGBQUAD ) );
	}
	if( bf.bfOffBits != 0L )
		_llseek( fh, off + bf.bfOffBits, SEEK_SET );
 	GlobalUnlock( hbi );
	return hbi;
}


/************************************************************************
 *
 *	関数:	DibInfo( HANDLE hbi, LPBITMAPINFOHEADER lpbi )
 *
 *	目的:	CF_DIB形式のメモリブロックに関連付けられているDIB情報を取得します。
 *
 *  戻り値:	TRUE	- 正常に終了した場合
 *			FALSE	- それ以外の場合
 *
 ************************************************************************/
BOOL CEditView::DibInfo( HANDLE hbi, LPBITMAPINFOHEADER lpbi )
{
	if( hbi ){
		*lpbi = *(LPBITMAPINFOHEADER)GlobalLock( hbi );

		/* デフォルトのメンバ設定 */
		if( lpbi->biSize != sizeof( BITMAPCOREHEADER ) ){
			if( lpbi->biSizeImage == 0L )
				lpbi->biSizeImage =
					WIDTHBYTES( lpbi->biWidth*lpbi->biBitCount ) * lpbi->biHeight;

			if( lpbi->biClrUsed == 0L )
				lpbi->biClrUsed = DibNumColors( lpbi );
		}
		GlobalUnlock( hbi );
		return TRUE;
	}
	return FALSE;
}

/********************************************************************************
 *
 *	関数:	PaletteSize( VOID FAR * pv )
 *
 *	目的:	パレットのバイト数を計算します。情報ブロックがBITMAPCOREHEADER型
 *			ならば、色数の3倍がパレットサイズになります。それ以外の場合は、
 *			色数の4倍がパレットサイズになります。
 *
 *	戻り値:	パレットのバイト数
 *
 *******************************************************************************/
WORD CEditView::PaletteSize ( VOID FAR * pv )
{
	LPBITMAPINFOHEADER lpbi;
	WORD		NumColors;
	lpbi		= (LPBITMAPINFOHEADER)pv;
	NumColors	= DibNumColors(lpbi);

	if( lpbi->biSize == sizeof( BITMAPCOREHEADER ) )
		return NumColors * sizeof( RGBTRIPLE );
	else
		return NumColors * sizeof( RGBQUAD );
}





/********************************************************************************
 *
 *	関数:	DibNumColors( VOID FAR * pv )
 *
 *	目的:	情報ブロックのBitCountメンバを参照して、DIBの色数を判断します。
 *
 *	戻り値:	DIBの色数
 *
 *******************************************************************************/
WORD CEditView::DibNumColors ( VOID FAR * pv)
{
	int					bits;
	LPBITMAPINFOHEADER lpbi;
	LPBITMAPCOREHEADER lpbc;
	lpbi = ( (LPBITMAPINFOHEADER)pv );
	lpbc = ( (LPBITMAPCOREHEADER)pv );
	/*
	 *	BITMAPINFO形式ヘッダーの場合、パレットのサイズはBITMAPCORE形式の
	 *	ヘッダーのbiClrUsedが示している。パレットのサイズは、ピクセル当たり
	 *	のビット数により異なる。
	 */
	if( lpbi->biSize != sizeof( BITMAPCOREHEADER ) ){
		if( lpbi->biClrUsed != 0 )
			return (WORD)lpbi->biClrUsed;
		bits = lpbi->biBitCount;
	}
	else
		bits = lpbc->bcBitCount;

	switch ( bits ){
		case 1:	return 2;
		case 4:	return 16;
		case 8:	return 256;
		/* 24ビットDIBにはカラーテーブルはない */
		default:	return 0;
	}
}

 /********** 64Kバイト以上の読み書きを行うプライベートルーチン *********/
/************************************************************************
 *
 *	関数:	lread( int fh, VOID FAR *pv, DWORD ul )
 *
 *	目的:	データをすべて読み取るまで32Kバイトずつデータを読み取ります。
 *
 *	戻り値:	0			- 正常に読み取れなかった場合
 *	読み取ったバイト数	- それ以外の場合
 *
 ************************************************************************/
DWORD CEditView::lread( int fh, void* pv, DWORD ul )
{
	DWORD	ulT = ul;
	BYTE	*hp = (BYTE *)pv;

#define	 MAXREAD_BYTES	32768	/* 読み取り処理時の読み取り可能なバイト数 */

	while( ul > (DWORD)MAXREAD_BYTES ){
		if( _lread( fh, (LPSTR)hp, (WORD)MAXREAD_BYTES ) != MAXREAD_BYTES )
			return 0;
		ul -= MAXREAD_BYTES;
		hp += MAXREAD_BYTES;
	}
	if( _lread(fh, (LPSTR)hp, (WORD)ul) != (WORD)ul )
		return 0;
	return ulT;
}


/************************************************************************
 * 関数:  PrintBitmap(int , int , int , int , LPCSTR );
 *
 *	目的:	指定したDIBファイルを読み込んで指定文字桁範囲に伸縮印刷します。
 *			印刷位置は現在のフォントサイズに影響されます。
 *
 *	戻り値:	なし
 *
 ************************************************************************/
void CEditView::PrintBitmap( HDC hdc, int x1, int y1, const char* szFile )
{
	HANDLE				hdib;
	BITMAPINFOHEADER	bi;
	LPBITMAPINFOHEADER	lpbi;
	LPSTR				pBuf;

	/* DIBファイルを開いてメモリDIBを作成 */
	hdib = OpenDIB ( szFile );
	if( hdib == NULL ){
//		MYTRACE( " OpenDIB()の実行に失敗  \n" );
		return;
	}
	DibInfo( hdib, &bi );

	/* DIBをプリンタDCに伸縮して転送 */
	lpbi = (LPBITMAPINFOHEADER)GlobalLock( hdib );
	if( !lpbi ){
		GlobalFree( (HGLOBAL)hdib );
		return ;
	}
	pBuf = (LPSTR)lpbi + (WORD)lpbi->biSize + PaletteSize( lpbi );
	StretchDIBits ( hdc,
		x1,
		y1,
		bi.biWidth,
		bi.biHeight,
		0,
		0,
		bi.biWidth,
		bi.biHeight,
		pBuf,
		(LPBITMAPINFO)lpbi,
		DIB_RGB_COLORS,
		SRCCOPY
	);
	GlobalUnlock( hdib );
	GlobalFree( hdib );
	return;
}

#endif //////////////////////////////////////////////






/*
プリプロセッサ ディレクティブ

#define	#endif	#ifdef	#line
#elif	#error	#ifndef	#pragma
#else	#if	#include	#undef



Cキーワード

auto	double	int	struct
break	else	long	switch
case	enum	register	typedef
char	extern	return	union
const	float	short	unsigned
continue	for	signed	void
default		goto	sizeof	volatile
do	if	static	while



C++キーワード

asm	auto	bad_cast	bad_typeid
break	case	catch	char
class	const	const_cast	continue
default	delete	do	double
dynamic_cast	else	enum	except
extern	finally	float	for
friend	goto	if	inline
int	long	namespace	new
operator	private	protected	public
register	reinterpret_cast	return	short
signed	sizeof	static	static_cast
struct	switch	template	this
throw	try	type_info	typedef
typeid	union	unsigned	using
virtual	void	volatile	while
xalloc


C++演算子

::	スコープ解決	なし
::	グローバル	なし
[ ]	配列添字	左から右
( )	関数呼び出し	左から右
( )	変換	なし
.	メンバ選択 (オブジェクト)	左から右
->	メンバ選択 (ポインタ)	左から右
++	後置インクリメント	なし
--	後置デクリメント	なし
new	オブジェクト割り当て	なし
delete	オブジェクト解放	なし
delete[ ]	オブジェクト解放	なし
++	前置インクリメント	なし
--	前置デクリメント	なし
*	参照	なし
&	アドレス	なし
+	単項プラス	なし
-	算術否定 (単項)	なし
!	論理 NOT	なし
~	ビットごとの補数	なし
sizeof	オブジェクトのサイズ	なし
sizeof ( )	型のサイズ	なし
typeid( )	型名	なし
(type)	型キャスト (変換)	右から左
const_cast	型キャスト (変換)	なし
dynamic_cast	型キャスト (変換)	なし
reinterpret_cast	型キャスト (変換)	なし
static_cast	型キャスト (変換)	なし
.*	クラス メンバへの適用ポインタ (オブジェクト)	左から右
->*	ポインタを介した、クラス メンバへの逆参照ポインタ	左から右
*	乗算	左から右
/	除算	左から右
%	剰余 (モジュール)	左から右
+	加算	左から右
-	減算	左から右
<<	左シフト	左から右
>>	右シフト	左から右
<	小なり	左から右
>	大なり	左から右
<=	以下	左から右
>=	以上	左から右
==	等価	左から右
!=	不等価	左から右
&	ビットごとの AND	左から右
^	ビットごとの排他的 OR	左から右
|	ビットごとの OR	左から右
&&	論理 AND	左から右
||	論理 OR	左から右
e1?e2:e3	条件	右から左
=	代入	右から左
*=	乗算代入	右から左
/=	除算代入	右から左
%=	剰余代入	右から左
+=	加算代入	右から左
-=	減算代入	右から左
<<=	左シフト代入	右から左
>>=	右シフト代入	右から左
&=	ビットごとの AND 代入	右から左
|=	ビットごとの OR 代入	右から左
^=	ビットごとの排他的 OR 代入	右から左
, 	カンマ	左から右


*/


/* 2点を対角とする矩形を求める */
void CEditView::TwoPointToRect(
		RECT*	prcRect,
	int		nLineFrom,
	int		nColmFrom,
	int		nLineTo,
	int		nColmTo
)
{
	if( nLineFrom < nLineTo ){
		prcRect->top	= nLineFrom;
		prcRect->bottom	= nLineTo;
	}else{
		prcRect->top	= nLineTo;
		prcRect->bottom	= nLineFrom;
	}
	if( nColmFrom < nColmTo ){
		prcRect->left	= nColmFrom;
		prcRect->right	= nColmTo;
	}else{
		prcRect->left	= nColmTo;
		prcRect->right	= nColmFrom;
	}
	return;

}

#if 0//////////////////////////////////////////
/* デバッグ用 リージョン矩形のダンプ */
void CEditView::TraceRgn( HRGN hrgn )
{
//	unsigned int	i;
	char*			pBuf;
	int				nRgnDataSize;
	RGNDATA*		pRgnData;
	RECT*			pRect;
	nRgnDataSize = ::GetRegionData( hrgn, 0, NULL );
	pBuf = new char[nRgnDataSize];
	pRgnData = (RGNDATA*)pBuf;
	nRgnDataSize = ::GetRegionData( hrgn, nRgnDataSize, pRgnData );
	pRect = (RECT*)&pRgnData->Buffer[0];
//	if( 0 < pRgnData->rdh.nCount ){
//		m_cShareData.TraceOut( "---------\n" );;
//		for( i = 0; i < pRgnData->rdh.nCount; ++i ){
//			m_cShareData.TraceOut( "\t(%d, %d, %d, %d \n", pRect[i].left, pRect[i].right, pRect[i].top, pRect[i].bottom );;
//		}
//	}
	delete [] pBuf;
	return;
}
#endif //#if 0




/* 選択領域の描画 */
void CEditView::DrawSelectArea( void )
{
	if( !m_bDrawSWITCH ){
		return;
	}

	int			nFromLine;
	int			nFromCol;
	int			nToLine;
	int			nToCol;
	HDC			hdc;
	HBRUSH		hBrush;
	HBRUSH		hBrushOld;
	int			nROP_Old;
	int			nLineNum;
	RECT		rcOld;
	RECT		rcNew;
	HRGN		hrgnOld = NULL;
	HRGN		hrgnNew = NULL;
	HRGN		hrgnDraw = NULL;

	m_bDrawSelectArea = TRUE;	// 02/12/13 ai

//	MYTRACE( "DrawSelectArea()  m_bBeginBoxSelect=%s\n", m_bBeginBoxSelect?"TRUE":"FALSE" );
	if( m_bBeginBoxSelect ){		/* 矩形範囲選択中 */
		// 2001.12.21 hor 矩形エリアにEOFがある場合、RGN_XORで結合すると
		// EOF以降のエリアも反転してしまうので、この場合はRedrawを使う
		// 2002.02.16 hor ちらつきを抑止するためEOF以降のエリアが反転したらもう一度反転して元に戻すことにする
		//if((m_nViewTopLine+m_nViewRowNum+1>=m_pcEditDoc->m_cLayoutMgr.GetLineCount()) &&
		//   (m_nSelectLineTo+1 >= m_pcEditDoc->m_cLayoutMgr.GetLineCount() ||
		//	m_nSelectLineToOld+1 >= m_pcEditDoc->m_cLayoutMgr.GetLineCount() ) ) {
		//	Redraw();
		//	return;
		//}

		hdc = ::GetDC( m_hWnd );
		hBrush = ::CreateSolidBrush( SELECTEDAREA_RGB );
		hBrushOld = (HBRUSH)::SelectObject( hdc, hBrush );
		nROP_Old = ::SetROP2( hdc, SELECTEDAREA_ROP2 );

		/* 2点を対角とする矩形を求める */
		TwoPointToRect(
			&rcOld,
			m_nSelectLineFromOld,	/* 範囲選択開始行 */
			m_nSelectColmFromOld,	/* 範囲選択開始桁 */
			m_nSelectLineToOld,		/* 範囲選択終了行 */
			m_nSelectColmToOld	

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?