// ★コメント未記入
/*-----------------------------------------------------------------------------
[名称]	EditDrawer.cpp
[概要]	CEditDrawer の実装
[備考]	なし
[履歴]	2003-12-20	b031228 (3177)DCのマッピング廃止に伴う修正(moralog)
		2003-12-22	b031228 (3181)等幅フォントの時はルーラを文字数に(moralog)
		2003-12-27	b031228	(3332)選択範囲が１行のときの置換範囲
		2003-12-28  b040111 (3632)キャレット位置の強調(moralog)
		2004-05-31	b040111 (4419)フローティング開始時の高速化(moralog)
		2004-05-31	b040111 (4421)BOX表示をかっこよくしたい(moralog)
-----------------------------------------------------------------------------*/

#include "stdafx.h"
#include "EditDrawer.h"
#include "ShitarabianDoc.h"
#include <string.h>
#include "GeneralSetting.h"
#include "Selection.h"
#include "ROISelection.h"
#include "Common.h"
#include "resource.h"
#include "ShitarabianPlugInManager.h"
#include "ShitarabianPlugIn.h"
#include "Unicoder.h"
#include "ExeCommon.h"
// ▼ (3632) BGN 2003.12.28 (moralog) キャレット位置を表示
#include "EmphasisLine.h"
// ▲ (3632) END

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif


CString	CEditDrawer::m_strBlank( g_cstrSmallBlank );


CFont*	f_pOlDFont;
void CEditDrawer::ReflectFont( CDC* pDC )
{
	CFont*	pfonText;
	pfonText = CGeneralSetting::GetInstance()->GetLogFont()->GetFont( pDC );
	f_pOlDFont = pDC->SelectObject( pfonText );
}

void CEditDrawer::RestoreFont( CDC* pDC )
{
	pDC->SelectObject( f_pOlDFont );
}



//////////////////////////////////////////////////////////////////////
// 構築/消滅
//////////////////////////////////////////////////////////////////////

CEditDrawer::CEditDrawer()
:	m_iZoom( 1 )
,	m_rcUpdate(0,0,0,0)
,	m_strEOF( "[EOF]" )
{
	RecalcFontSize();
}

CEditDrawer::~CEditDrawer()
{

}


CEditDrawer*	CEditDrawer::GetInstance()
{
	static CEditDrawer	sDrawer;

	return( &sDrawer );
}


long CEditDrawer::CaretRowToWindowPixelZoomed(
	long				iY
)
{
	long	lTopMargin;
	lTopMargin = CGeneralSetting::GetInstance()->GetTopMargin();

	return (
		CaretRowToPixel(
			iY
		)*m_iZoom + lTopMargin
	);
}


long CEditDrawer::PixelToCaretRow(
	long				iY,
	CShitarabianDoc*	pDoc
)
{
	// warning C4100:警告の無視
	pDoc;

	if ( iY < 0 )
	{
		return ( 0 );
	}

	long	iRow = iY/(( GetBlankHeight()+CGeneralSetting::GetInstance()->GetRowGap() ));

	return( iRow );
}

// 文字列群の行→Ｙピクセル
long CEditDrawer::CaretRowToPixel(
	long				iRow
)
{
	long	lPixelY = iRow * ( GetBlankHeight()+CGeneralSetting::GetInstance()->GetRowGap() );
	return( lPixelY );
}


