Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=26)
-   -   Barra de tareas (https://www.clubdelphi.com/foros/showthread.php?t=96533)

Angel.Matilla 05-12-2023 10:47:34

Barra de tareas
 
Hace unos meses lanzaba una pregunta acerca de este elemento (Sobre la barra de tareas) pero la duda no tuvo solución. He seguido buscando y en Stack Overflow encontré un código que me ha dado la pista para encontrar la solución. Adaptado a Builder me queda así:
Código:

void __fastcall TfMenu::FormShow(TObject *Sender)
{
    TRect WorkArea;

    HWND hTaskBar = FindWindow("Shell_TrayWnd", NULL);
    if (hTaskBar != 0)
    {
          GetWindowRect(hTaskBar, &WorkArea);
          this->Constraints->MinHeight = Screen->Height - (WorkArea.Bottom - WorkArea.Top);
          this->Height                = this->Constraints->MinHeight;
    }
    this->Refresh();
}

En teoría con este código el formulario debería tener la altura de la pantalla menos la altura de la barra de tareas.

Si ejecuto depurando, para ver los valores que se van tomando, me encuentro que antes de ejecutarse GetWindowRect la altura del formulario fMenu es 768 que coincide con la de la pantalla (Screen->Height); WorkArea tiene como valores 0, 766, 136, 796 lo que significa que la barra de tareas tiene un altura de 30. Después de ejecutar las dos últimas líneas del if la altura del formulario es 738. En las propiedades del formulario Align está puesto como alNone por lo que al mostrarse el mismo debería ocupar toda la pantalla menos los últimos 30 pixeles. Sin embargo queda así, ocupando el 100% de la pantalla:

¿Qué estoy haciendo mal?

Angel.Matilla 05-12-2023 11:26:36

¡Solucionado! Estaba poniendo el código en mal sitio: en lugar de en OnShow debe ir en OnPaint.

Neftali [Germán.Estévez] 05-12-2023 12:14:13

Cita:

Empezado por Angel.Matilla (Mensaje 553476)
¡Solucionado! Estaba poniendo el código en mal sitio: en lugar de en OnShow debe ir en OnPaint.

Ojo! que al menos en Delphi el evento OnPaint se lanza continuamente. Sólo debería ir en ese evento algo estrictamente obligatorio, de otra forma puedes sobrecargar el sistema mucho de forma innecesaria.

Angel.Matilla 05-12-2023 12:22:22

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 553481)
Ojo! que al menos en Delphi el evento OnPaint se lanza continuamente. Sólo debería ir en ese evento algo estrictamente obligatorio, de otra forma puedes sobrecargar el sistema mucho de forma innecesaria.

Gracias por la apreciación. Y así debe ser porque al probar me he encontrado que pulse el botón que pulse de la barra superior, no se lanza nada. Al menos he encontrado el modo de hacerlo; ahora tengo que ver donde colocarlo.

Angel.Matilla 05-12-2023 13:44:52

Pues al final me ha valido en el OnActivate.

Neftali [Germán.Estévez] 05-12-2023 14:10:19

Cita:

Empezado por Angel.Matilla (Mensaje 553487)
Pues al final me ha valido en el OnActivate.


Ese mucho mejor.
Es que piensa que (si no recuerdo mal) el OnPaint va saltandpo continuamente hasta cuando mueves el ratón por pantalla.


La franja horaria es GMT +2. Ahora son las 23:29:30.

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