2012-01-08 10 views

Odpowiedz

7

Wygląda na to, że jest to trudniejsze niż się wydaje.

Najpierw jest GetThemeMetric lub GetThemeInt. Ale zobaczysz wiele odnośników, że te funkcje zwracają element "0x8007490, niektóre " nie znaleziono ", gdy próbujesz pobrać właściwości przycisków napisów.

Następnie jest GetThemePartSize. Ten wydaje się działać trochę. To działa dobrze na przykład dla WP_CLOSEBUTTON, ale zwraca bzdury na przykład dla WP_MINBUTTON. Nie sugerowałbym jednak używania tej funkcji, ponieważ pobiera ona domyślne wymiary przycisku . Jeśli użytkownik zmienił na przykład rozmiar tytułu, nie uzyska poprawnych wartości. W każdym razie, można go nazwać tak:

uses 
    uxtheme, themes; 
... 

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

nie mam pojęcia, co byłe dwie funkcje wróci gdyby pracowała (wymiary przycisków do aktualnego rozmiaru paska tytułu lub domyślnego tytułu wielkości bar).


Jedynym możliwym sposobem uzyskania dokładnego wyniku wydaje się użycie wiadomości WM_GETTITLEBARINFOEX. Ale jest wada; działa tylko dla Vista i więcej. Może być konieczne zdefiniowanie komunikatu i struktury, której używa, w zależności od używanej wersji Delphi (tutaj 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)); 

Następnie można uzyskać rozmiar przycisku zamykania z rect TitleInfo.rgrect[5]. Aby uzyskać szczegółowe informacje, patrz "TITLEBARINFOEX structure". Zauważ, że wartości są na współrzędnych ekranu.


Jeśli trzeba wspierać XP i/lub poniżej, proponuję użyć starego dobrego GetSystemMetrics(SM_CXSIZE) i GetSystemMetrics(SM_CYSIZE) („szerokości przycisku w oknie napis lub pasku tytułowym w pikselach”). Będziesz musiał ćwiczyć kilka przybliżeń w zależności od tego, czy motywy są włączone, czy jest włączone aero.

0

myślę SystemParametersInfo z SPI_GETNONCLIENTMETRICS jest to, czego szukasz. Domyślam się, że przyciski minimalizacji i maksymalizacji używają NONCLIENTMETRICS. iSmCaptionWidth podczas zamykania używa iCaptionWidth do określenia szerokości.

+0

Wątpię, czy to jest to. To z pewnością da wartość klasycznym Windows. –

Powiązane problemy