/*-----------------------------------------------------------------------------
[名称]	BlankDlg.cpp
[概要]	空白文字定義ダイアログクラスの実装
[備考]	なし
[履歴]	2003-02-08	NC		コメント付加(moralog)
-----------------------------------------------------------------------------*/

//-----------------------------------------------------------------------------
// インクルード
//-----------------------------------------------------------------------------
#include "stdafx.h"
#include "Shitarabian.h"
#include "BlankDlg.h"
#include "GeneralSetting.h"

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


/*-----------------------------------------------------------------------------
[名称]	コントロールID情報
[用途]	空白文字情報の表示に使用するコントロールID定義。
[備考]	なし
-----------------------------------------------------------------------------*/
typedef struct{
	int		ibEnable;		// 有効チェック [リソースID] (-)
	int		istrChar;		// 文字列エディット [リソースID] (-)
	int		ibContinuas;	// 連続有効チェック [リソースID] (-)
	int		ibHead;			// 先頭有効チェック [リソースID] (-)
	int		inCount;		// 出現回数エディット [リソースID] (-)
} TBlankItem;

//-----------------------------------------------------------------------------
// ファイル内変数
//-----------------------------------------------------------------------------
BOOL	blank_bVisibleControl = FALSE;		// 再描画中フラグ [-] (TRUE:再描画中、FALSE:描画中でない)

TBlankItem	aBlankItem[]=					// 空白文字情報の表示に使用するコントロールID定義 [-] (-)
{
	{ IDC_BLANK_ENABLE0, IDC_BLANK_STR0, IDC_BLANK_CONTINUAS0, IDC_BLANK_HEAD0, IDC_BLANK_COUNT0 },
	{ IDC_BLANK_ENABLE1, IDC_BLANK_STR1, IDC_BLANK_CONTINUAS1, IDC_BLANK_HEAD1, IDC_BLANK_COUNT1 },
	{ IDC_BLANK_ENABLE2, IDC_BLANK_STR2, IDC_BLANK_CONTINUAS2, IDC_BLANK_HEAD2, IDC_BLANK_COUNT2 },
	{ IDC_BLANK_ENABLE3, IDC_BLANK_STR3, IDC_BLANK_CONTINUAS3, IDC_BLANK_HEAD3, IDC_BLANK_COUNT3 },
	{ IDC_BLANK_ENABLE4, IDC_BLANK_STR4, IDC_BLANK_CONTINUAS4, IDC_BLANK_HEAD4, IDC_BLANK_COUNT4 },
	{ IDC_BLANK_ENABLE5, IDC_BLANK_STR5, IDC_BLANK_CONTINUAS5, IDC_BLANK_HEAD5, IDC_BLANK_COUNT5 },
	{ IDC_BLANK_ENABLE6, IDC_BLANK_STR6, IDC_BLANK_CONTINUAS6, IDC_BLANK_HEAD6, IDC_BLANK_COUNT6 },
	{ IDC_BLANK_ENABLE7, IDC_BLANK_STR7, IDC_BLANK_CONTINUAS7, IDC_BLANK_HEAD7, IDC_BLANK_COUNT7 },
	{ IDC_BLANK_ENABLE8, IDC_BLANK_STR8, IDC_BLANK_CONTINUAS8, IDC_BLANK_HEAD8, IDC_BLANK_COUNT8 },
	{ IDC_BLANK_ENABLE9, IDC_BLANK_STR9, IDC_BLANK_CONTINUAS9, IDC_BLANK_HEAD9, IDC_BLANK_COUNT9 },
};


/*-----------------------------------------------------------------------------
[名称]	コンストラクタ
[機能]	インスタンスの生成。
[戻値]	なし
[備考]	CDialog::CDialogのヘルプを参照。
-----------------------------------------------------------------------------*/
CBlankDlg::CBlankDlg(CWnd* pParent /*=NULL*/)
	: COwnerTabPage(CBlankDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CBlankDlg)
	//}}AFX_DATA_INIT
}


