Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Como obtener el ancho del borde de las ventanas de Windows (https://www.clubdelphi.com/foros/showthread.php?t=66101)

gluglu 02-02-2010 12:56:44

Como obtener el ancho del borde de las ventanas de Windows
 
Después de mucho tiempo vuelvo a saludaros a tod@s !

Y tengo una preguntita : Como puedo obtener en mi programa Delphi el valor del ancho del borde de las ventanas en Windows ?

Resulta que entre Windows XP y Windows 7 (p.ej.), el ancho del borde de las ventanas cambia, y en algunas ocasiones me fastidia en cierta manera ese cambio, por lo que necesitaria saber qué varible de Windows guarda dicho valor, y como obtenerlo desde Delphi.

Gracias como siempre por vuestra ayuda.

Casimiro Notevi 02-02-2010 13:06:38

Hola, gluglu, no conozco la respuesta a tu pregunta :D, pero quiero saludarte, tanto tiempo ya, espero que sigas bien y con tu afición tan bonita bajo los mares :)

gluglu 02-02-2010 13:25:15

Gracias Casimiro :) !

Nunca he dejado de consultar por estos lares pero he intentado dedicar el mayor tiempo posible a avanzar en mi aplicación que me está llevando mucho tiempo.

.... y sí, sigo con mi afición que corresponde a mi 'nick' ! ... aunque de momento se note la crisis y no pueda disfrutar de ella tanto como quisiera !! :o

rgstuamigo 02-02-2010 14:37:47

Cita:

Empezado por gluglu (Mensaje 352613)
Después de mucho tiempo vuelvo a saludaros a tod@s !

Y tengo una preguntita : Como puedo obtener en mi programa Delphi el valor del ancho del borde de las ventanas en Windows ?

Resulta que entre Windows XP y Windows 7 (p.ej.), el ancho del borde de las ventanas cambia, y en algunas ocasiones me fastidia en cierta manera ese cambio, por lo que necesitaria saber qué varible de Windows guarda dicho valor, y como obtenerlo desde Delphi.

Gracias como siempre por vuestra ayuda.

No se si sera lo que estas necesitando :rolleyes:, pero puedes mirar las propiedades BorderWidth y BorderStyle del formulario ,en especial la segunda ya que te permite cambiar el estilo del borde.;).
Saludos...:)

escafandra 02-02-2010 14:43:08

API GetWindowRect

Ejemplo Fácil en un formulario simple con un botón: Encontrar el Alto y el Ancho de nuestro formulario:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  WR: TRect;
  Ancho: integer;
  Alto: integer;
begin
  Windows.GetWindowRect(Handle, WR);
  Ancho:= WR.Right - WR.Left;
  Alto:= WR.Bottom - WR.Top;
end;

Saludos.

coso 02-02-2010 15:15:46

Hola,
yo uso Height - ClientHeight, Width-ClientWidth. Saludos.

delphi.com.ar 02-02-2010 15:32:28

Te recomiendo investigar la WinApi: GetSystemMetrics, creo que es exactamente lo que buscas.

Saludos!

Neftali [Germán.Estévez] 02-02-2010 15:47:33

Yo utilizo también el método de coso. Usar el Height/Width y las respectivas ClientHeight/ClientWidth.

gluglu 03-02-2010 10:56:53

Muchísimas gracias a todos por vuestra ayuda. Me ha servido mucho.

El problema viene principalmente por el hecho de que mis forms con un borde de ventana tienen un tamaño predefinido por diseño, y utilizo además los 'Constraints' precisos para delimitar el tamaño máximo.

Este hecho, me define como muy bien habeis indicado, el tamaño del 'Client' y con las propiedades que indicais puedo hallar el tamaño del borde de la ventana.

El problema viene, tal y como indiqué, cuando porto la aplicación de Windows Xp a Windows 7.

Resulta entonces que mi tamaño máximo de Form, definido en mis Constraints, es fijo, y dado que Windows 7 me modifica el tamaño del borde de la ventana respecto de Windows XP, entonces el resultado es que el 'Client' se reduce en algunos píxeles, y este es precisamente el hecho que quiero evitar.

No es tanto por el tamaño del 'Client' que se vé reducido, sino este cambio se aprecia sobre todo y considerablemente cuando en determinadas partes del programa tengo que superponer ventanas a un form, tomando como referencia el borde izquierdo del 'Client'. Al ser dos forms diferentes, la referencia que tomaba es la que me daba Windows XP, sin saber que Windows 7 me cambiaría ese ancho de borde. Al cambiarlo, el left del nuevo form con respecto al form inferior, que ahora tiene un borde más ancho, es diferente.

Por eso, y concluyendo, entiendo que aunque con las propiedades Width y ClientWidth puede conocer el ancho del borde, en mi caso, y por las particularidades que indico, debo de uitlizar la función GetSystemMetrics del Api de Windows.

Gracias de nuevo a todos por vuestra ayuda. ;)

mlara 15-12-2010 18:57:43

Cita:

Empezado por gluglu (Mensaje 352724)
Por eso, y concluyendo, entiendo que aunque con las propiedades Width y ClientWidth puede conocer el ancho del borde, en mi caso, y por las particularidades que indico, debo de uitlizar la función GetSystemMetrics del Api de Windows.

Puedo preguntar qué parámetros pasas a GetSystemMetrics para lograr tu objetivo, y cuál sería la diferencia entre, por ejemplo, Width - ClientWidth y GetSystemMetrics(SM_CXBORDER)?

gluglu 16-12-2010 13:45:23

En su momento, hice varias pruebas, y finalmente deduje que la función GetSystemsMetrics siempre me devolvía (si no mal recuerdo) el valor 1, o un valor raro.

Probando con XP y W7 aparecían incongruencias que no podía controlar.

Lo que entonces decidí fue que la opción que me funcionaba correctamente era Width - ClientWidth, tal y como explicaban algunos compañeros, pero ajustando los Constraints correspondientes posteriormente.

El planteamiento inicial era erroneo. No debía partir de unos valores de altura y anchura de ventana, incluyendo el borde, y después ajustar esos valores dependiendo del S.O.. Lo que tenía que hace era fijar los valores de ancho y alto de mi ventana según el cliente, y después dejar que el S.O. correspondiente fijara el borde que él quisiera, incluso teniendo en cuenta los valores que el usuario hubiera podido haber cambiado en el propio S.O. para todas las demás ventanas.

Lo que pasa es que en diseño, uno se fija más en los valores totales de un Form, que en los valores del Client, por lo menos en mi caso. Y eso me indujo al error cometido.

Ahora lo que hago, es determinar los valores del Client, en ancho y alto, y después de que el S.O. haya creado la ventaja, fijo los valores máximos de constraints :

Código Delphi [-]
ClientHeight          := 547;
ClientWidth           := 925;
Constraints.MaxHeight := Height;
Constraints.MaxWidth  := Width;

Espero que esta aclaración haya servido respecto del problema inicial. ;)

mlara 21-12-2010 06:14:09

Excelente, de eso se trata. Voy a probarlo.

Gracias.


La franja horaria es GMT +2. Ahora son las 11:01:47.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi