
// ChildView.cpp : CChildView クラスの実装
//

#include "stdafx.h"
#include "TestLib.h"
#include "ChildView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

using namespace RLib;

void RichEditCtrl_AddString(CRichEditCtrl &richEditCtrl,const CString &sString)
{

	if( richEditCtrl.GetSafeHwnd() ){
		SCROLLINFO si = {0,};
		si.cbSize = sizeof(si);
		richEditCtrl.GetScrollInfo(SB_VERT,&si);						// 縦スクロールバーの現在位置を取得
		const int nLineCount = richEditCtrl.GetLineCount();				// 行数
		long start,end;
		richEditCtrl.GetSel(start,end);									// 選択されている部分
		const long nLineFromChar = richEditCtrl.LineFromChar(start);
		const bool bIsLastLine = nLineFromChar >= ( nLineCount - 1 );	// 最終行か？
		const bool bIsSelected = start != end;							// 選択しているか？
		richEditCtrl.SetSel( -1,-1 );									// 最終位置でテキスト選択(カーソル移動)
		richEditCtrl.ReplaceSel(sString);								// テキスト挿入

		if( bIsSelected || !bIsLastLine ){								// スクロール位置を追従しないなら
			richEditCtrl.SetSel(start,end);												// 選択を元に戻す
			richEditCtrl.PostMessage(WM_VSCROLL, MAKELONG(SB_THUMBPOSITION,si.nPos));	// スクロール位置を元に戻す
		}else{																			// スクロール位置を追従する場合
			richEditCtrl.PostMessage(WM_VSCROLL, MAKELONG(SB_BOTTOM, NULL));			// 最終行が表示されるようにスクロールする
		}

	}
}



// CChildView

CChildView::CChildView()
{
}

CChildView::~CChildView()
{
}

void CChildView::OnMessage(const CString &sMessage)
{
	CString s = CRString::Format( _T("\xd\xa%s %s"),COleDateTime::GetCurrentTime().Format(),sMessage);
	ATLTRACE(s);

	RichEditCtrl_AddString(m_richEditCtrl,s);

}

BEGIN_MESSAGE_MAP(CChildView, CWnd)
	ON_WM_PAINT()
	ON_WM_CREATE()
	ON_WM_SIZE()
END_MESSAGE_MAP()



// CChildView メッセージ ハンドラ

BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) 
{
	if (!CWnd::PreCreateWindow(cs))
		return FALSE;

	cs.dwExStyle |= WS_EX_CLIENTEDGE;
	cs.style &= ~WS_BORDER;
	cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, 
		::LoadCursor(NULL, IDC_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), NULL);

	return TRUE;
}

void CChildView::OnPaint() 
{
	CPaintDC dc(this); // 描画のデバイス コンテキスト
	
	// TODO: ここにメッセージ ハンドラ コードを追加します。
	
	// メッセージの描画のために CWnd::OnPaint() を呼び出さないでください。
}


int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CWnd::OnCreate(lpCreateStruct) == -1)
		return -1;

	::AfxInitRichEdit2();
	m_richEditCtrl.Create(ES_LEFT|ES_AUTOHSCROLL|ES_AUTOVSCROLL|ES_MULTILINE|ES_READONLY|WS_VISIBLE|WS_CHILD|WS_HSCROLL|WS_VSCROLL|WS_BORDER,CRect(0,0,0,0),this,0);
	{
		// デュアルフォントモードを無効にする
		DWORD dwLangOptions = SendMessage(EM_GETLANGOPTIONS, 0, 0); 
		dwLangOptions &= ~IMF_DUALFONT;
		m_richEditCtrl.SendMessage(EM_SETLANGOPTIONS, 0, (LPARAM)dwLangOptions);
		// フォント設定
		CHARFORMAT2 cf;
		m_richEditCtrl.GetDefaultCharFormat(cf);
		cf.dwMask = CFM_SIZE | CFM_FACE;
		lstrcpy(cf.szFaceName, _T("ＭＳ ゴシック"));
		cf.yHeight = 150;
		m_richEditCtrl.SetDefaultCharFormat(cf);
	}

	return 0;
}

void CChildView::OnSize(UINT nType, int cx, int cy)
{
	CWnd::OnSize(nType, cx, cy);

	// TODO: ここにメッセージ ハンドラ コードを追加します。
	CRect ClientRect;
	GetClientRect( &ClientRect );
	CSize sizeClient(ClientRect.Size());
	m_richEditCtrl.SetWindowPos (NULL, 0, 0, sizeClient.cx, sizeClient.cy, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
}
