8

DrawFrameControlを使用して、古い学校(テーマなし-テーマ付きラジオはまったく別の問題です)ラジオボタンを自分で描いています:

DrawFrameControl(dc, &rectRadio, DFC_BUTTON, isChecked() ? DFCS_BUTTONRADIO | DFCS_CHECKED : DFCS_BUTTONRADIO);

私は、RECT に何を渡すかを決定する確実な方法を見つけることができませんでした。私は 12x12 の長方形を使用していますが、Windows にラジオ ボタンのサイズを教えてもらいたいと思っています。

DrawFrameControl は、通過する四角形に合わせてラジオ ボタンをスケーリングするように見えるので、ラジオの「正しい」サイズに近づける必要があります。画面上の他の (非所有者が描いた) ラジオから離れて見えます。

誰でもこれを行う方法を知っていますか?

4

2 に答える 2

4

このページには、コントロールのサイズ設定のガイドラインがいくつか示されています。コントロールをダイアログに配置するかどうかに応じて、サイズはDLU(ダイアログ単位)とピクセルの両方で指定されることに注意してください。

http://msdn.microsoft.com/en-us/library/aa511279.aspx#controlsizing

APIがいくつかの一般的なコントロールの標準サイズを返す可能性があると思いましたGetSystemMetricsが、何も見つかりませんでした。サイズを決定するための共通のコントロール固有のAPIがある場合があります。

于 2008-09-24T00:44:33.287 に答える
2

私がこれに取り組んでからしばらく経ちましたので、私が説明しているのは私がしたことであり、必ずしも質問に対する直接の答えではありません。

たまたま12x12ではなく13x13のビットマップを使用しています。チェックボックスのビットマップ部分がWM_DRAWITEMに渡されているようです。ただし、WM_MEASUREITEMも設定して同じ値を指定したので、正しい哲学的な意味で「論点先取」と答える可能性があります。

        ケースWM_MEASUREITEM:
            lpmis =(LPMEASUREITEMSTRUCT)lParam;

            lpmis-> itemHeight = 13;
            lpmis-> itemWidth = 13;

            壊す;


        ケースWM_DRAWITEM:
            lpdis =(LPDRAWITEMSTRUCT)lParam;
            hdcMem = CreateCompatibleDC(lpdis-> hDC);  



            if(lpdis-> itemState&ODS_CHECKED)//選択されている場合
                {{
                SelectObject(hdcMem、hbmChecked);
                }
            そうしないと
                {{
                if(lpdis-> itemState&ODS_GRAYED)
                    {{
                    SelectObject(hdcMem、hbmDefault);
                    }
                そうしないと
                    {{
                    SelectObject(hdcMem、hbmUnChecked);
                    }
                }
            StretchBlt(
                lpdis-> hDC、//宛先DC
                lpdis-> rcItem.left、//x左上
                lpdis-> rcItem.top、//y左上

                //次の2行は、幅と
                // 身長。
                lpdis-> rcItem.right-lpdis-> rcItem.left、
                lpdis-> rcItem.bottom-lpdis-> rcItem.top、
                hdcMem、//ソースデバイスコンテキスト
                0、0、//左上のxとy
                13、//ソースビットマップ幅
                13、//ソースビットマップの高さ
                SRCCOPY); //ラスター操作

            DeleteDC(hdcMem);
            TRUEを返します。

これはWin2000とXPの両方でうまく機能しているようですが、Vistaで何ができるかはわかりません。

WM_MEASUREITEMを除外するとどうなるかを確認することは、実験する価値があるかもしれませんが、私は通常、古いコードで、冗長に見えることを行うのに完全に正当な理由があることを発見します。

于 2008-09-24T00:29:17.893 に答える