[Cabi@net:workトップページ]
[プログラミングの断片]
[メニューアイテムに色を付ける]
[デフォルトボタンの枠を描く]
[バックグラウンドでも関数実行]
このようなボタンを使っているアプリケーションに出会ったことはありませんか?
僕はこれは美しくないと感じてしまいます。
で、よりよいのは次のようなものです。
これら2つのボタンの間には、まあほとんど差がありません。 しかしながら、MacOS 8ではきちんと立体化されません。
前者のように描かれるのはプログラマが楕円の高さ/幅として16を使っているためです。
この値(= 16)はボタンの高さが20ピクセルの時のみ有効です。 ResEditの'DITL'エディタはデフォルトで20ピクセルの高さのボタンを作るので、 普通は有効です。 とはいえ、僕は適切な方法で描くことをお薦めします。
ここに枠を描く
サンプルコードを挙げます。
これは最もシンプルなものです。
もしポートがカラーポートならより適切な方法で描いた方がよいでしょう。
またDialog Managerを使ったダイアログのボタンには、必ずSetDialogDefaultItem()を
実行するようにします。
より詳しい情報が'Inside Macintosh : Maintosh Toolbox Essentials' Listing 6-17に載っていますのでそちらを参考にしてください。
#define kButtonFrameInset -4 #define kButtonFrameSize 3 void DrawDefaultButtonOutline( ControlHandle inButtonH ) { Rect theButtonRect; PenState theSavedPenState; SInt16 theButtonOval; GrafPtr theSavedPortP; GetPort( &theSavedPortP ); SetPort( ( **inButtonH ).contrlOwner ); GetPenState( &theSavedPenState ); PenNormal(); theButtonRect = ( **inButtonH ).contrlRect; InsetRect( &theButtonRect, kButtonFrameInset, kButtonFrameInset ); // The proper oval width/height is following. Not 16. theButtonOval = ( theButtonRect.bottom - theButtonRect.top ) / 2 + 2; // Active or inactive. kControlNoPart is defined in Controls.h if( ( **inButtonH ).contrlHilite != kControlNoPart ) { PenPat( &qd.black ); } else { PenPat( &qd.gray ); } PenSize( kButtonFrameSize, kButtonFrameSize ); FrameRoundRect( &theButtonRect, theButtonOval, theButtonOval ); SetPenState( &theSavedPenState ); SetPort( theSavedPortP ); } [Back]