¿Qué función de Uxtheme debo usar para obtener el tamaño predeterminado de los botones Minimizar, Maximizar y cerrar?

Estoy usando la función DrawThemeBackground para dibujar algunos elementos del sistema en un canvas. Y necesito dibujar los botones de título de un formulario, la única parte que me perdí es cómo puedo obtener los tamaños default de los botones de título. Exist any Uxtheme function to get that info?

introduzca la descripción de la imagen aquí

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

Primero está GetThemeMetric o GetThemeInt . Pero verá muchas referencias de que estas funciones devuelven un 0x8007490 , algún “elemento no encontrado” , cuando intenta recuperar las propiedades de los botones de título.

Luego está GetThemePartSize . Este parece funcionar un poco. Es decir, funciona bien, por ejemplo, para WP_CLOSEBUTTON , pero devuelve tonterías, por ejemplo, para WP_MINBUTTON . No sugerirí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 llamarse así:

 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 idea de qué devolverían las dos funciones anteriores si funcionaran (las dimensiones de los botones para el tamaño de la barra de título actual o el tamaño predeterminado de la barra de título).

La única forma posible de obtener un resultado preciso es utilizar el mensaje WM_GETTITLEBARINFOEX . Pero hay un inconveniente; Funciona solo para Vista y para arriba Es posible que deba definir el mensaje y la estructura que usa, dependiendo de la versión de Delphi que utilice (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)); 

Luego, puede obtener el tamaño para el botón de cierre desde el TitleInfo.rgrect[5] . Consulte ” Estructura TITLEBARINFOEX ” para más detalles. Observe que los valores están en coordenadas de pantalla.

Si necesita compatibilidad con XP y / o una GetSystemMetrics(SM_CXSIZE) inferior, le sugiero que utilice los viejos GetSystemMetrics(SM_CXSIZE) y GetSystemMetrics(SM_CYSIZE) ( “El ancho de un botón en el título de una ventana o barra de título, en píxeles” ). Necesitará hacer algunas aproximaciones dependiendo de si los temas están habilitados, si aero está habilitado, etc.

Creo que SystemParametersInfo con SPI_GETNONCLIENTMETRICS es lo que estás buscando. Supongo que los botones de minimizar y maximizar utilizan NORMAS NO CLIENTES . iSmCaptionWidth mientras está cerca usa iCaptionWidth para determinar el ancho.