H8,SH,マイコン,ぼやき川柳,ダウンロード

ツールバーはWindowの上方、メニューバーの下に位置するボタン群である。メニューバーでよく使う操作をボタンで分かりやすく表し、PCプログラムの顔である。それだけにアイコンのデザインはユーザの印象に大きな影響を与える。MSDNに詳しく書いてあるらしいが、ポチにはMSDNは呪文としか思えず、チンプンカンプンである(機械翻訳のせいか、元々の英文の特徴か、絵・図・サンプルが少ない。リンクを辿ると、ループするとか)。そのため例によって、邪道なので賢明な諸氏は他のサイトを参考にした方が良い

    ・VMPlayer
    ・Windows 8 Release Preview Build 8400
    ・MS VS2010 評価版
    ・VS2010のウィザードでSDIプロジェクトを作成し、デフォルトのツールバーある状態

無料版でまとめた環境・・・

アイコン


アイコンで検索すると様々なアイコンが出てくる。ただ、主要用途はWebページ用が多い。ツールバーのアイコンはツールバーエディタで16×16、16色で作るのが常道みたい。でもどうみても物足りない!?
下記に分かりやすいサイトを見つけたので、参考にさせていただいた。ポチはSDIベースのPJで活用したが、そのまま流用することが出来た。

ダイアログにビットマップ付きボタンを実装する(24bitカラー編)

最初の課題はフリーでカッコイイ、アイコンを探すことである。往々にして英語サイトだったりする


通常bitmap(SetImageList)



非活性化bitmap(SetDisabledImageList)




ここでアイコンは拡張子icoではなく普通のbmp(bitmap)で作る
老眼なので24×24のアイコンにした。アイコンとアイコンの間7pixels以上開ける必要がある(Assertionエラーになる)。24 pixelsのアイコンの場合、もっと開けた方がバランスが良いと思う
 

void CToolBar::SetSizes(SIZE sizeButton, SIZE sizeImage)
// button must be big enough to hold image
//   + 7 pixels on x
//   + 6 pixels on y
ASSERT(sizeButton.cx >= sizeImage.cx + 7);
ASSERT(sizeButton.cy >= sizeImage.cy + 6);
 
 
理由はよく分からないがbitmap右にはアイコン数個分の余白を開けておかないと、右端のアイコンが欠けてしまう

CMainFrame.cpp


 

ボタンとアクションの括り付け


さて、いよいよ怪しいお呪い!
ツールバーエディタで適当にボタンを作る。(ボタンの左からの順番は実際に使うボタンと合わせる)ただ、ボタンの絵は適当で構わない。
ボタンを追加するとツールバーエディタが適当な番号を割り当てる。「ID_BUTTON32812」みたいな適当な名前が付く。
(追加の仕方は右端の空白ボタンに「鉛筆ツール」で何か書けば、さらに右側に空白のボタンが追加される)



このIDをメニューバーで同じ処理を行うIDに置き換えれば、ボタンが表示される。IDに対応する処理が定義されていない場合は、ボタンは表示されない。余談だけどボタンだけでしか起動できない操作は作らない方が良いと思う。世の中にはマウスを嫌い、キーボードだけで処理したい人たちが居る

ツールバーエディタが適当に割り当てたIDはResouce.hで定義されるので、削除しておいた方がよい

上のbitmapをアイコンに直接コピペ出来れば素直なのだけど、デフォフトの16×16Pixels 4bitカラーの変更の仕方が分からなかった・・・

  
  
  

表示サンプル




  

  
  

バルーン ツールチップ ScreenTip


正式には何と言うのでしょうか?
本来のやり方とは違うと思いますが、ketsuatsu.rcのSTRINGTABLEでボタンIDの¥nの後ろの文字が表示されるみたいです
標準ボタンで表示されるバルーンの文字列をVS上で検索してみたら、ここに有りました



ツールバー ボタン 非活性化


「Visual C++プログラミングのメモ」には

(6)
 各ボタンの有効・無効(グレー化)を制御するには、以下の通り。フラグのデフォルトはTRUE(有効)。
(4bitビットマップの場合と同じ)
CToolBarCtrl& toolBarCtrl = m_wndToolBar.GetToolBarCtrl();
toolBarCtrl.EnableButton(ボタンのID, フラグ);

と、あるのですがSDIでは上手く行きませんでした。同じ悩みはみなさん持っているようです

http://rarara.cafe.coocan.jp/cgi-bin/lng/vc/vclng....

現象まで見事に一致しているので笑っちゃいます。回答にあるようにUPDATE_COMMAND_UIハンドラを追加しました



白抜きは非活性状態を示しています(選択中は二重選択不可→非活性)






ハンドラの追加は手動でも出来ると思いますが、GUIで追加する場合、
「クラスビュー」でCMainFrameを選択、右クリックで
「ClassWizard」起動しオブジェクトIDで該当する(ハンドラを追加する)ボタンのIDを選択
「メッセージ」でUPDATE_COMMAND_UIを選択、右側の「ハンドラの追加」ボタンを押す、お酢..。


UIハンドラ
UIハンドラの考え方は理解苦しみます。質問者のやり方がやっぱ自然ですよね・・・。


ラジオボタン化

 
PLAY、PAUSEのボタンは排反でトグルスイッチの様に交互にON/OFFを切り替えたいです
 
m_wndToolBar.SetButtonStyle(13, TBBS_CHECKGROUP|TBBS_CHECKBOX);
m_wndToolBar.SetButtonStyle(14, TBBS_CHECKGROUP|TBBS_CHECKBOX);
 
msdnによればボタンのスタイルの説明は下記のように・・
TBBS_CHECKGROUPでグループの開始を指定。じゃ終了はどうすんの!?
ボタンのスタイル。次のボタン スタイルがサポートされています。
 TBBS_BUTTON 標準のプッシュ ボタン (既定)。
 TBBS_SEPARATOR 区切り記号。
 TBBS_CHECKBOX 自動チェック ボックス ボタン。
 TBBS_GROUP ボタン グループの開始をマークします。
 TBBS_CHECKGROUP チェック ボックス ボタンのグループの開始をマークします。
 TBBS_DROPDOWN ドロップダウン リスト ボタンを作成します。
 TBBS_AUTOSIZE イメージのサイズではなくボタンのテキストに基づいて、ボタンの幅を計算します。
 TBBS_NOPREFIX ボタンのテキストに、ボタンに関連付けられているアクセラレータ プリフィクスを含めません。


処理を再掲
  
  
  

14


  
  
  
  

   
  






 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
  
  
  
  
    
    
    
    
    
    
    
    
    
   
    
    
   
   
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

管理人/副管理人のみ編集できます