私はユーザーが何かを選択できるようなボタンが欲しかった。
もちろんオーナードローのドロップダウンボックスを用いることも出来る。この方法の問題は、ドロップダウンがつぶれたとき、最後に選ばれたアイテムが表示されるということだ。
こういうわけで自分で解決することにした。
オプションとして、コントロールは Interface technologies, Inc のフリーライブラリ "ITCLib"を使うことが出来る。これは良いライブラリなので、MFCデベロッパは見てみると良い。本当に時間を節約してくれるだろう。
ITCLib はボタン上に小さな矢印を描画することだけに用いられ、コントロールに統合された一部ではない。そういうわけで ITCLib については最初、プリプロセッサーの文により無効にしている。だからサンプルはライブラリ無しでコンパイルできる。
ITCLib を有効にするには:
矢印などを描くのに自分のボタンクラスを使いたいのなら、CButton やITCImageButton などのかわりに自分のクラスからCChoiceWindowBtn を継承できる。
コントロールを使うには、プロジェクトを作り、下記のファイルを追加してほしい。
ChoiceWindow.h
ChoiceWindow.cpp
ChoiceWindowBtn.h
ChoiceWindowBtn.cpp
drop_arrow.bmp (or another bitmap)
ビットマップにリソース名 "DROP_ARROW" を割り当てよ。整数値IDとしてではなく文字列としてである。
次にダイアログにボタンを追加し、WM_INITDIALOG ハンドラからメンバ関数を使う。
ダイアログクラスに CChoiceWindowBtn オブジェクトを追加。ヘッダーをインクルードするのも忘れずに
例:プリプロセッサー定義に注意
// TODO: Add extra initialization here
#ifdef _ITCDLL
m_btnDropDown.SubclassControl(IDC_OPTIONS, this);
m_btnDropDown.AddImage("DROP_ARROW", -1, RGB(255,0,255));
m_btnDropDown.SetImageAlign(DT_RIGHT|DT_VCENTER);
#else
m_btnDropDown.SubclassDlgItem(IDC_OPTIONS, this);
#endif
m_btnDropDown.AddChoice("Name", TRUE);
m_btnDropDown.AddChoice("Address", TRUE);
m_btnDropDown.AddChoice("Notes", FALSE);
m_btnDropDown.AddChoice("Telephone", TRUE);
|
CChoiceWindowButton クラスを通してコントロールはアクセスされる。これは少しのメンバ関数しかない。
CChoiceWindowButton::AddChoice
void AddChoice(LPCTSTR szText, BOOL bChecked=FALSE)
戻り値
なし
パラメータ
szText: 選択用に表示されるテキスト
bChecked: 最初にチェックされているかチェックされていないか
コメント
リストに新しいアイテムを追加します
CChoiceWindowButton::Reset
void Reset()
戻り値
なし
パラメータ
なし
コメント
リストから全てのアイテムを削除
CChoiceWindowButton::GetCheck
BOOL GetCheck(int iItem)
戻り値
BOOL型 - iItem により特定されたアイテムの状態
パラメータ
nItem: アイテムの0で始まるインデックス
コメント
アイテムがチェックされていれば TRUE を返し、そうでなければ FALSE を返す
CChoiceWindowButton::SetCheck
void SetCheck(int iItem, BOOL bCheck=TRUE)
戻り値
void
パラメータ
iItem: アイテムの0で始まるインデックス
bCheck: BOOL値。TRUE ならアイテムはチェックされる。
CChoiceWindowButton::GetItemCount
int GetItemCount()
戻り値
リスト中のアイテムの数
パラメータ
なし
CChoiceWindowButton::GetListCtrl
CListCtrl& GetListCtrl()
戻り値
基礎にあるCListCtrl オブジェクトへの参照
パラメータ
なし
コメント
コントロールに次のようにアクセスできます。
CListCtrl& list = btnChoiceList.GetListCtrl();
CChoiceWindowButton::RemoveAt
void RemoveAt(int iIndex)
戻り値
なし
パラメータ
リストから削除するアイテムのインデックス
CChoiceWindowButton::m_bDisableIfEmpty
BOOL m_bDisableIfEmpty
コメント
BOOL値。リストがアイテムを含んでないのなら、ボタンが無効かどうかを指定する。デフォルトでは TRUE である