11

関数を使用してDrawThemeBackground、キャンバスにいくつかのシステム要素を描画しています。フォームのタイトル ボタンを描画する必要があります。見逃した唯一の部分defaultは、タイトル ボタンのサイズを取得する方法です。Exist any Uxtheme function to get that info?

ここに画像の説明を入力

4

2 に答える 2

10

これは見た目よりも難しいようです。

最初にGetThemeMetricまたはがありGetThemeIntます。しかし、キャプション ボタンのプロパティを取得しようとすると、0x8007490これらの関数が "要素が見つかりません"を返すという多くの参照が表示されます。

次にありGetThemePartSizeます。これはいくらか機能するようです。つまり、インスタンスの場合は問題なく動作しますがWP_CLOSEBUTTON、インスタンスの場合はナンセンスを返しますWP_MINBUTTONボタンのデフォルトのサイズを取得するため、この関数の使用はお勧めしません。たとえば、ユーザーがタイトルのサイズを変更した場合、正しい値は得られません。とにかく、次のように呼び出すことができます。

uses
  uxtheme, themes;
...

var
  Err: HRESULT;
  Size: TSize;
begin
  Err := GetThemePartSize(ThemeServices.Theme[teWindow], 0,
                          WP_CLOSEBUTTON, CBS_NORMAL, nil, TS_TRUE, Size);

前の 2 つの関数が機能した場合に何が返されるかはわかりません (現在のタイトル バー サイズまたは既定のタイトル バー サイズのボタンのサイズ)。


正確な結果を得る唯一の方法は、WM_GETTITLEBARINFOEXメッセージを使用することです。ただし、欠点があります。Vista以降でのみ機能します。使用する Delphi のバージョンによっては、メッセージとそれが使用する構造体を定義する必要がある場合があります (ここでは D2007)。

const
  CCHILDREN_TITLEBAR = 5;
  WM_GETTITLEBARINFOEX = $033F;

type
  tagTITLEBARINFOEX = record
    cbSize: DWORD;
    rcTitleBar: TRect;
    rgstate: array[0..CCHILDREN_TITLEBAR] of DWORD;
    rgrect: array [0..CCHILDREN_TITLEBAR] of TRect;
  end;
  TITLEBARINFOEX = tagTITLEBARINFOEX;
  TTitleBarInfoEx = tagTITLEBARINFOEX;
  PTitleBarInfoEx = ^TTitleBarInfoEx;

...

var
  TitleInfo: TTitleBarInfoEx;
begin
  SendMessage(Handle, WM_GETTITLEBARINFOEX, 0, NativeInt(@TitleInfo));

次に、 rect から閉じるボタンのサイズを取得できますTitleInfo.rgrect[5]。詳細については、「TITLEBARINFOEX 構造体」を参照してください。値が画面座標であることに注意してください。


XP 以下をサポートする必要がある場合は、古き良きGetSystemMetrics(SM_CXSIZE)and GetSystemMetrics(SM_CYSIZE)( 「ウィンドウ キャプションまたはタイトル バーのボタンの幅 (ピクセル単位)」 ) を使用することをお勧めします。テーマが有効かどうか、エアロが有効かどうかなどに応じて、いくつかの概算を行う必要があります。

于 2012-01-08T16:26:15.367 に答える
0

SystemParametersInfoSPI_GETNONCLIENTMETRICS探しているものだと思います。最小化ボタンと最大化ボタンはNONCLIENTMETRICSを使用していると思います。iSmCaptionWidthwhile close はiCaptionWidth、幅を決定するために使用します。

于 2012-01-08T11:01:48.080 に答える