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)
-   -   Ventana MDI, "Siempre visible" y "Pantalla completa" (https://www.clubdelphi.com/foros/showthread.php?t=36104)

ixMike 02-10-2006 19:20:09

Ventana MDI, "Siempre visible" y "Pantalla completa"
 
Hola, me preguntaba cómo podría incorporar a mi programa las opciones de pantalla completa y siempre visible. La ventana principal es una MDI. Para lo de pantalla completa he probado poner BorderStyle en bsNone y WindowsState en wsMaximized, pero me anula un HotKey que tiene el programa (no sé por qué) y cuando devuelvo a las propiedades los valores originales (bsSizeable, wsComoEstuviera) y la dejo "Normal" (wsNormal) ocupa toda la pantalla igualmente.
Para lo de siempre visible se me ocurrió poner un TTimer que cada poco tiempo coloque el programa por delante, pero eso es una chapuza y seguro que hay algún método mejor.

Muchas gracias, desde ya.


Edito: también me da problemas con las ventanas hijas (se comportan de forma exrtaña)

dec 02-10-2006 19:24:47

Hola,

Cita:

Empezado por ixMike
La ventana principal es una MDI. Para lo de pantalla completa he probado poner BorderStyle en bsNone y WindowsState en wsMaximized, pero me anula un HotKey que tiene el programa (no sé por qué) (...)

Habría que tratar de averiguar qué puede estar pasando (¿tal vez alguna cosa rara porque la aplicación sea MDI?), porque, lo que dices es la manera correcta, que yo sepa, de hacer lo que necesitas.

Cita:

Empezado por ixMike
(...) cuando devuelvo a las propiedades los valores originales (bsSizeable, wsComoEstuviera) y la dejo "Normal" (wsNormal) ocupa toda la pantalla igualmente.

Tendrás que utilizar el método "SetBounds" del formulario en cuestión, o, en todo caso, "volver" a determinar el ancho, alto, "Left" y "Top" de dicho formulario ("SetBounds" puede hacer todo esto de una vez).

Cita:

Empezado por ixMike
Para lo de siempre visible se me ocurrió poner un TTimer que cada poco tiempo coloque el programa por delante, pero eso es una chapuza y seguro que hay algún método mejor.

Pues como no sea dar a la propiedad "FormStyle" el valor "fsStayOnTop"... :)

ixMike 02-10-2006 19:58:47

Gracias por la información, pero no puedo poner FormStyle en fsStayOnTop porque entonces ya no es fsMDIForm (en mi versión de DElphi es así).

En cuanto a lo de SetBounds, ¿cómo se utiliza?

dec 02-10-2006 20:15:16

Hola,

Cita:

Gracias por la información, pero no puedo poner FormStyle en fsStayOnTop porque entonces ya no es fsMDIForm (en mi versión de DElphi es así).
Pues tienes toda la razón del mundo... no sé cómo no me percaté del asunto... Ya no sé tampoco si bastaría, en ese caso, conque dieras un ancho y un alto para el formulario que coincidiera con las medidas de resolución de la pantalla... tendrías que probar: a lo mejor a algún compañero se le ocurre otra cosa.

Cita:

En cuanto a lo de SetBounds, ¿cómo se utiliza?
"SetBounds" es un método de la clase "TWinControl", esto es, y sirve para determinar las medidas de un control (un formulario, por ejemplo) de una vez. Algo así, para que se entienda:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  aLeft, aTop, aWidth, aHeight: integer;
begin
  aLeft := 10;
  aTop  := 20;
  aWidth := 500;
  aHeight := 400;

  // Esto...
  Self.SetBounds(aLeft, aTop, aWidth, aHeight);

  // Es lo mismo que esto...
  Self.Top := aTop;
  Self.Left := aLeft;
  Self.Width := aWidth;
  Self.Height := aHeight;
end;

De todos modos echa un vistazo a la ayuda sobre el método "SetBounds" no vaya a ser que se me pase algo importante...

ixMike 03-10-2006 18:58:34

Pues muchas gracias,
y eso, a ver si a alguien más se le ocurre algo...:rolleyes:

d-hugo 08-04-2007 15:00:46

otras ideas
 
En cuanto a poner la ventana TopMost, tu problema se resuelve facilmente con la función API SetWindowsPos:

Código Delphi [-]
SetWindowPos(handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE);

Poniendo la propiedad WindowState en swMaximized y usando esta función deberías conseguir lo que deseas.

Los flags SWP_NOMOVE y SWP_NOSIZE mantienen el tamaño y la posición actual de la ventana, de lo contrario tienes que llenar los parámetros que están en cero. Busca en la ayuda del Windows SDK para más información sobre la función.

Una ventaja de esta función sobre la propiedad fsStayOnTop (aparte de poderse usar en aplicaciones MDI) es que al poner y quitar dicha propiedad la ventana suele parpadear, cosa que no sucede al usar la función con los parámetros HWND_TOPMOST o HWND_NOTOPMOST según sea el caso.

En relación al hotkey, ten presente que hacer una ventana TopMost no implica que el hotkey será system wide. Es decir, que cuando la ventana pierda el foco perderás la funcionalidad del KeyPreview. Busca en Google con las siguientes palabras clave y encontrarás información al respecto:
delphi system wide hotkey

Disculpa lo tardío de la respuesta, pero me registré hace poco. En cualquier caso, pensé que esto podría servir de ayuda a otros.

Saludos, Hugo

dec 09-04-2007 06:11:23

Hola,

Cita:

Empezado por d-hugo
Disculpa lo tardío de la respuesta, pero me registré hace poco. En cualquier caso, pensé que esto podría servir de ayuda a otros.

Sí. Está muy bien la respuesta. Me quedo con que la función "SetWindowPos" evita el desagradable parpadeo que se produce utilizando la propiedad "fsStayOnTop" de los formularios (no MDIs). Muchas gracias. :)

ixMike 11-04-2007 18:36:55

Muchísimas gracias, d-hugo.

Debido a los estudios y otros proyectos había dejado de lado el programa que me producía el problema (el cual no solucioné). Tendré que probar eso que me has dicho, parece ser la mejor opción.

Gracias otra vez. Saludos a todos. :)


La franja horaria es GMT +2. Ahora son las 08:42:42.

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