// bbutton.cpp : bitmap button test
//
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.

#include "stdafx.h"
#include "ctrltest.h"

/////////////////////////////////////////////////////////////////////////////
// BitmapButton Test dialog #1

// In this example we pass the bitmap resource names to LoadBitmaps
//  OnInitDialog is used to Subclass the buttons so the dialog
//  controls get attached to the MFC WndProc for C++ message map dispatch.

class CBMTest1Dlg : public CDialog
{
protected:
	CBitmapButton button1, button2;
public:
	//{{AFX_DATA(CBMTest1Dlg)
		enum { IDD = IDM_TEST_BITMAP_BUTTON1 };
	//}}AFX_DATA
	CBMTest1Dlg();

	BOOL OnInitDialog();
	//{{AFX_MSG(CBMTest1Dlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

BEGIN_MESSAGE_MAP(CBMTest1Dlg, CDialog)
	//{{AFX_MSG_MAP(CBMTest1Dlg)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


CBMTest1Dlg::CBMTest1Dlg()
	: CDialog(CBMTest1Dlg::IDD)
{
	// NOTE: The obsolete MFC V1 CBitmapButton constructor with 3 arguments is
	//  replaced by a call to LoadBitmaps.
	if (!button1.LoadBitmaps(_T("Image1Up"), _T("Image1Down"), _T("Image1Focus")) ||
		!button2.LoadBitmaps(_T("Image2Up"), _T("Image2Down"), _T("Image2Focus")))
	{
		TRACE0("Failed to load bitmaps for buttons\n");
		AfxThrowResourceException();
	}
}

BOOL CBMTest1Dlg::OnInitDialog()
{
	// each dialog control has special bitmaps
	VERIFY(button1.SubclassDlgItem(IDOK, this));
	button1.SizeToContent();
	VERIFY(button2.SubclassDlgItem(IDCANCEL, this));
	button2.SizeToContent();

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// BitmapButton Test dialog #2

// In this example we use the CBitmapButton AutoLoad member function.
//  Autoload uses the text/title of the button as the base resource name.
//  For this trivial example the buttons are called "OK" and "CANCEL",
//  which use the bitmaps "OKU", "OKD", "OKF", "CANCELU", "CANCELD"
//  and "CANCELF" respectively for the up, down and focused images.

#define ID_BUTTON_MIN       IDOK
#define N_BUTTONS   (IDCANCEL - ID_BUTTON_MIN + 1)

class CBMTest2Dlg : public CDialog
{
protected:
	// array of buttons constructed with no attached bitmap images
	CBitmapButton buttons[N_BUTTONS];
public:
	//{{AFX_DATA(CBMTest2Dlg)
		enum { IDD = IDM_TEST_BITMAP_BUTTON2 };
	//}}AFX_DATA
	CBMTest2Dlg()
		: CDialog(CBMTest2Dlg::IDD)
		{ }

	BOOL OnInitDialog();
	//{{AFX_MSG(CBMTest2Dlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

BEGIN_MESSAGE_MAP(CBMTest2Dlg, CDialog)
	//{{AFX_MSG_MAP(CBMTest2Dlg)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


BOOL CBMTest2Dlg::OnInitDialog()
{
	// load bitmaps for all the bitmap buttons (does SubclassButton as well)
	for (int i = 0; i < N_BUTTONS; i++)
		VERIFY(buttons[i].AutoLoad(ID_BUTTON_MIN + i, this));
	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// BitmapButton Test dialog #3

// This is an extension of test dialog 2 using AutoLoad using the disabled
//   state with the "X" suffix.
// Here we use bitmap buttons to select a number between 1 and 10.
// The "PREV" and "NEXT" buttons change the number.  These buttons are
//  disabled when the number hits the limits.

class CBMTest3Dlg : public CDialog
{
protected:
	// construct
	CBitmapButton okButton;
	CBitmapButton prevButton;
	CBitmapButton nextButton;

public:
	int m_nNumber;
	//{{AFX_DATA(CBMTest3Dlg)
		enum { IDD = IDM_TEST_BITMAP_BUTTON3 };
	//}}AFX_DATA

	CBMTest3Dlg()
		: CDialog(CBMTest3Dlg::IDD)
		{ }

	BOOL OnInitDialog();
	void Update();

	//{{AFX_MSG(CBMTest3Dlg)
	afx_msg void OnNextNumber();
	afx_msg void OnPrevNumber();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

BOOL CBMTest3Dlg::OnInitDialog()
{
	// load bitmaps for all the bitmap buttons (does SubclassButton as well)
	VERIFY(okButton.AutoLoad(IDOK, this));
	VERIFY(prevButton.AutoLoad(ID_PREV, this));
	VERIFY(nextButton.AutoLoad(ID_NEXT, this));
	Update();
	return TRUE;
}

BEGIN_MESSAGE_MAP(CBMTest3Dlg, CDialog)
	//{{AFX_MSG_MAP(CBMTest3Dlg)
	ON_COMMAND(ID_PREV, OnPrevNumber)
	ON_COMMAND(ID_NEXT, OnNextNumber)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CBMTest3Dlg::OnPrevNumber()
{
	m_nNumber--;
	Update();
}

void CBMTest3Dlg::OnNextNumber()
{
	m_nNumber++;
	Update();
}

void CBMTest3Dlg::Update()
{
	SetDlgItemInt(IDC_NUMBEROUT, m_nNumber);
	prevButton.EnableWindow(m_nNumber > 1);
	nextButton.EnableWindow(m_nNumber < 10);
	// move focus to active button
	if (!prevButton.IsWindowEnabled())
		nextButton.SetFocus();
	else if (!nextButton.IsWindowEnabled())
		prevButton.SetFocus();
}

/////////////////////////////////////////////////////////////////////////////
// Test driver routines

void CTestWindow::OnTestBitmapButton1()
{
	CBMTest1Dlg dlg;
	dlg.DoModal();
}

void CTestWindow::OnTestBitmapButton2()
{
	CBMTest2Dlg dlg;
	dlg.DoModal();
}

void CTestWindow::OnTestBitmapButton3()
{
	CBMTest3Dlg dlg;
	dlg.m_nNumber = 5;
	dlg.DoModal();

	CString strYouChose;
	strYouChose.LoadString(IDS_YOU_CHOSE);
	CString strMsg;
	strMsg.Format(strYouChose, dlg.m_nNumber);
	AfxMessageBox(strMsg);
}

/////////////////////////////////////////////////////////////////////////////