//-----------------------------------------------------------------------------------
// ルーラー表示
void CEditDrawer::DrawRuler(
	CDC*			pDstDC,
// ▼ (3632) BGN 2003.12.28 (moralog) キャレット位置の表示追加
	CShitarabianDoc*	pDoc,
// ▲ (3632) END
	int				iDstX,
	int				iDstY
)
{
	if ( !CGeneralSetting::GetInstance()->GetVisibleRuler() )
	{
		return;
	}

	long	lLeftMargin;
	long	lTopMargin;
	lTopMargin = CGeneralSetting::GetInstance()->GetTopMargin();
	lLeftMargin = CGeneralSetting::GetInstance()->GetLeftMargin();

// ▼ (ワーニング回避) BGN 2003.12.29 (moralog) warning C4189
// ▽ original BGN
//	int		lWidth = (m_rcUpdate.Width()/m_iZoom) +2;
// △ original END
// ▲ (ワーニング回避) END
	{
		COLORREF	colBack = ::GetBackColor( EMPHASIS_RULER );
		COLORREF	colText = ::GetForeColor( EMPHASIS_RULER );
		COLORREF	colLine = ::GetForeColor( EMPHASIS_RULER );

		CPen	penLine;
		penLine.CreatePen( PS_SOLID, 1, colLine );
		CPen*	pOldPen = pDstDC->SelectObject( &penLine );

// ▼ (3177) BGN 2003.12.20 (moralog) DCのマッピング廃止に伴う修正
		// 塗りつぶし
		pDstDC->FillSolidRect(
			0,
			0,
			m_rcUpdate.right,
			lTopMargin,
			colBack
		);

		// 下端の線を描画
		pDstDC->MoveTo(
			lLeftMargin - iDstX,
			lTopMargin-1
		);
		pDstDC->LineTo(
			m_rcUpdate.right,
			lTopMargin-1
		);

		// フォントの設定
		CFont*	pfontOld = (CFont*)(pDstDC->SelectObject( CGeneralSetting::GetInstance()->GetRulerFont()->GetFont( pDstDC ) ) );

		pDstDC->SetTextColor( colText );
		pDstDC->SetBkMode( OPAQUE );
// ▼ (3181) BGN 2003.12.22 (moralog) 等幅フォントの時はルーラを文字数に
		if ( CGeneralSetting::GetInstance()->GetRulerUnitPixel() )
		{
			DrawRulerUnitPixel(
				pDstDC,
// ▼ (3632) BGN 2003.12.28 (moralog) キャレット位置の表示追加
				pDoc,
// ▲ (3632) END
				iDstX,
				iDstY,
				lLeftMargin,
				lTopMargin
			);
		}
		else
		{
			DrawRulerUnitColumn(
				pDstDC,
// ▼ (3632) BGN 2003.12.28 (moralog) キャレット位置の表示追加
				pDoc,
// ▲ (3632) END
				iDstX,
				iDstY,
				lLeftMargin,
				lTopMargin
			);
		}
/*
// ▽ original BGN
		// 目盛りの描画
		int	iStep = 10;
		int	x = (iDstX/m_iZoom-lLeftMargin)/iStep*iStep;
		for( x ; x<iDstX/m_iZoom+m_rcUpdate.right ; x+=iStep )
		{
			if( x >= 0 )
			if( x%100 == 0 )
			{
				pDstDC->MoveTo(
					lLeftMargin +x*m_iZoom -iDstX,
					0
				);
				pDstDC->LineTo(
					lLeftMargin +x*m_iZoom -iDstX,
					lTopMargin
				);
			}
			else if( x%50 == 0 )
			{
				pDstDC->MoveTo(
					lLeftMargin +x*m_iZoom -iDstX,
					lTopMargin/2-1
				);
				pDstDC->LineTo(
					lLeftMargin +x*m_iZoom -iDstX,
					lTopMargin-1
				);
			}
			else
			{
				pDstDC->MoveTo(
					lLeftMargin +x*m_iZoom -iDstX,
					lTopMargin*3/4-1
				);
				pDstDC->LineTo(
					lLeftMargin +x*m_iZoom -iDstX,
					lTopMargin-1
				);
			}
		}

		// 目盛りの数字を描画
		x = (iDstX/m_iZoom-lLeftMargin)/iStep*iStep;
		for( x ; x<iDstX/m_iZoom+m_rcUpdate.right ; x+=iStep )
		{
			if( x >= 0 )
			if( x%100 == 0 )
			{
				CString		strNumber;
				strNumber.Format("%d", x );

				CRect	rcText(
					lLeftMargin +x*m_iZoom +3 -iDstX,
					0,
					lLeftMargin +(x+100)*m_iZoom -1 -iDstX,
					lTopMargin-1
				);
				pDstDC->DrawText(
					strNumber,
					rcText,
					DT_LEFT
				);
			}
		}
// △ original END
*/
// ▲ (3181) END
/*
// ▽ oridinal BGN
		// 塗りつぶし
		pDstDC->FillSolidRect(
			0,
			0,
			lLeftMargin + iDstX + m_rcUpdate.Width(),
			iDstY + lTopMargin,
			colBack
		);

		// 下端の線を描画
		pDstDC->MoveTo(
			iDstX + lLeftMargin + 0,
			iDstY + lTopMargin-1
		);
		pDstDC->LineTo(
			iDstX + lLeftMargin + m_rcUpdate.Width(),
			iDstY + lTopMargin-1
		);

		// フォントの設定
		CFont*	pfontOld = (CFont*)(pDstDC->SelectObject( CGeneralSetting::GetInstance()->GetRulerFont()->GetFont( pDstDC ) ) );

		pDstDC->SetTextColor( colText );
		pDstDC->SetBkMode( OPAQUE );

		// 目盛りの描画
		int	iStep = 10;
		int	x = (iDstX/m_iZoom-lLeftMargin)/iStep*iStep;
		for( x ; x<iDstX/m_iZoom+lWidth ; x+=iStep )
		{
			if( x >= 0 )
			if( x%100 == 0 )
			{
				pDstDC->MoveTo(
					lLeftMargin +x*m_iZoom,
					iDstY + 0
				);
				pDstDC->LineTo(
					lLeftMargin +x*m_iZoom,
					iDstY + lTopMargin
				);
			}
			else if( x%50 == 0 )
			{
				pDstDC->MoveTo(
					lLeftMargin +x*m_iZoom,
					iDstY + lTopMargin/2-1
				);
				pDstDC->LineTo(
					lLeftMargin +x*m_iZoom,
					iDstY + lTopMargin-1
				);
			}
			else
			{
				pDstDC->MoveTo(
					lLeftMargin +x*m_iZoom,
					iDstY + lTopMargin*3/4-1
				);
				pDstDC->LineTo(
					lLeftMargin +x*m_iZoom,
					iDstY + lTopMargin-1
				);
			}
		}

		// 目盛りの数字を描画
		x = (iDstX/m_iZoom-lLeftMargin)/iStep*iStep;
		for( x ; x<iDstX/m_iZoom+lWidth ; x+=iStep )
		{
			if( x >= 0 )
			if( x%100 == 0 )
			{
				CString		strNumber;
				strNumber.Format("%d", x );

				CRect	rcText(
					lLeftMargin +x*m_iZoom +3,
					iDstY + 0,
					lLeftMargin +(x+100)*m_iZoom -1,
					iDstY + lTopMargin-1
				);
				pDstDC->DrawText(
					strNumber,
					rcText,
					DT_LEFT
				);
			}
		}
// △ oridinal END
*/
// ▲ (3177) END

		// フォントの復帰
		pDstDC->SelectObject( pfontOld );

		pDstDC->SelectObject( pOldPen );
	}
}


