[Cabi@net:workトップページ] [プログラミングの断片]
[メニューアイテムに色を付ける] [デフォルトボタンの枠を描く] [バックグラウンドでも関数実行]


あなたは適切にデフォルトボタンの枠を描いていますか?


このようなボタンを使っているアプリケーションに出会ったことはありませんか?

Bad Outline Button

僕はこれは美しくないと感じてしまいます。
で、よりよいのは次のようなものです。

Good Outline Button

これら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]