2012-01-08 19 views

Respuesta

7

Parece que esto es más difícil de lo que parece.

Primero está GetThemeMetric o GetThemeInt. Pero verá muchas referencias que estas funciones devuelven un 0x8007490, un "elemento no encontrado", cuando intenta recuperar las propiedades de los botones de leyenda.

Luego está GetThemePartSize. Este parece funcionar un poco. Eso es, funciona bien, por ejemplo, para WP_CLOSEBUTTON, pero devuelve sin sentido por ejemplo para WP_MINBUTTON. No recomendaría el uso de esta función de todos modos, ya que recupera las dimensiones predeterminadas del botón. Si el usuario ha cambiado el tamaño del título, por ejemplo, no obtendrá los valores correctos. De todos modos, podría ser llamado como esto:

uses 
    uxtheme, themes; 
... 

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

no tengo ni idea de lo volverían las dos funciones anteriores si trabajaban (las dimensiones de botones para el tamaño de la barra de título actual o el tamaño de la barra de título por defecto).


La única forma posible de obtener un resultado preciso parece ser usar el mensaje WM_GETTITLEBARINFOEX. Pero hay un inconveniente; funciona solo para Vista y arriba. Es posible que necesite definir el mensaje y la estructura que usa dependiendo de la versión de Delphi que use (D2007 aquí).

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)); 

Entonces, se puede obtener el tamaño para el botón de cierre de la rect TitleInfo.rgrect[5]. Consulte "TITLEBARINFOEX structure" para más detalles. Observe que los valores están en coordenadas de pantalla.


Si necesita apoyar XP y/o por debajo, le sugiero que utilice el buen viejo GetSystemMetrics(SM_CXSIZE) y GetSystemMetrics(SM_CYSIZE) ("El ancho de un botón en un título de la ventana o barra de título, en píxeles"). Tendría que entrenar algunas aproximaciones dependiendo de si los temas están habilitados, si aero está habilitado, etc.

0

creo SystemParametersInfo con SPI_GETNONCLIENTMETRICS es lo que estás buscando. Supongo que los botones minimizar y maximizar utilizan NONCLIENTMETRICS. iSmCaptionWidth mientras que cerca usa iCaptionWidth para determinar el ancho.

+0

Dudo que sea esto. Eso dará valores para windows classic seguramente. –

Cuestiones relacionadas