// ▼ (3181) BGN 2003.12.22 (moralog) 等幅フォントの時はルーラを文字数に
//-----------------------------------------------------------------------------------
// ルーラー表示
void CEditDrawer::DrawRulerUnitPixel(
	CDC*			pDstDC,
// ▼ (3632) BGN 2003.12.28 (moralog) キャレット位置の表示追加
	CShitarabianDoc*	pDoc,
// ▲ (3632) END
	int				iDstX,
	int				iDstY,
	long			lLeftMargin,
	long			lTopMargin
)
{
// ▼ (ワーニング回避) BGN 2003.12.29 (moralog) warning C4100
	// warning C4100 回避
	iDstY;
// ▲ (ワーニング回避) END

// ▼ (ワーニング回避) BGN 2003.12.29 (moralog) warning C4189
// ▽ original BGN
//	int		lWidth = (m_rcUpdate.Width()/m_iZoom) +2;
// △ original END
// ▲ (ワーニング回避) END
	{
// ▼ (3632) BGN 2003.12.28 (moralog) キャレット位置を表示
		// キャレット位置を表示
		if ( pDoc->GetOperationMode() == OperationNormal )
		if ( CGeneralSetting::GetInstance()->GetCaretMark() )
		{
			long	idxRow = pDoc->GetCaretRow();
			long	idxColumn = pDoc->GetCaretColumn();
			CEmphasisLine*	pLine = pDoc->GetEmphasisLine( idxRow );
			if ( pLine != NULL )
			{
				long	lCaretColumnPixel = pLine->CaretColumnToPixelZoomed( idxColumn );
				long	lCaretColumnPixelNext = pLine->CaretColumnToPixelZoomed( idxColumn+1 );
				long	lMarkWidth = lCaretColumnPixelNext - lCaretColumnPixel;
				if ( lMarkWidth <= 0 )
				{
					lMarkWidth = GetBlankWidthZoomed();
				}
				pDstDC->FillSolidRect(
					lLeftMargin + lCaretColumnPixel - iDstX,
					0,
					lMarkWidth,
					lTopMargin,
					::GetBackColor( EMPHASIS_CARETPOSITION )
				);
			}
		}
// ▲ (3632) END

		// 目盛りの描画
		int	iStep = 10;
		int	x = (iDstX/m_iZoom-lLeftMargin)/iStep*iStep;
		for( x ; x<iDstX/m_iZoom+m_rcUpdate.right ; x+=iStep )
		{
			if( x >= 0 )
			if( x%100 == 0 )
			{
				pDstDC->MoveTo(
					lLeftMargin +x*m_iZoom -iDstX,
					0
				);
				pDstDC->LineTo(
					lLeftMargin +x*m_iZoom -iDstX,
					lTopMargin
				);
			}
			else if( x%50 == 0 )
			{
				pDstDC->MoveTo(
					lLeftMargin +x*m_iZoom -iDstX,
					lTopMargin/2-1
				);
				pDstDC->LineTo(
					lLeftMargin +x*m_iZoom -iDstX,
					lTopMargin-1
				);
			}
			else
			{
				pDstDC->MoveTo(
					lLeftMargin +x*m_iZoom -iDstX,
					lTopMargin*3/4-1
				);
				pDstDC->LineTo(
					lLeftMargin +x*m_iZoom -iDstX,
					lTopMargin-1
				);
			}
		}

		// 目盛りの数字を描画
		x = (iDstX/m_iZoom-lLeftMargin)/iStep*iStep;
		for( x ; x<iDstX/m_iZoom+m_rcUpdate.right ; x+=iStep )
		{
			if( x >= 0 )
			if( x%100 == 0 )
			{
				CString		strNumber;
				strNumber.Format("%d", x );

				CRect	rcText(
					lLeftMargin +x*m_iZoom +3 -iDstX,
					0,
					lLeftMargin +(x+100)*m_iZoom -1 -iDstX,
					lTopMargin-1
				);
// ▼ (3632) BGN 2003.12.28 (moralog) 塗りつぶし色設定
				pDstDC->SetBkMode( TRANSPARENT );
// ▲ (3632) END
				pDstDC->DrawText(
					strNumber,
					rcText,
					DT_LEFT
				);
			}
		}
	}
}
// ▲ (3181) END

// ▼ (3181) BGN 2003.12.22 (moralog) 等幅フォントの時はルーラを文字数に
//-----------------------------------------------------------------------------------
// ルーラー表示
void CEditDrawer::DrawRulerUnitColumn(
	CDC*			pDstDC,
// ▼ (3632) BGN 2003.12.28 (moralog) キャレット位置の表示追加
	CShitarabianDoc*	pDoc,
// ▲ (3632) END
	int				iDstX,
	int				iDstY,
	long			lLeftMargin,
	long			lTopMargin
)
{
// ▼ (ワーニング回避) BGN 2003.12.29 (moralog) warning C4100
	// warning C4100 回避
	iDstY;
// ▲ (ワーニング回避) END

// ▼ (ワーニング回避) BGN 2003.12.29 (moralog) warning C4189
// ▽ original BGN
//	int		lWidth = (m_rcUpdate.Width()/m_iZoom) +2;
// △ original END
// ▲ (ワーニング回避) END
	int		iStep = this->GetBlankWidth();
	{
// ▼ (3632) BGN 2003.12.28 (moralog) キャレット位置を表示
		// キャレット位置を表示
		if ( pDoc->GetOperationMode() == OperationNormal )
		if ( CGeneralSetting::GetInstance()->GetCaretMark() )
		{
			long	idxRow = pDoc->GetCaretRow();
			long	idxColumn = pDoc->GetCaretColumn();
			CEmphasisLine*	pLine = pDoc->GetEmphasisLine( idxRow );
			if ( pLine != NULL )
			{
				long	lCaretColumnPixel = pLine->CaretColumnToPixelZoomed( idxColumn );
				long	lCaretColumnPixelNext = pLine->CaretColumnToPixelZoomed( idxColumn+1 );
				long	lMarkWidth = lCaretColumnPixelNext - lCaretColumnPixel;
				if ( lMarkWidth <= 0 )
				{
					lMarkWidth = GetBlankWidthZoomed();
				}
				pDstDC->FillSolidRect(
					lLeftMargin + lCaretColumnPixel - iDstX,
					0,
					lMarkWidth,
					lTopMargin,
					::GetBackColor( EMPHASIS_CARETPOSITION )
				);
			}
		}
// ▲ (3632) END

		// 目盛りの描画
		int	x = (iDstX/m_iZoom-lLeftMargin)/iStep;
		for( x ; x*iStep<iDstX/m_iZoom+m_rcUpdate.right ; x++ )
		{
			if( x >= 0 )
			if( x%10 == 0 )
			{
				pDstDC->MoveTo(
					lLeftMargin +x*iStep*m_iZoom -iDstX,
					0
				);
				pDstDC->LineTo(
					lLeftMargin +x*iStep*m_iZoom -iDstX,
					lTopMargin
				);
			}
			else if( x%5 == 0 )
			{
				pDstDC->MoveTo(
					lLeftMargin +x*iStep*m_iZoom -iDstX,
					lTopMargin/2-1
				);
				pDstDC->LineTo(
					lLeftMargin +x*iStep*m_iZoom -iDstX,
					lTopMargin-1
				);
			}
			else
			{
				pDstDC->MoveTo(
					lLeftMargin +x*iStep*m_iZoom -iDstX,
					lTopMargin*3/4-1
				);
				pDstDC->LineTo(
					lLeftMargin +x*iStep*m_iZoom -iDstX,
					lTopMargin-1
				);
			}
		}

		// 目盛りの数字を描画
		x = 0;//(iDstX/m_iZoom)/iStep;
		int		idxUnit;
		for( idxUnit=0 ; idxUnit*iStep<iDstX/m_iZoom+m_rcUpdate.right ; idxUnit+=10 )
		{
			{
				CString		strNumber;
				strNumber.Format("%d", idxUnit );

				CRect	rcText(
					lLeftMargin +(x + idxUnit*iStep)*m_iZoom +3 -iDstX,
					0,
					lLeftMargin +(x + (idxUnit+10)*iStep)*m_iZoom -1 -iDstX,
					lTopMargin-1
				);
// ▼ (3632) BGN 2003.12.28 (moralog) 塗りつぶし色設定
				pDstDC->SetBkMode( TRANSPARENT );
// ▲ (3632) END
				pDstDC->DrawText(
					strNumber,
					rcText,
					DT_LEFT
				);
			}
		}

	}
}
// ▲ (3181) END

//-----------------------------------------------------------------------------------
// １行表示
// MEMDCに描画を行い、拡大してDCへコピー
long CEditDrawer::DrawZoomedLine(
	CShitarabianDoc*	pDoc,
	CDC*				pDstDC,
	int					iRow,
	int					iScrollBoxLeft,		// [画面座標]
	int					iScrollBoxTop		// [画面座標]
)
{
/*
(1)アップデート矩形幅のメモリDCを作る
(1-1)壁紙の描画
(1-2)アップデート矩形開始Xの分だけずらして文字を描画する
	描画範囲はリクエスト（ウィンドウ座標？）のあった分
(2)メモリDCから出力先DCに転送する
(3)出力先DCに左端に行番号を入れる

問題点：
	m_rcUpdate を更新要求矩形として使用しているが
	すべての局面でちゃんと SetUpdateRect() を設定しているのか疑問。
	というか、してないような？

	CEmphasisLine::Draw()にコーディングエラーチェックを入れた。
*/
	// アップデート矩形/Zoom（+α）のMemDCを作る
	int		lWidth = (m_rcUpdate.Width()/m_iZoom) +2;
	int		lHeight = ( GetBlankHeight()+CGeneralSetting::GetInstance()->GetRowGap() );
	CDC			MemDC;
	MemDC.CreateCompatibleDC ( pDstDC );
	CBitmap		MemBitmap;
	MemBitmap.CreateCompatibleBitmap(
		pDstDC,
		lWidth,
		lHeight
	);
	CBitmap*	pOldBitmap = MemDC.SelectObject( &MemBitmap );

	COLORREF	colFore = ::GetForeColor( EMPHASIS_TEXT );
	COLORREF	colBack = ::GetBackColor( EMPHASIS_TEXT );

	long	lLeftMargin;
	long	lTopMargin;
	lTopMargin = CGeneralSetting::GetInstance()->GetTopMargin();
	lLeftMargin = CGeneralSetting::GetInstance()->GetLeftMargin();


	// 背景塗りつぶし
	{
		MemDC.FillSolidRect(
			0,0,
			lWidth,
			lHeight,
			colBack
		);

		// ビットマップを転送してみる
		{
			CShitarabianPlugInManager::GetInstance()->OnDrawWall(
				pDoc->GetInterface(),
				&MemDC,
// ▼ (3177) BGN 2003.12.20 (moralog) DCのマッピング廃止に伴う修正
				iScrollBoxLeft/m_iZoom,
				CaretRowToPixel( iRow ),
// ▽ oridinal BGN
//				m_rcUpdate.left/m_iZoom,
//				iScrollBoxTop/m_iZoom,
// △ oridinal END
// ▲ (3177) END
				lWidth,
				lHeight
			);
		}
	}

	// MemDCに文字列描画
	int	iMaxWidth = 0;
	{
		MemDC.SetBkMode( TRANSPARENT );
		SetDstX( -m_rcUpdate.left/m_iZoom );
		SetDstY( 0 );
		iMaxWidth = DrawPlaneLine(
			pDoc,
			&MemDC,
			iRow,
			TRUE
		);
	}

	// ROI矩形を描画
	if( pDoc->GetOperationMode() == OperationROI )
	{
		CRect	rcROI = pDoc->GetROISelection()->GetROI();
		rcROI.NormalizeRect();
		if ( rcROI != CRect(0,0,0,0) )
		{
// ▼ (3177) BGN 2003.12.27 (moralog) DCのマッピング廃止に伴う修正
			rcROI.left		-= iScrollBoxLeft/m_iZoom;
			rcROI.right		-= iScrollBoxLeft/m_iZoom;
			rcROI.top		-= CaretRowToPixel( iRow );
			rcROI.bottom	-= CaretRowToPixel( iRow );
// ▽ oridinal BGN
//			rcROI.left		-= m_rcUpdate.left/m_iZoom;
//			rcROI.right		-= m_rcUpdate.left/m_iZoom;
//			rcROI.top		-= iScrollBoxTop/m_iZoom;
//			rcROI.bottom	-= iScrollBoxTop/m_iZoom;
// △ oridinal END
// ▲ (3177) END
			MemDC.DrawFocusRect( rcROI );
		}
	}

	// 印刷幅指示線を描画
	if ( CGeneralSetting::GetInstance()->GetPrintDefine()->m_bPrintWidthLine )
	{
		int	iPrintWidth = CGeneralSetting::GetInstance()->GetPrintDefine()->m_lPrintPixelWidth;
		{
			CPen*	ppenOld;
			CPen	penWhite;
			penWhite.CreatePen( PS_SOLID, 1, colFore );
			CPen	penBlack;
			penBlack.CreatePen( PS_DOT, 1, colBack );

			long	lLeftX = (iPrintWidth) - m_rcUpdate.left/m_iZoom;
// DOTの線が途切れないようにしたい
			long	lOffsetY = (iRow*lHeight);

			ppenOld = MemDC.SelectObject( &penWhite );
			MemDC.MoveTo( lLeftX, 0 );
			MemDC.LineTo( lLeftX, lHeight );
			MemDC.SelectObject( &penBlack );
			MemDC.MoveTo( lLeftX, -lOffsetY );
			MemDC.LineTo( lLeftX, lHeight );
			MemDC.SelectObject( ppenOld );
		}
	}

// ▼ (3632) BGN 2003.12.28 (moralog) キャレット位置表示色定義追加
	// キャレット位置表示
	if ( pDoc->GetOperationMode() == OperationNormal )
	if ( CGeneralSetting::GetInstance()->GetCaretLine() )
	if ( iRow == pDoc->GetCaretRow() )
	{
		COLORREF colMarkFore = ::GetForeColor( EMPHASIS_CARETPOSITION );
		COLORREF colMarkBack = ::GetBackColor( EMPHASIS_CARETPOSITION );

		CPen*	ppenOld;
		CPen	penFore;
		penFore.CreatePen( PS_SOLID, 1, colMarkFore );
		CPen	penBack;
		penBack.CreatePen( PS_DOT, 1, colMarkBack );

		long	lMarkHeight = min( GetBlankHeight()+1, lHeight );

		ppenOld = MemDC.SelectObject( &penFore );
		MemDC.MoveTo( 0, lMarkHeight-1 );
		MemDC.LineTo( lWidth, lMarkHeight-1 );
		MemDC.SelectObject( &penBack );

		MemDC.MoveTo( 0, lMarkHeight-1 );
		MemDC.LineTo( lWidth, lMarkHeight-1 );
		MemDC.SelectObject( ppenOld );
	}
// ▲ (3632) END

	if ( 1 )
	{
		if ( m_iZoom == 1 )
		{
			// Dstへ転送
			pDstDC->BitBlt(
// ▼ (3177) BGN 2003.12.20 (moralog) DCのマッピング廃止に伴う修正
				lLeftMargin,
// ▽ oridinal BGN
//				lLeftMargin + m_rcUpdate.left,
// △ oridinal END
// ▲ (3177) END
				lTopMargin + iScrollBoxTop,
				lWidth,
				lHeight,
				&MemDC,
				0,
				0,
				SRCCOPY
			);
		}
		else
		{
			// 拡大してDstへ転送
			pDstDC->StretchBlt(
// ▼ (3177) BGN 2003.12.20 (moralog) DCのマッピング廃止に伴う修正
				lLeftMargin,
// ▽ oridinal BGN
//				lLeftMargin + (m_rcUpdate.left/m_iZoom)*m_iZoom,
// △ oridinal END
// ▲ (3177) END
				lTopMargin + iScrollBoxTop,
				lWidth*m_iZoom,
				lHeight*m_iZoom,
				&MemDC,
				0,
				0,
				lWidth,
				lHeight,
				SRCCOPY
			);
		}
	}
	MemDC.SelectObject( pOldBitmap );
// ▼ (4419) BGN 2004.05.31 (moralog) フローティング開始時の高速化
	MemDC.DeleteDC();
// ▲ (4419) END


	long	lLeftNumberMargin;
// ▼ (3632) BGN 2003.12.28 (moralog) 行番号幅の取得方法修正
	if ( CGeneralSetting::GetInstance()->GetVisibleNumber() )
	{
		lLeftNumberMargin = CGeneralSetting::GetInstance()->GetLeftNumberMargin();
	}
	else
	{
		lLeftNumberMargin = 0;
	}
// ▽ original BGN
//	lLeftNumberMargin = CGeneralSetting::GetInstance()->GetLeftNumberMargin();
// △ original END
// ▲ (3632) END

	// 左余白塗りつぶし
	pDstDC->FillSolidRect(
// ▼ (3177) BGN 2003.12.20 (moralog) DCのマッピング廃止に伴う修正
		0,
// ▽ oridinal BGN
//		iScrollBoxLeft,
// △ oridinal END
// ▲ (3177) END
		iScrollBoxTop+ lTopMargin,
		lLeftMargin,
		lHeight* m_iZoom,
		colBack
	);

	// 行番号表示
	if ( iRow < pDoc->GetLineCount() )
	{
		// 行番号範囲塗りつぶし
		if ( CGeneralSetting::GetInstance()->GetVisibleNumber() )
		{
			colFore = ::GetForeColor( EMPHASIS_NUMBER );
			colBack = ::GetBackColor( EMPHASIS_NUMBER );

			// 塗りつぶし
			pDstDC->FillSolidRect(
// ▼ (3177) BGN 2003.12.20 (moralog) DCのマッピング廃止に伴う修正
				0,
// ▽ oridinal BGN
//				iScrollBoxLeft,
// △ oridinal END
// ▲ (3177) END
				iScrollBoxTop + lTopMargin,
				lLeftNumberMargin,
				lHeight*m_iZoom,
				colBack
			);
		}

		long	lLeftNumberMargin;
		lLeftNumberMargin = CGeneralSetting::GetInstance()->GetLeftNumberMargin();

		// マーク行表示
		if ( pDoc->IsMark( iRow ) )
		{
			colFore = ::GetForeColor( EMPHASIS_MARKED );
			colBack = ::GetBackColor( EMPHASIS_MARKED );
			pDstDC->FillSolidRect(
// ▼ (3177) BGN 2003.12.20 (moralog) DCのマッピング廃止に伴う修正
				0,
// ▽ oridinal BGN
//				iScrollBoxLeft,
// △ oridinal END
// ▲ (3177) END
				iScrollBoxTop + lTopMargin,
				iScrollBoxLeft + lLeftMargin,
				GetBlankHeight()*m_iZoom,
				colBack
			);
		}
		else
		// 更新行表示
		if ( CGeneralSetting::GetInstance()->GetVisibleNumber() )
		if ( pDoc->IsModify( iRow ) )
		{
			colFore = ::GetForeColor( EMPHASIS_MODIFIED );
			colBack = ::GetBackColor( EMPHASIS_MODIFIED );

			pDstDC->FillSolidRect(
// ▼ (3177) BGN 2003.12.20 (moralog) DCのマッピング廃止に伴う修正
				0,
// ▽ oridinal BGN
//				iScrollBoxLeft,
// △ oridinal END
// ▲ (3177) END
				iScrollBoxTop + lTopMargin,
				lLeftNumberMargin,
				GetBlankHeight()*m_iZoom,
				colBack
			);
		}

		// 行番号描画
		if ( CGeneralSetting::GetInstance()->GetVisibleNumber() )
		{
			// フォントの設定
			ReflectFont( pDstDC );

			CRect	rcNumber(
// ▼ (3177) BGN 2003.12.20 (moralog) DCのマッピング廃止に伴う修正
				0,
// ▽ oridinal BGN
//				iScrollBoxLeft,
// △ oridinal END
// ▲ (3177) END
				iScrollBoxTop + lTopMargin,
// ▼ (3177) BGN 2003.12.20 (moralog) DCのマッピング廃止に伴う修正
				lLeftNumberMargin-1,
// ▽ oridinal BGN
//				iScrollBoxLeft + lLeftNumberMargin-1,
// △ oridinal END
// ▲ (3177) END
				iScrollBoxTop + lTopMargin + GetBlankHeight()*m_iZoom-1 //lHeight*m_iZoom-1
			);
			CString		strNumber;
			strNumber.Format( "%06d ", iRow+1 );

			pDstDC->SetTextColor(
				colFore
			);
			pDstDC->DrawText(
				strNumber,
				rcNumber,
				DT_RIGHT | DT_VCENTER | DT_SINGLELINE
			);

			// フォントの復帰
			RestoreFont( pDstDC );
		}
	}

// ▼ (3632) BGN 2003.12.28 (moralog) キャレット位置表示色定義追加
	// キャレット位置表示
	if ( pDoc->GetOperationMode() == OperationNormal )
	if ( CGeneralSetting::GetInstance()->GetCaretMark() )
	if ( iRow == pDoc->GetCaretRow() )
	{
		colFore = ::GetForeColor( EMPHASIS_CARETPOSITION );
		colBack = ::GetBackColor( EMPHASIS_CARETPOSITION );

		long	lMarkHeight = min( GetBlankHeight()+1, lHeight );
		lMarkHeight += (lMarkHeight % 2 -1);
		lMarkHeight *= GetZoom();

		CPoint	ptTri[4];
		ptTri[0].x = lLeftNumberMargin;
		ptTri[0].y = iScrollBoxTop + lTopMargin;
		ptTri[1].x = lLeftMargin;
		ptTri[1].y = iScrollBoxTop + lTopMargin + (lMarkHeight/2);
		ptTri[2].x = lLeftNumberMargin;
		ptTri[2].y = iScrollBoxTop + lTopMargin + (lMarkHeight)-1;
		ptTri[3].x = lLeftNumberMargin;
		ptTri[3].y = iScrollBoxTop + lTopMargin;

		// 塗りつぶし
		{
			CBrush	brSolid( colBack );
			CBrush*	pbrOld = pDstDC->SelectObject( &brSolid );
			CPen	penSolid( PS_SOLID, 1, colBack );
			CPen*	ppenOld = pDstDC->SelectObject( &penSolid );

			pDstDC->SetPolyFillMode( ALTERNATE );
			pDstDC->Polygon(
				ptTri,
				3
			);
			pDstDC->SelectObject( ppenOld );
			pDstDC->SelectObject( pbrOld );
		}

		// 縁取り
		{
			CPen	penSolid( PS_SOLID, 1, colFore );
			CPen*	ppenOld = pDstDC->SelectObject( &penSolid );

			pDstDC->Polyline(
				ptTri,
				4
			);
			pDstDC->SelectObject( ppenOld );
		}
	}
// ▲ (3632) END

	return( iMaxWidth * m_iZoom );
}


//-----------------------------------------------------------------------------------
// １行表示
long CEditDrawer::DrawPlaneLine(
	CShitarabianDoc*	pDoc,
	CDC*				pDstDC,
	int					iRow,
	BOOL				bCareSelection
)
{
	if ( iRow >= pDoc->GetLineCount() )
	{
		return( 0 );
	}

	CEmphasisLine*	pLine = pDoc->GetEmphasisLine( iRow );
	pLine->Draw(
		pDstDC,
		GetDstX(),
		GetDstY(),
		m_rcUpdate.left,
		m_rcUpdate.Width(),
		CGeneralSetting::GetInstance()->GetEmphasisDefine()->GetEnable(),
		CGeneralSetting::GetInstance()->GetEmphasisDefine(),
		bCareSelection,
		pDoc,
		iRow
	);

	return( pLine->GetWidth() );
}

//-----------------------------------------------------------------------------------
// １文字表示領域計算
CSize CEditDrawer::ExtentCharactor(
	const char*		pstrSrc,
	CDC*			pDstDC,
	int*			pnPrintedByte,		// 処理バイト数
	int*			pnPrintedColumn,	// 処理カラム数
	int				iStartX				// 表示開始X座標（文字列の相対位置）
)
{
	*pnPrintedByte = 0;
	*pnPrintedColumn = 0;

	if( *pstrSrc == 0x00 )
	{
		return( GetEOFWidth() );
	}

	// 文字符号検査
	{
		CUnicoder*	pUnicoder = CUnicoder::GetInstance();
		wchar_t		wcharUnicode;
		*pnPrintedByte = pUnicoder->IsUnicode(
			pstrSrc,
			&wcharUnicode
		);
		// UnicodeであればUnicode描画
		if ( *pnPrintedByte > 0 )
		{
			CSize	sizeExtent;
			sizeExtent = pUnicoder->ExtextCharCode(
// ▼ (3344) BGN 2004.05.20 (moralog) Unicodeレンダリング方法変更
				pDstDC->m_hDC,
// ▽ original BGN
//				pDstDC,
// △ original END
// ▲ (3344) END
				wcharUnicode
			);
			*pnPrintedColumn = *pnPrintedByte;
			return( sizeExtent );
		}
	}

	// マルチバイト判別
	int		iByteSize;
	if ( _istleadbyte( *pstrSrc ) != 0 )
	{
		iByteSize = 2;
	}
	else
	{
		iByteSize = 1;

		switch ( *pstrSrc )
		{
		case '\t':
			if ( !CGeneralSetting::GetInstance()->GetTabConvert() )
			{
				// タブ間隔計算
				int		iWidth;
				{
					int	nTab = CGeneralSetting::GetInstance()->GetTabCount();
					long	iTabMark = GetBlankWidth() * nTab;
					long	lX = iStartX;
					iWidth = ((lX+iTabMark) / iTabMark) * iTabMark - lX;
				}

				*pnPrintedByte = iByteSize;
				*pnPrintedColumn = 1;
				CSize	sizeExtent;
				sizeExtent.cx = iWidth;
				sizeExtent.cy = GetBlankHeight();
				return( sizeExtent );
			}
			else
			{
				*pnPrintedByte = iByteSize;
				*pnPrintedColumn = 1;
				return( CSize(0,0) );
			}
			break;

		default:
			break;
		}
	}
	*pnPrintedByte = iByteSize;
	*pnPrintedColumn = 1;

	// 使用領域計算
	CSize	sizeExtent = pDstDC->GetTextExtent( pstrSrc, iByteSize );

// ▼ (3181) BGN 2003.12.22 (moralog) ルーラ表示がカラム単位のときは文字大きさを半角空白基準にする
	if ( !CGeneralSetting::GetInstance()->GetRulerUnitPixel() )	
	if ( sizeExtent.cx % GetBlankWidth() )
	{
		sizeExtent.cx += GetBlankWidth() - ( sizeExtent.cx % GetBlankWidth());
	}
// ▲ (3181) END

	return( sizeExtent );
}


//-----------------------------------------------------------------------------------
// １文字表示
void CEditDrawer::DrawCharactor(
	const char*		pstrSrc,
	CDC*			pDstDC,
	int*			pnPrintedByte,		// 処理バイト数
	int				iExtentChar,
	BOOL			bBox
)
{

	// 文字符号検査
	{
		CUnicoder*	pUnicoder = CUnicoder::GetInstance();
		wchar_t		wcharUnicode;
		*pnPrintedByte = pUnicoder->IsUnicode(
			pstrSrc,
			&(wcharUnicode)
		);
		// UnicodeであればUnicode描画
		if ( *pnPrintedByte > 0 )
		{
			CRect	rcDst( GetDstX(), GetDstY(), GetDstX(), GetDstY() );
			pUnicoder->DrawCharCode(
// ▼ (3344) BGN 2004.05.20 (moralog) Unicodeレンダリング方法変更
				pDstDC->m_hDC,
// ▽ original BGN
//				pDstDC,
// △ original END
// ▲ (3344) END
				rcDst,
				wcharUnicode
			);
			return;
		}
	}

	DrawSJisCharactor(
		pstrSrc,
		pDstDC,
		pnPrintedByte,		// 処理バイト数
		iExtentChar,
		bBox
	);
}

void CEditDrawer::DrawSJisCharactor(
	const char*		pstrSrc,
	CDC*			pDstDC,
	int*			pnPrintedByte,		// 処理バイト数
	int				iExtentChar,
	BOOL			bBox
)
{
	BOOL	bDrawText = TRUE;

	// マルチバイト判別
	int		iByteSize = 0;
	if ( _istleadbyte( *pstrSrc ) != 0 )
	{
		iByteSize = 2;
	}
	else
	{
		iByteSize = 1;
	}
	*pnPrintedByte = iByteSize;

	if ( bBox )
	{
		if ( iExtentChar > 0 )
		{
			// 可視化文字矩形描画
// ▼ (4421) BGN 2004.05.31 (moralog) かっちょいいBOX表示
			CRect	rcFrame(
				GetDstX(),
				GetDstY(),
				GetDstX() + iExtentChar- 1,
				GetDstY() + GetBlankHeight() -1
			);

			long	x;
			long	y;
			for( x=rcFrame.left ; x<rcFrame.right ; x+=2 )
			{
				// 上辺
				pDstDC->FillSolidRect( x, rcFrame.top, 1, 1, pDstDC->GetTextColor() );
				// 下辺
				pDstDC->FillSolidRect( x, rcFrame.bottom, 1, 1, pDstDC->GetTextColor() );
			}
			for( y=rcFrame.top ; y<rcFrame.bottom ; y+=2 )
			{
				// 左辺
				pDstDC->FillSolidRect( rcFrame.left, y, 1, 1, pDstDC->GetTextColor() );
				// 右辺
				pDstDC->FillSolidRect( rcFrame.right-1, y, 1, 1, pDstDC->GetTextColor() );
			}

/*
// ▽ oridinal BGN
			CPen	penDot( PS_DOT, 1, pDstDC->GetTextColor() );
			CRect	rcFrame(
				GetDstX(),
				GetDstY(),
				GetDstX() + iExtentChar- 1,
				GetDstY() + GetBlankHeight() -1
			);

			CPen*	ppenOld = pDstDC->SelectObject( &penDot );
			pDstDC->MoveTo( rcFrame.left, rcFrame.top+1 );
			pDstDC->LineTo( rcFrame.right-1,rcFrame.top+1 );
			pDstDC->LineTo( rcFrame.right-1,rcFrame.bottom-1 );
			pDstDC->LineTo( rcFrame.left, rcFrame.bottom-1 );
			pDstDC->LineTo( rcFrame.left, rcFrame.top+1 );
			pDstDC->SelectObject( ppenOld );
// △ oridinal END
*/
// ▲ (4421) END
		}
	}
	else
	{
		if ( iByteSize == 1 )
		if( ((UCHAR)*pstrSrc) < 0x20 )
		{
			// コントロールコードは描画しない
			return;
		}

		if ( bDrawText )
		{
			// 文字の描画
			pDstDC->TextOut(
				GetDstX(),
				GetDstY(),
				pstrSrc,
				iByteSize
			);
		}
	}
}


