ビットマップボタンは、ビットマップ画像からボタンの外観を作成できるボタンコントロールです。 WTLはビットマップボタンを作成するために
CBitmapButton
というクラスを用意しています。 MFCにも同名のクラスがありますが、それとは使用方法が異なります。CBitmapButton
クラスはCButton
クラスから派生しています。以下に示すのは、CBitmapButton
クラスを使用する例です。下の図のような白いボタンを作成します。
// stdafx.h内 #include <atlbase.h> #include <atlapp.h> extern CAppModule _Module; #include <atlwin.h> #include <atlcrack.h> #include <atlmisc.h> #include <atlctrls.h> #include <atlctrlx.h> // CBitmapButtonクラスを使用するため |
// maindlg.h内 class CMainDlg : public CDialogImpl<CMainDlg> { public: enum { IDD = IDD_MAINDLG }; CBitmapButton m_button_bmp; // ビットマップボタン // メッセージマップ BEGIN_MSG_MAP_EX(CMainDlg) MSG_WM_INITDIALOG(OnInitDialog) COMMAND_ID_HANDLER_EX(IDC_BUTTON_BMP, OnButtonBmp) COMMAND_ID_HANDLER_EX(IDOK, OnOK) COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel) END_MSG_MAP() LRESULT OnInitDialog(HWND hWnd, LPARAM lParam){ // スクリーンの中央に配置 CenterWindow(); // 大きいアイコン設定 HICON hIcon = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR, ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON)); SetIcon(hIcon, TRUE); // 小さいアイコン設定 HICON hIconSmall = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON)); SetIcon(hIconSmall, FALSE); // コントロール設定 CImageList il; il.CreateFromImage(IDB_BITMAP_BUTTON, 64, 1, CLR_NONE, IMAGE_BITMAP, LR_CREATEDIBSECTION); m_button_bmp.SubclassWindow(GetDlgItem(IDC_BUTTON_BMP)); m_button_bmp.SetImageList(il); m_button_bmp.SetImages(0, 1, 2, 3); m_button_bmp.SetToolTipText(_T("ビットマップボタン")); m_button_bmp.CenterWindow(); return TRUE; } void OnButtonBmp(UINT uNotifyCode, int nID, HWND hWndCtl){ MessageBox(_T("これはビットマップボタンです。")); } void OnOK(UINT uNotifyCode, int nID, HWND hWndCtl){ EndDialog(nID); } void OnCancel(UINT uNotifyCode, int nID, HWND hWndCtl){ EndDialog(nID); } }; |
// Control.cpp内 #include "stdafx.h" #include "resource.h" #include "maindlg.h" CAppModule _Module; int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR lpCmdLine, int nCmdShow) { HRESULT hRes = ::CoInitialize(NULL); ATLASSERT(SUCCEEDED(hRes)); ::DefWindowProc(NULL, 0, 0, 0L); AtlInitCommonControls(ICC_COOL_CLASSES ICC_WIN95_CLASSES); hRes = _Module.Init(NULL, hInstance); ATLASSERT(SUCCEEDED(hRes)); int nRet = 0; // BLOCK: アプリケーション実行 { CMainDlg dlgMain; nRet = dlgMain.DoModal(); } _Module.Term(); ::CoUninitialize(); return nRet; } |
まず、リソースを作成します。ダイアログにボタンコントロールを配置し、リソースIDを次のように指定します。
コントロール名 | リソースID |
プッシュボタン | IDC_BUTTON_BMP |
また、プロジェクトに次のようなビットマップリソースを
IDB_BITMAP_BUTTON
というIDで追加します。
このビットマップは、ボタンの4つの状態(通常の状態、押された状態、フォーカスが当たっている状態、使用不可の状態)を表す一つの画像です。
次に、stdafx.h内では、
CBitmapButton
クラスを使用するためにatlctrls.hヘッダとatlctrlx.hヘッダをインクルードします。なお、atlctrls.hヘッダを先にインクルードする必要があります。CMainDlg
クラスでは、まず、 CBitmapButton
クラスのインスタンスをメンバ変数として宣言します。これを使うためには、WM_INITDIALOG
メッセージハンドラでサブクラス化する必要があります。次に、
WM_INITDIALOG
メッセージハンドラでは、ビットマップリソース(ID:IDB_BITMAP_BUTTON
)からイメージリストを作成し、それをSetImageList()
によってビットマップボタンに設定します。イメージリストを設定した後は、SetImages()
によってイメージリストのインデックスとボタンの状態を関連付けます。 SetImages()
は、第1引数から順に、通常の状態、押された状態、フォーカスが当たった状態、使用不可の状態のイメージリストのインデックスを受け取ります。さらに、ビットマップボタンには、SetToolTipText()
によってツールチップを設定しています。最後に、リソースIDが
IDC_BUTTON_BMP
のコマンドメッセージハンドラとして、 OnButtonBmp()
を追加します。このハンドラでは単にメッセージボックスを表示しているだけです。このように、MFCのビットマップボタンではボタンの状態別の4つビットマップリソースを用意しなければならないのに対し、 WTLのビットマップボタンはイメージリストからボタンの外観を作成します。
WTLのビットマップボタンは、独自の拡張スタイルを用意しています。
- BMPBTN_HOVER マウスカーソルがビットマップボタンの上を通ると、フォーカスが当たった状態の画像を表示します。
- BMPBTN_AUTO3D_SINGLE 画像の周りに3Dの境界線を描画します。
- BMPBTN_AUTO3D_DOUBLE BMPBTN_AUTO3D_SINGLEよりも少し太い境界線を描画します。
- BMPBTN_AUTOSIZE 画像の大きさに合うようにビットマップボタンのサイズを自動的に変更します。このスタイルはデフォルトで設定されています。
- BMPBTN_SHAREIMAGELISTS ビットマップボタンのオブジェクトが破棄されても、ビットマップボタンに設定されたイメージリストのオブジェクトは破棄しません。
- BMPBTN_AUTOFIRE ビットマップボタンを押し続けると、繰り返し
WM_COMMAND
メッセージを発生させます。
これらの拡張スタイルは、
SetBitmapButtonExtendedStyle()
によって設定します。
没有评论:
发表评论