星期三, 八月 30, 2006

ビットマップボタン

WTLでは標準コントロールやコモンコントロールの他に、独自のコントロール用クラスを用意しています。

 ビットマップボタンは、ビットマップ画像からボタンの外観を作成できるボタンコントロールです。 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()によって設定します。

没有评论: