// 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); } /////////////////////////////////////////////////////////////////////////////