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 + -
显示快捷键?