/*-----------------------------------------------------------------------------
[名称]	DoDataExchange
[機能]	DoDataExchange
[戻値]	なし
[備考]	CDialog::DoDataExchangeのヘルプを参照。
-----------------------------------------------------------------------------*/
void CBlankDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CBlankDlg)
	DDX_Control(pDX, IDC_BLANK_HEAD0, m_btnHead0);
	DDX_Control(pDX, IDC_BLANK_HEAD1, m_btnHead1);
	DDX_Control(pDX, IDC_BLANK_HEAD2, m_btnHead2);
	DDX_Control(pDX, IDC_BLANK_HEAD3, m_btnHead3);
	DDX_Control(pDX, IDC_BLANK_HEAD4, m_btnHead4);
	DDX_Control(pDX, IDC_BLANK_HEAD5, m_btnHead5);
	DDX_Control(pDX, IDC_BLANK_HEAD6, m_btnHead6);
	DDX_Control(pDX, IDC_BLANK_HEAD7, m_btnHead7);
	DDX_Control(pDX, IDC_BLANK_HEAD8, m_btnHead8);
	DDX_Control(pDX, IDC_BLANK_HEAD9, m_btnHead9);
	DDX_Control(pDX, IDC_BLANK_CONTINUAS0, m_btnContinuas0);
	DDX_Control(pDX, IDC_BLANK_CONTINUAS1, m_btnContinuas1);
	DDX_Control(pDX, IDC_BLANK_CONTINUAS2, m_btnContinuas2);
	DDX_Control(pDX, IDC_BLANK_CONTINUAS3, m_btnContinuas3);
	DDX_Control(pDX, IDC_BLANK_CONTINUAS4, m_btnContinuas4);
	DDX_Control(pDX, IDC_BLANK_CONTINUAS5, m_btnContinuas5);
	DDX_Control(pDX, IDC_BLANK_CONTINUAS6, m_btnContinuas6);
	DDX_Control(pDX, IDC_BLANK_CONTINUAS7, m_btnContinuas7);
	DDX_Control(pDX, IDC_BLANK_CONTINUAS8, m_btnContinuas8);
	DDX_Control(pDX, IDC_BLANK_CONTINUAS9, m_btnContinuas9);
	DDX_Control(pDX, IDC_BLANK_ENABLE0, m_btnEnable0);
	DDX_Control(pDX, IDC_BLANK_ENABLE1, m_btnEnable1);
	DDX_Control(pDX, IDC_BLANK_ENABLE2, m_btnEnable2);
	DDX_Control(pDX, IDC_BLANK_ENABLE3, m_btnEnable3);
	DDX_Control(pDX, IDC_BLANK_ENABLE4, m_btnEnable4);
	DDX_Control(pDX, IDC_BLANK_ENABLE5, m_btnEnable5);
	DDX_Control(pDX, IDC_BLANK_ENABLE6, m_btnEnable6);
	DDX_Control(pDX, IDC_BLANK_ENABLE7, m_btnEnable7);
	DDX_Control(pDX, IDC_BLANK_ENABLE8, m_btnEnable8);
	DDX_Control(pDX, IDC_BLANK_ENABLE9, m_btnEnable9);
	DDX_Control(pDX, IDC_BLANK_STR9, m_EmphasisStr9);
	DDX_Control(pDX, IDC_BLANK_STR8, m_EmphasisStr8);
	DDX_Control(pDX, IDC_BLANK_STR7, m_EmphasisStr7);
	DDX_Control(pDX, IDC_BLANK_STR6, m_EmphasisStr6);
	DDX_Control(pDX, IDC_BLANK_STR5, m_EmphasisStr5);
	DDX_Control(pDX, IDC_BLANK_STR4, m_EmphasisStr4);
	DDX_Control(pDX, IDC_BLANK_STR3, m_EmphasisStr3);
	DDX_Control(pDX, IDC_BLANK_STR2, m_EmphasisStr2);
	DDX_Control(pDX, IDC_BLANK_STR1, m_EmphasisStr1);
	DDX_Control(pDX, IDC_BLANK_STR0, m_EmphasisStr0);
	DDX_Control(pDX, IDC_BLANK_SCROLL, m_scroll);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CBlankDlg, CDialog)
	//{{AFX_MSG_MAP(CBlankDlg)
	ON_EN_CHANGE(IDC_BLANK_STR0, OnChangeBlankStr)
	ON_WM_VSCROLL()
	ON_BN_CLICKED(IDC_BLANK_ENABLE0, OnBlankCheck)
	ON_EN_CHANGE(IDC_BLANK_STR1, OnChangeBlankStr)
	ON_EN_CHANGE(IDC_BLANK_STR2, OnChangeBlankStr)
	ON_EN_CHANGE(IDC_BLANK_STR3, OnChangeBlankStr)
	ON_EN_CHANGE(IDC_BLANK_STR4, OnChangeBlankStr)
	ON_EN_CHANGE(IDC_BLANK_STR5, OnChangeBlankStr)
	ON_EN_CHANGE(IDC_BLANK_STR6, OnChangeBlankStr)
	ON_EN_CHANGE(IDC_BLANK_STR7, OnChangeBlankStr)
	ON_EN_CHANGE(IDC_BLANK_STR8, OnChangeBlankStr)
	ON_EN_CHANGE(IDC_BLANK_STR9, OnChangeBlankStr)
	ON_EN_CHANGE(IDC_BLANK_COUNT0, OnChangeBlankStr)
	ON_EN_CHANGE(IDC_BLANK_COUNT1, OnChangeBlankStr)
	ON_EN_CHANGE(IDC_BLANK_COUNT2, OnChangeBlankStr)
	ON_EN_CHANGE(IDC_BLANK_COUNT3, OnChangeBlankStr)
	ON_EN_CHANGE(IDC_BLANK_COUNT4, OnChangeBlankStr)
	ON_EN_CHANGE(IDC_BLANK_COUNT5, OnChangeBlankStr)
	ON_EN_CHANGE(IDC_BLANK_COUNT6, OnChangeBlankStr)
	ON_EN_CHANGE(IDC_BLANK_COUNT7, OnChangeBlankStr)
	ON_EN_CHANGE(IDC_BLANK_COUNT8, OnChangeBlankStr)
	ON_EN_CHANGE(IDC_BLANK_COUNT9, OnChangeBlankStr)
	ON_BN_CLICKED(IDC_BLANK_ENABLE1, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_ENABLE2, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_ENABLE3, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_ENABLE4, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_ENABLE5, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_ENABLE6, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_ENABLE7, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_ENABLE8, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_ENABLE9, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_CONTINUAS0, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_CONTINUAS1, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_CONTINUAS2, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_CONTINUAS3, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_CONTINUAS4, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_CONTINUAS5, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_CONTINUAS6, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_CONTINUAS7, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_CONTINUAS8, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_CONTINUAS9, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_HEAD0, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_HEAD1, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_HEAD2, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_HEAD3, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_HEAD4, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_HEAD5, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_HEAD6, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_HEAD7, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_HEAD8, OnBlankCheck)
	ON_BN_CLICKED(IDC_BLANK_HEAD9, OnBlankCheck)
	ON_WM_DRAWITEM()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/*-----------------------------------------------------------------------------
[名称]	OnInitDialog
[機能]	OnInitDialog
[戻値]	なし
[備考]	CDialog::OnInitDialog のヘルプを参照。
-----------------------------------------------------------------------------*/
BOOL CBlankDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();

	// データソースの設定
	CWhitespaceDefine*	pDefine = CGeneralSetting::GetInstance()->GetWhitespace();
	m_aBlankz.Copy( *pDefine->GetCharz() );
	m_aBlankz.SetSize( m_aBlankz.GetSize() +1 );
	VisibleControl();

	return TRUE;  // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります
	              // 例外: OCX プロパティ ページの戻り値は FALSE となります
}