long CEditDrawer::GetEOFWidth()
{
	return( m_iEOFWidth );
}
long CEditDrawer::GetBlankWidth()
{
	return( m_iBlankWidth );
}


long CEditDrawer::GetBlankHeight()
{
	return( m_iBlankHeight );
}


// please! HTMLもじふごうとかたいおうしなきゃだめじゃｎ
long CEditDrawer::GetCharWidth( CDC* pDC, CString str )
{
	long	lWidth;

	if ( pDC == NULL )
	{
		HDC		hdc = ::GetDC( NULL );
		CDC		DC;
		DC.Attach( hdc );

// ▼ (3344) BGN 2004.05.31 (moralog) Unicode文字でパディング
		lWidth = StringToPixelX(
			(LPCTSTR)str,
			&DC
		);
/*
// ▽ oridinal BGN
		ReflectFont( &DC );
		CSize	sizeExtent = DC.GetTextExtent( m_strBlank );
		RestoreFont( &DC );
		lWidth = sizeExtent.cx;
// △ oridinal END
*/
// ▲ (3344) END

		DC.Detach();
		::ReleaseDC( NULL, hdc );
	}
	else
	{
		ReflectFont( pDC );
// ▼ (3344) BGN 2004.05.31 (moralog) Unicode文字でパディング
		lWidth = StringToPixelX(
			(LPCTSTR)str,
			pDC
		);
		RestoreFont( pDC );
/*
// ▽ oridinal BGN
		CSize	sizeExtent = pDC->GetTextExtent( m_strBlank );
		RestoreFont( pDC );
		lWidth = sizeExtent.cx;
// △ oridinal END
*/
// ▲ (3344) END
	}

	return( lWidth );
}




void CEditDrawer::RecalcFontSize()
{
	HDC		hdc = ::GetDC( NULL );
	CDC		DC;
	DC.Attach( hdc );
	ReflectFont( &DC );

	CSize	sizeExtent;
	sizeExtent = DC.GetTextExtent( m_strBlank );
	m_iBlankWidth = sizeExtent.cx;
	m_iBlankHeight = sizeExtent.cy;

	sizeExtent = DC.GetTextExtent( m_strEOF );
	m_iEOFWidth = sizeExtent.cx;

	RestoreFont( &DC );
	DC.Detach();
	::ReleaseDC( NULL, hdc );
}



// 文字列→Ｘピクセル
long	CEditDrawer::StringToPixelX(
	const char*		pstrSrc,	// 文字列 [マルチバイト判別] (-)
	CDC*			pDstDC
)
{
	ReflectFont( pDstDC );

	long	lSizeX = 0;

	SetDstX( 0 );
	while( *pstrSrc != '\0' )
	{
		int		iByteSize;
		int		iColumnSize;
		// 使用領域計算
		CSize	sizeExtent = ExtentCharactor(
			pstrSrc,
			pDstDC,
			&iByteSize,
			&iColumnSize,
			GetDstX()
		);
		lSizeX += sizeExtent.cx;

		SetDstX( GetDstX()+sizeExtent.cx );

		pstrSrc += iByteSize;
	}

	RestoreFont( pDstDC );

	return( lSizeX );
}

// Ｙピクセル→文字列群の行
long CEditDrawer::PixelToCaretRowZoomed(
	long				iY,
	CShitarabianDoc*	pDoc
){ return( PixelToCaretRow(iY/m_iZoom,pDoc) );};

long CEditDrawer::WindowPixelToCaretRowZoomed(
	long				iY,
	CShitarabianDoc*	pDoc
){

	long	lTopMargin;
	lTopMargin = CGeneralSetting::GetInstance()->GetTopMargin();
	int		iRow = PixelToCaretRow((iY-lTopMargin)/m_iZoom,pDoc);
	return( iRow );
};


// 文字列群の行→Ｙピクセル
long CEditDrawer::CaretRowToPixelZoomed(
	long				iRow
){ return( CaretRowToPixel(iRow)*m_iZoom );};



// StretchBlt()遅すぎ。
// どうせ整数倍の拡大（補間なし）しかしないので自前でやってみる
void CEditDrawer::QuickStretchBlt(
	CBitmap*	pbmpSrc,
	CBitmap*	pbmpDst
)
{
	int		iZoom = m_iZoom;

	// Dstの１ラインのバイト数を取得
	BITMAP		tDstBitmap;
	pbmpDst->GetBitmap( &tDstBitmap );
	int			nDstLineByte = tDstBitmap.bmWidthBytes;

	// Srcの１ラインのバイト数を取得
	BITMAP		tSrcBitmap;
	pbmpSrc->GetBitmap( &tSrcBitmap );
	int			nSrcLineByte = tSrcBitmap.bmWidthBytes;

	// 色深度を取得（Dst、Srcともに同じはず）
	int		iDepth = (tSrcBitmap.bmBitsPixel+7)/8;

	// ビットマップデータを取得
	int	nSrcByte = tSrcBitmap.bmBitsPixel*nSrcLineByte*tSrcBitmap.bmHeight;
	char*	pSrcBits = new char[ nSrcByte ];
	pbmpSrc->GetBitmapBits( nSrcByte, pSrcBits );
	int	nDstByte = tDstBitmap.bmBitsPixel*nDstLineByte*tDstBitmap.bmHeight;
	char*	pDstBits = new char[ nDstByte ];
	pbmpDst->GetBitmapBits( nDstByte, pDstBits );

	int		iHeight = min( tSrcBitmap.bmHeight, tDstBitmap.bmHeight/iZoom );
	int		iWidth = min( tSrcBitmap.bmWidth, tDstBitmap.bmWidth/iZoom );

	// 行のループ
	int			idxLine;
	int			iSrcOffsetLine = 0;
	int			iDstOffsetLine = 0;
	int			iSrcOffset = 0;
	int			iDstOffset = 0;
	for( idxLine=0 ; idxLine<iHeight; idxLine++ )
	{
	// ラインごとの処理
		iDstOffset = iDstOffsetLine;
		iSrcOffset = iSrcOffsetLine;

		// カラムのループ
		int		idxColumn;
		for( idxColumn=0 ; idxColumn<iWidth ; idxColumn++ )
		{
			// 拡大倍率分だけ転送
			int		idxZoom;
			for( idxZoom=0 ; idxZoom<iZoom ; idxZoom++ )
			{
				int		idxDepth;
				for( idxDepth=0 ; idxDepth<iDepth ; idxDepth++ )
				{
					*( pDstBits+(iDstOffset++) ) = *( pSrcBits+iSrcOffset+idxDepth );
				}
			}
			iSrcOffset += iDepth;
		}

		// ライン分だけ転送memcpy
		int		idxZoom;
		int		iDstOffsetLineStart = iDstOffsetLine;
		for( idxZoom=1 ; idxZoom<iZoom ; idxZoom++ )
		{
			iDstOffsetLine += nDstLineByte;
			memcpy( pDstBits+iDstOffsetLine, pDstBits+iDstOffsetLineStart, nDstLineByte );
		}

		iSrcOffsetLine += nSrcLineByte;
		iDstOffsetLine += nDstLineByte;
	}

	pbmpDst->SetBitmapBits( nDstByte, pDstBits );

	delete [] pDstBits;
	delete [] pSrcBits;
}





// 末尾文字の描画
void CEditDrawer::DrawEOL(
	CDC*	pDstDC,
	BOOL	bEOF,
	BOOL	bSelected
)
{
	// EOF表示
	if( bEOF )
	{
		if ( CGeneralSetting::GetInstance()->GetEmphasisDefine()->GetItemz()[EMPHASIS_EOF].GetEnable() )
		{
			COLORREF colFore = ::GetForeColor( EMPHASIS_EOF );

			pDstDC->SetTextColor( colFore );
			pDstDC->TextOut(
				GetDstX(),
				GetDstY(),
				m_strEOF,
				m_strEOF.GetLength()
			);
		}
	}
	else
	{
		// 改行文字表示
		if ( CGeneralSetting::GetInstance()->GetEmphasisDefine()->GetItemz()[EMPHASIS_CRLF].GetEnable() )
		{
			COLORREF colFore = ::GetForeColor( EMPHASIS_CRLF );;
			COLORREF colBack = ::GetBackColor( EMPHASIS_CRLF );
			if( bSelected )
			{
				colFore = ::GetForeColor( EMPHASIS_SELECTED );
				colBack = ::GetBackColor( EMPHASIS_SELECTED );
			}

			int	iWidth = GetBlankWidth();
			int	iHeight = GetBlankHeight();

			CPen	penDot( PS_SOLID, 1, colFore );
			CPen*	ppenOld = pDstDC->SelectObject( &penDot );

			// 縦線
			pDstDC->MoveTo( GetDstX()+iWidth*7/8, GetDstY()+iHeight*1/4 );
			pDstDC->LineTo( GetDstX()+iWidth*7/8, GetDstY()+iHeight*3/4 );

			// 横線
			pDstDC->LineTo( GetDstX()+iWidth*1/4-1, GetDstY()+iHeight*3/4 );

			// →
			pDstDC->MoveTo( GetDstX()+iWidth*2/4, GetDstY()+iHeight*5/8 );
			pDstDC->LineTo( GetDstX()+iWidth*1/4-1, GetDstY()+iHeight*3/4 );
			pDstDC->LineTo( GetDstX()+iWidth*2/4+1, GetDstY()+iHeight*7/8+1 );

			pDstDC->SelectObject( ppenOld );
		}
	}
}
