関数を使用してDrawThemeBackground
、キャンバスにいくつかのシステム要素を描画しています。フォームのタイトル ボタンを描画する必要があります。見逃した唯一の部分default
は、タイトル ボタンのサイズを取得する方法です。Exist any Uxtheme function to get that info?
2 に答える
これは見た目よりも難しいようです。
最初に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)
( 「ウィンドウ キャプションまたはタイトル バーのボタンの幅 (ピクセル単位)」 ) を使用することをお勧めします。テーマが有効かどうか、エアロが有効かどうかなどに応じて、いくつかの概算を行う必要があります。
SystemParametersInfoがSPI_GETNONCLIENTMETRICS
探しているものだと思います。最小化ボタンと最大化ボタンはNONCLIENTMETRICSを使用していると思います。iSmCaptionWidth
while close はiCaptionWidth
、幅を決定するために使用します。