/*-----------------------------------------------------------------------------
[名称]	決定処理
[機能]	入力された内容を確定する。
[戻値]	なし
[備考]	文字列が空白の要素は削除する。
-----------------------------------------------------------------------------*/
void CBlankDlg::Confirm() 
{
	// 空白要素の削除
	int		idxItem;
	for ( idxItem = m_aBlankz.GetSize()-1 ; idxItem>=0 ; idxItem-- )
	{
		if( m_aBlankz[idxItem].strChar.IsEmpty() )
		{
			m_aBlankz.RemoveAt( idxItem, 1 );
		}
	}
	// Generalに反映
	CWhitespaceDefine*	pDefine = CGeneralSetting::GetInstance()->GetWhitespace();
	pDefine->GetCharz()->Copy( m_aBlankz );
}

/*-----------------------------------------------------------------------------
[名称]	PreTranslateMessage
[機能]	PreTranslateMessage
[戻値]	CWnd::PreTranslateMessage のヘルプを参照。
[備考]	一部のキー入力でコントロールの移動をする。
-----------------------------------------------------------------------------*/
BOOL CBlankDlg::PreTranslateMessage(MSG* pMsg) 
{
	BOOL	bBreak = FALSE;

	switch( pMsg->message )
	{
	case WM_KEYDOWN:
	// 一部のキー入力でコントロールの移動をする
		switch( pMsg->wParam )
		{
		case VK_TAB:
			if ( ::GetAsyncKeyState( VK_SHIFT ) &0x8000 )
			{
				bBreak = GoPrevControl();
				break;
			}// 下の条件へ
		case VK_RETURN:
		case VK_DOWN:
			bBreak = GoNextControl();
			break;

		case VK_UP:
			bBreak = GoPrevControl();
			break;
		}
		break;

	default:
		break;
	}

	if ( bBreak )
	{
		return( TRUE );
	}
	else
	{
		return COwnerTabPage::PreTranslateMessage(pMsg);
	}
}

