2006-02-10

プルダウン付きのツールバー  [by miyachi]

え~先日から書いているWin32でのツールバーシリーズ(笑) 今日のお題はIEやFireFoxなんかでも使われているツールバーにプルダウンのリストなんかのボタン以外のパーツを置く方法。

MFCのツールバークラス CToolBarCtrl で標準で設定できるのは、ボタン(TBSTYLE_BUTTON)とチェックボタン(TBSTYLE_CHECK)とセパレータ(TBSTYLE_SEP)の3種類のみ。ではどうするかと言えばセパレータを1つ指定して横幅を変更してその上にプルダウン等のパーツ(例:CComboBox)を乗っけてしまう事で実現する。

この方法で問題は無いのだが、ベースになるのがセパレータなのでプルダウンの高さがツールバーより小さい場合は余計な縦棒が背景に表示されてしまう。これを防ぐ方法を検索したが見つからないので力技でツールバーとプルダウンの間に空のテキストウィンドウ(CStatic)を置く事でクリアした。
 CToolBarCtrl m_TBar;
 (ツールバーの初期化は省略/セパレータをcmdidで生成しておく)
 // セパレータの幅を変更する
 CRect rect;
 const int nComboWidth = 110; // コンボボックスの幅
 TBBUTTONINFO tbbi;
 ZeroMemory( &tbbi, sizeof(tbbi) );
 tbbi.dwMask = TBIF_SIZE;
 tbbi.cbSize = sizeof(tbbi);
 tbbi.cx = nComboWidth + 4;
 m_TBar.SetButtonInfo( cmdid, &tbbi ); // cmdidはindexとは違う
 // 縦棒を塗りつぶす為のテキスト領域
 CStatic m_Base;
 m_TBar.GetItemRect( index, &rect ); // ここはindex(何番目)で指定
 m_Base.Create( "", WS_VISIBLE , rect, &m_TBar, 0 );
 // コンボボックスの生成
 CComboBox m_Combo;
 rect.top += 4; // 適当に上からの位置を指定
 rect.left += 2; // 開始位置もずらす
 m_Combo.Create(
  CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | WS_VISIBLE | WS_TABSTOP,
  rect, &m_TBar, 1 );
 // 必要ならこの後でフォントやリスト文字列をセットする
以上参考になれば幸いです :-)

さて先日「1ギガiPod nanoが登場―shuffleは値下げ」のアナウンスが。512MBのshuffleなら7900円か…う~むジム用に買ってしまいそうな値段になったぞ… CDを2~3枚を買うと思えば買えなくも無い(^^;;

2006-02-10 12:52:04 - miyachi - [プログラミング] -

コメント一覧

コメント無し

コメントを書く

このアイテムは閲覧専用です。コメントの投稿、投票はできません。