/*-----------------------------------------------------------------------------
[名称]	Enable制御
[機能]	コントロールのEnable制御処理。
[戻値]	なし
[備考]	空白文字定義データの表示。
-----------------------------------------------------------------------------*/
void CBlankDlg::VisibleControl()
{
	blank_bVisibleControl = TRUE;

	int		idxControl;
	int		nControl = sizeof(aBlankItem)/sizeof(TBlankItem);

		for ( idxControl=0 ; idxControl < nControl ; idxControl++ )
		{
			// 要素の存在するぶんだけ表示する
			int		idxItem = m_scroll.GetScrollPos() + idxControl;
			if ( idxItem >= m_aBlankz.GetSize() )
			{
				break;
			}
			//有効・無効
			CCheckBox*	pCheck = (CCheckBox*)GetDlgItem( aBlankItem[idxControl].ibEnable );
			if ( pCheck != NULL )
			{
				pCheck->SetCheck( m_aBlankz[idxItem].bEnable ) ;
				pCheck->ShowWindow( SW_SHOW );
				pCheck->EnableWindow( TRUE );
			}
			//文字
			CWnd*	pwndStr = GetDlgItem( aBlankItem[idxControl].istrChar );
			if ( pwndStr != NULL )
			{
				pwndStr->SetWindowText( m_aBlankz[idxItem].strChar );
				pwndStr->ShowWindow( SW_SHOW );
				pwndStr->EnableWindow( TRUE );
			}
			//連続許可
			pCheck = (CCheckBox*)GetDlgItem( aBlankItem[idxControl].ibContinuas );
			if ( pCheck != NULL )
			{
				pCheck->SetCheck( m_aBlankz[idxItem].bCanContinuation ) ;
				pCheck->ShowWindow( SW_SHOW );
				pCheck->EnableWindow( TRUE );
			}
			//行頭許可
			pCheck = (CCheckBox*)GetDlgItem( aBlankItem[idxControl].ibHead );
			if ( pCheck != NULL )
			{
				pCheck->SetCheck( m_aBlankz[idxItem].bCanHead ) ;
				pCheck->ShowWindow( SW_SHOW );
				pCheck->EnableWindow( TRUE );
			}
			//個数上限
			pwndStr = GetDlgItem( aBlankItem[idxControl].inCount );
			if ( pwndStr != NULL )
			{
				CString		strCount;
				strCount.Format("%d", m_aBlankz[idxItem].nCount );
				pwndStr->SetWindowText( strCount );
				pwndStr->ShowWindow( SW_SHOW );
				pwndStr->EnableWindow( TRUE );
			}
		}

		for ( ; idxControl < nControl ; idxControl++ )
		{
			// 要素の存在しない行は非表示にする
			CWnd*	pwndStr = GetDlgItem( aBlankItem[idxControl].istrChar );
			if ( pwndStr != NULL )
			{
				{
					pwndStr->ShowWindow( SW_HIDE );
					pwndStr->EnableWindow( SW_HIDE );
				}
				pwndStr = GetDlgItem( aBlankItem[idxControl].inCount );
				{
					pwndStr->ShowWindow( SW_HIDE );
					pwndStr->EnableWindow( SW_HIDE );
				}
				CCheckBox*	pCheck = (CCheckBox*)GetDlgItem( aBlankItem[idxControl].ibEnable );
				{
					pCheck->ShowWindow( SW_HIDE );
					pCheck->EnableWindow( SW_HIDE );
				}
				pCheck = (CCheckBox*)GetDlgItem( aBlankItem[idxControl].ibContinuas );
				{
					pCheck->ShowWindow( SW_HIDE );
					pCheck->EnableWindow( SW_HIDE );
				}
				pCheck = (CCheckBox*)GetDlgItem( aBlankItem[idxControl].ibHead );
				{
					pCheck->ShowWindow( SW_HIDE );
					pCheck->EnableWindow( SW_HIDE );
				}
			}
		}

	// スクロールバー制御
	m_scroll.SetScrollRange( 0, m_aBlankz.GetSize()-1 );

	UpdateData( FALSE );
	blank_bVisibleControl = FALSE;
}

/*-----------------------------------------------------------------------------
[名称]	Checkボックス押下ハンドラ
[機能]	データの取り込み処理。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CBlankDlg::OnBlankCheck()
{
	if ( blank_bVisibleControl )
	{
		// 再描画機能によって更新された場合は処理しない
		return;
	}
	// データをアップデートする
	{
		// 編集されたテキストを得る
		CWnd*		pwndCurrent = GetFocus();
		// 編集中の要素番号を得る
		int		idxControl;
		{
			// コントロールの番号を得る
			int		nControl = sizeof(aBlankItem)/sizeof(TBlankItem);
			for ( idxControl=0 ; idxControl < nControl ; idxControl++ )
			{
				if ( pwndCurrent == GetDlgItem( aBlankItem[idxControl].ibEnable ) )
				{
					break;
				}
				if ( pwndCurrent == GetDlgItem( aBlankItem[idxControl].ibContinuas ) )
				{
					break;
				}
				if ( pwndCurrent == GetDlgItem( aBlankItem[idxControl].ibHead ) )
				{
					break;
				}
			}
		}
		// 要素のアップデートをする
		{
			int			idxBlank = m_scroll.GetScrollPos () + idxControl;
			CCheckBox*	pCheck = (CCheckBox*)GetDlgItem( aBlankItem[idxControl].ibEnable );
			m_aBlankz[idxBlank].bEnable = pCheck->GetCheck();
			pCheck = (CCheckBox*)GetDlgItem( aBlankItem[idxControl].ibContinuas );
			m_aBlankz[idxBlank].bCanContinuation = pCheck->GetCheck();
			pCheck = (CCheckBox*)GetDlgItem( aBlankItem[idxControl].ibHead );
			m_aBlankz[idxBlank].bCanHead = pCheck->GetCheck();
		}
	}
	VisibleControl();
}

/*-----------------------------------------------------------------------------
[名称]	文字列変更ハンドラ
[機能]	データの取り込み処理。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CBlankDlg::OnChangeBlankStr() 
{
	if ( blank_bVisibleControl )
	{
		// 再描画機能によって更新された場合は処理しない
		return;
	}
	// データをアップデートする
	CWnd*		pwndCurrent = GetFocus();
	int			iStartSel;
	int			iEndSel;
	((CEdit*)pwndCurrent)->GetSel(
		iStartSel,
		iEndSel
	);
	{
		// 編集されたテキストを得る
		CString		strEditString;
		pwndCurrent->GetWindowText( strEditString );

		// 編集中の要素番号を得る
		int		idxBlank;
		int		idxControl;
		BOOL	bstr = TRUE;
		{
			// コントロールの番号を得る
			int		nControl = sizeof(aBlankItem)/sizeof(TBlankItem);
			for ( idxControl=0 ; idxControl < nControl ; idxControl++ )
			{
				if ( pwndCurrent == GetDlgItem( aBlankItem[idxControl].istrChar ) )
				{
					break;
				}
				if ( pwndCurrent == GetDlgItem( aBlankItem[idxControl].inCount ) )
				{
					bstr = FALSE;
					break;
				}
			}
			if ( idxControl == nControl )
			{
				// 該当コントロールなし
				return;
			}
			idxBlank = m_scroll.GetScrollPos () + idxControl;
		}
		// 要素のアップデートをする
		if ( idxBlank < m_aBlankz.GetSize() )
		{
			if ( bstr )
			{
				m_aBlankz[idxBlank].strChar = strEditString;
			}
			else
			{
				m_aBlankz[idxBlank].nCount = abs( atol( strEditString ) );
			}
		}
	}
	// 最下段の要素が空で無い場合は空要素を追加する
	{
		int		idxLast = m_aBlankz.GetSize() -1;
		if ( idxLast >= 0 )
		{
			if ( m_aBlankz[idxLast].strChar.IsEmpty() )
			{
				return;
			}
		}
		m_aBlankz.SetSize( m_aBlankz.GetSize() +1 );
	}
	VisibleControl();
	((CEdit*)pwndCurrent)->SetSel(
		iStartSel,
		iEndSel
	);
}

/*-----------------------------------------------------------------------------
[名称]	コントロール間移動
[機能]	次のコントロールへフォーカスを移す。
[戻値]	BOOL	処理結果 [-] (TRUE:成功、FALSE:失敗)
[備考]	なし
-----------------------------------------------------------------------------*/
BOOL CBlankDlg::GoNextControl()
{
	CWnd*	pwndCurrent = GetFocus();
	CWnd*	pwndNext = GetNextDlgTabItem( pwndCurrent );
	if (pwndNext != NULL )
	{
		pwndNext->SetFocus();
	}
	return( TRUE );
/*
	// 編集中の要素番号を得る
	int	idxControl;
	int	iCtlNo = 1;
	{
		// フォーカスのあるコントロールの番号を得る
		CWnd*	pwndCurrent = GetFocus();
		int		nControl = sizeof(aBlankItem)/sizeof(TBlankItem);
		for ( idxControl=0 ; idxControl < nControl ; idxControl++ )
		{
			if ( pwndCurrent == GetDlgItem( aBlankItem[idxControl].ibEnable ) )
			{	//決め打ち？！
				iCtlNo = 1;break;
			}
			if ( pwndCurrent == GetDlgItem( aBlankItem[idxControl].istrChar ) )
			{
				iCtlNo = 2;break;
			}
			if ( pwndCurrent == GetDlgItem( aBlankItem[idxControl].ibContinuas ) )
			{
				iCtlNo = 3;break;
			}
			if ( pwndCurrent == GetDlgItem( aBlankItem[idxControl].ibHead ) )
			{
				iCtlNo = 4;break;
			}
			if ( pwndCurrent == GetDlgItem( aBlankItem[idxControl].inCount ) )
			{
				iCtlNo = 5;break;
			}
		}
		// 以外での入力。無視。
		if ( idxControl == nControl )
		{
			return( FALSE );
		}
		// 最下段からの移動。スクロールの可能性あり
		if ( idxControl == nControl-1 && iCtlNo == 5 )
		{
			// 該当コントロールなし
			// もしさらに要素があるならばスクロールさせる
			int		idxBlank = m_scroll.GetScrollPos() + nControl;
			if ( idxBlank < m_aBlankz.GetSize() )
			{
				PostMessage ( WM_VSCROLL , SB_LINEDOWN );
				GetDlgItem( aBlankItem[idxControl].ibEnable )->SetFocus();
				return( TRUE );
			}
			else
			{
				return( TRUE );
			}
		}
		// 通常の移動。次の要素にフォーカスを当てる
		{
			CWnd*	pwnd;
			switch ( iCtlNo )
			{
			case 1:pwnd = GetDlgItem( aBlankItem[idxControl].istrChar );break;
			case 2:pwnd = GetDlgItem( aBlankItem[idxControl].ibContinuas );break;
			case 3:pwnd = GetDlgItem( aBlankItem[idxControl].ibHead );break;
			case 4:pwnd = GetDlgItem( aBlankItem[idxControl].inCount );break;
			case 5:pwnd = GetDlgItem( aBlankItem[idxControl +1 ].ibEnable );break;
			default:
				ASSERT( FALSE );
				pwnd = NULL;
				break;
			}
			if ( pwnd != NULL )
			{
				if ( pwnd->IsWindowVisible() )
				{
					pwnd->SetFocus();
				}
			}
		}
		return( TRUE );
	}
*/
}

/*-----------------------------------------------------------------------------
[名称]	コントロール間移動
[機能]	前のコントロールへフォーカスを移す。
[戻値]	BOOL	処理結果 [-] (TRUE:成功、FALSE:失敗)
[備考]	なし
-----------------------------------------------------------------------------*/
BOOL CBlankDlg::GoPrevControl()
{
	CWnd*	pwndCurrent = GetFocus();
	CWnd*	pwndNext = GetNextDlgTabItem( pwndCurrent, TRUE );
	if (pwndNext != NULL )
	{
		pwndNext->SetFocus();
	}
	return( TRUE );
/*
	// 編集中の要素番号を得る
	int	idxControl;
	int	iCtlNo = 1;
	{
		// フォーカスのあるコントロールの番号を得る
		CWnd*		pwndCurrent = GetFocus();
		// コントロールの番号を得る
		int		nControl = sizeof(aBlankItem)/sizeof(TBlankItem);
		for ( idxControl= 0 ; idxControl < nControl ; idxControl++ )
		{
			if ( pwndCurrent == GetDlgItem( aBlankItem[idxControl].ibEnable ) )
			{	//決め打ち？！
				iCtlNo = 1;break;
			}
			if ( pwndCurrent == GetDlgItem( aBlankItem[idxControl].istrChar ) )
			{
				iCtlNo = 2;break;
			}
			if ( pwndCurrent == GetDlgItem( aBlankItem[idxControl].ibContinuas ) )
			{
				iCtlNo = 3;break;
			}
			if ( pwndCurrent == GetDlgItem( aBlankItem[idxControl].ibHead ) )
			{
				iCtlNo = 4;break;
			}
			if ( pwndCurrent == GetDlgItem( aBlankItem[idxControl].inCount ) )
			{
				iCtlNo = 5;break;
			}
		}
		// 以外での入力。無視。
		if ( idxControl == nControl )
		{
			return( FALSE );
		}
		// 最上段からの移動。スクロールの可能性あり
		if ( idxControl == 0 && iCtlNo == 1 )
		{
			// 該当コントロールなし
			// もしさらに要素があるならばスクロールさせる
			int	idxBlank = m_scroll.GetScrollPos();
			if ( idxBlank > 0 )
			{
				PostMessage ( WM_VSCROLL , SB_LINEUP );
				GetDlgItem( aBlankItem[ 0 ].inCount )->SetFocus();
				return( TRUE );
			}
			return( FALSE );
		}
		// 前の要素にフォーカスを当てる
		{
			CWnd*	pwnd;
			switch ( iCtlNo )
			{
			case 1:pwnd = GetDlgItem( aBlankItem[idxControl -1 ].inCount );break;
			case 2:pwnd = GetDlgItem( aBlankItem[idxControl].ibEnable );break;
			case 3:pwnd = GetDlgItem( aBlankItem[idxControl].istrChar );break;
			case 4:pwnd = GetDlgItem( aBlankItem[idxControl].ibContinuas );break;
			case 5:pwnd = GetDlgItem( aBlankItem[idxControl].ibHead );break;
			default:
				ASSERT( FALSE );
				pwnd = NULL;
				break;
			}
			if ( pwnd != NULL )
			{
				pwnd->SetFocus();
			}
		}
		return( TRUE );
	}
*/
}


/*-----------------------------------------------------------------------------
[名称]	スクロールバーハンドラ
[機能]	CWnd::OnVScroll()　のヘルプを参照。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CBlankDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{

	int		iPos = m_scroll.GetScrollPos();
	switch ( nSBCode )
	{
	case	SB_LINEUP:			iPos -= 1;	break;
	case 	SB_LINEDOWN:		iPos += 1;	break;
	case 	SB_THUMBPOSITION:	iPos = nPos;break;
	case 	SB_THUMBTRACK:		iPos = nPos;break;
	case 	SB_PAGEUP:			iPos -= 10;	break;
	case 	SB_PAGEDOWN:		iPos += 10;	break;
	case 	SB_BOTTOM:			iPos = m_scroll.GetScrollLimit();break;
	}
	m_scroll.SetScrollPos( iPos );

	// 再描画
	VisibleControl();

	CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}

void CBlankDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
// ▼ (ワーニング回避) BGN 2003.12.29 (moralog) warning C4100
	// warning C4100 回避
	nIDCtl;
// ▲ (ワーニング回避) END

	CCheckBox*	pButton = (CCheckBox*)(CWnd::FromHandle( lpDrawItemStruct->hwndItem ));

	pButton->Draw();
	
//	CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
