Casa
Top.Mail.Ru Yandeks.Metrika
Foro: "WinAPI";
Archivo actual: 2004.12.12;
Descargar: [xml.tar.bz2];

abajo

Creando una ventana flotante transparente Encontrar ramas similares


Shura   (2004-10-27 09:15) [0]

Hi!
La esencia de la pregunta es esta: creo un formulario con AlphaBlend = Verdadero, lo pongo con StayOnTop, pero cuando el formulario principal se minimiza en la bandeja, la ventana flotante desaparece de la pantalla. ¿Cómo hacer que no desaparezca?
Gracias.



Дмитрий Ботвин   (2004-10-27 10:13) [1]

Y traiga el código, entonces lo veremos juntos ....



Shura   (2004-10-27 10:16) [2]

El código para minimizar a Bandeja:
ShowWindow (Application.Handle, SW_HIDE); Shell_NotifyIcon (NIM_ADD, @lpData);



Дмитрий Ботвин   (2004-10-27 10:31) [3]

Por cierto, AlphaBlend = True no funciona en Win9x ...

Aquí hay un ejemplo de plegado en bandeja y la forma no desaparece.

unidad Unit1;

interfaz.

usos
Windows, Mensajes, Sistemas, Clases,
Controles, Formularios, Diálogos, Menús;

tipo
TForm1 = clase (TForm)
procedimiento FormCreate (Sender: TObject);
procedimiento FormDestroy (Sender: TObject);
privado
procedimiento OnMinimize (Sender: TObject);
público
{Declaraciones públicas}
fin

var
Form1: TForm1;

implementación

utiliza ShellApi;

{$ R * .DFM}

procedimiento TForm1.FormCreate (Sender: TObject);
const
SS = "Demostración de iconos" + # 0;
var nim: TNotifyIconData;
comenzar
nim.cbSize: = sizeof (nim);
nim.wnd: = handle;
nim.uID: = 0;
nim.uFlags: = NIF_ICON o NIF_MESSAGE o NIF_TIP;
nim.uCallbackMessage: = WM_MYNOTIFY;
nim.hIcon: = Application.Icon.Handle;
Mover (SS [1], nim.szTip [0], Longitud (SS));
Shell_NotifyIcon (NIM_ADD, @ nim);
Application.OnMinimize: = Self.OnMinimize;
fin;

procedimiento TForm1.OnMinimize (Sender: TObject);
comenzar
Aplicación.Restore;
// Desaparecer Visible: = falso;
Visible: = verdadero;
fin;

procedimiento TForm1.FormDestroy (Sender: TObject);
var nim: TNotifyIconData;
comenzar
nim.cbSize: = sizeof (nim);
nim.wnd: = handle;
nim.uID: = 0;
nim.uFlags: = 0;
nim.uCallbackMessage: = 0;
nim.hIcon: = 0;
Shell_NotifyIcon (NIM_DELETE, @ nim);
fin;

fin.



Дмитрий Ботвин   (2004-10-27 10:32) [4]

Y en su código SW_HIDE intente reemplazar SW_NORMAL



Shura   (2004-10-27 11:06) [5]

Un poco mal. Probablemente no expliqué lo que quería. Hay dos formas que se crean juntas
comenzar Aplicación.Inicializar; Application.CreateForm (TForm1, Form1); Application.CreateForm (TForm2, Form2); Aplicación.Run; fin
En la primera realizamos las acciones principales, la segunda flotante translúcida. Al minimizar en la bandeja del primer formulario, el segundo debe estar en la pantalla, por ejemplo, Reget y su ventana flotante.



Дмитрий Ботвин   (2004-10-27 11:37) [6]

Prueba esto

unidad Unit1;

interfaz.

usos
Ventanas, Mensajes, Sistemas, Variantes,
Clases, Gráficos, Controles, Formas;

tipo
TForm1 = clase (TForm)
procedimiento WMQueryClose (var Msg: TWMClose);
mensaje WM_CLOSE;
privado
{Declaraciones privadas}
público
{Declaraciones públicas}
fin

var
Form1: TForm1;

implementación

{$ R * .dfm}

// su implementación
procedimiento TForm1.WMQueryClose (var Msg: TWMClose);
comenzar
Msg.Result: = 0;
fin;

fin.

Entonces la forma de rábano picante se cierra :-)))



Shura ©   (2004-10-27 11:56) [7]

Entonces el hecho del asunto es que la segunda forma no se cierra, pero se colapsa con la primera. No me meto en este manejador. ¿Cómo se relacionan estas formas?



Дмитрий Ботвин   (2004-10-27 12:12) [8]

Lo escribes en TForm2. Lo he comprobado en TForm1.



panov ©   (2004-10-27 12:24) [9]

> Shura ©
Probablemente usted de alguna manera no minimice la aplicación.
Aquí hay un ejemplo (solo probado) que hace lo que necesitas:

unit ufIconTray;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Menus,
 ShellApi;

var
 WM_MyNotifyIcon: Cardinal;

type

 TfIconTray = class(TForm)

   //PopUp-меню, всплывающее при клике на иконку
   pmIconTray: TPopupMenu;

   //Пункты меню
   pmIconTrayRestore: TMenuItem;       //Восстановление приложения
   pmIconTrayExit: TMenuItem;          //Завершение программы
   pmIconTrayNoAction: TMenuItem;      //Фиктивный пункт меню

   procedure FormCreate(Sender: TObject);
   procedure IconTray(aAction: Cardinal);    //Процедура для манипуляций с иконкоё в SysTray
   procedure pmIconTrayRestoreClick(Sender: TObject);
   procedure pmIconTrayExitClick(Sender: TObject);
   procedure MyWndProc(var Message: TMessage);
   procedure FormShow(Sender: TObject); //процедура, перекрывающая
                                               //стандартную оконную процедуру
 end;

var
 fIconTray: TfIconTray;

implementation

uses uForm2;

{$R *.dfm}

procedure TfIconTray.FormCreate(Sender: TObject);
var
 UniqueStr: String;
begin
 Application.Title := Self.Caption;
 UniqueStr := Application.Title+IntToStr(Application.Handle);
//Получаем уникальный номер Windows-сообщения.
 WM_MyNotifyIcon := RegisterWindowMessage(PChar(UniqueStr));
//Заменяем обработчик стандартный обработчик сообщений на наш
 WindowProc := MyWndProc;
end;

procedure TfIconTray.MyWndProc(var Message: TMessage);
var
 P: TPoint;
begin
 //Обработка сообщения от иконки в SysTray
 if Message.Msg = WM_MyNotifyIcon then
 begin
   case Message.LParam of

     WM_LBUTTONDBLCLK :
       begin
         //Восстанавливаем приложение
         ShowWindow(Application.Handle,SW_RESTORE);
         //Восстанавливаем основную форму
         ShowWindow(Application.MainForm.Handle,SW_RESTORE);
         //Приложение - на передний план
         SetForegroundWindow(Application.MainForm.Handle);
         //Удаляем иконку
         IconTray(NIM_DELETE);
       end;
     //Клик на правой кнопке мыши
     WM_RBUTTONUP:
     begin
       //Считываем позицию курсора на экране
       GetCursorPos(P);
       //Показываем меню в позиции курсора
       pmIconTray.Popup(P.X, P.Y);
     end;
   end;
   //Заканчиваем обработку
   Message.Result := 0;
   Exit;
 end;
 //Обработка нажатия на кнопку свернуть в заголовке окна
 if (Message.Msg=WM_SYSCOMMAND) and
    (Message.wParam = SC_MINIMIZE) then
 begin
   //Добавляем иконку
   IconTray(NIM_ADD);
   //Скрываем основную форму
   ShowWindow(Application.MainForm.Handle,SW_HIDE);
   //Скрываем приложение
   ShowWindow(Application.Handle,SW_HIDE);
   //Заканчиваем обработку
   Message.Result := 0;
   Exit;
 end;
 //Не наше сообщение - вызываем стандартную процедуру окна
 WndProc(Message);
end;

//Процедура для манипуляций с иконкой
procedure TfIconTray.IconTray(aAction: Cardinal);
var
 nid: TNotifyIconData;
begin
//Заполнение структуры
 nid.cbSize := SizeOf(TNotifyIconData);    //Размер структуры
 nid.Wnd := Self.Handle;                   //Окно назначения
 nid.uID := 0;                             //Назначаем идентификатор иконке
 nid.uCallBackMessage := WM_MyNotifyIcon;  //Процедура для обработки сообщений
 nid.hIcon := Application.Icon.Handle;     //Это основная иконка приложения
 StrPCopy(nid.szTip,Application.Title);    //Всплывающая подсказка (Hint)
//Признаки:
//  NIF_ICON    - используется поле nid.hIcon
//  NIF_MESSAGE - используется сообщение с номером nid.uCallBackMessage для обработки
//  NIF_TIP     - для иконки назначен Hint - всплывающая подсказка.
 nid.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
 case aAction of
   NIM_ADD:  Shell_NotifyIcon(NIM_ADD, @nid);        //Добавление иконки
   NIM_DELETE:  Shell_NotifyIcon(NIM_DELETE, @nid);  //Удаление иконки
   NIM_MODIFY:  Shell_NotifyIcon(NIM_MODIFY, @nid);  //Модификация иконки
 end;
end;

//Обработка при выборе пункта меню "Восстановить"
procedure TfIconTray.pmIconTrayRestoreClick(Sender: TObject);
begin
//Посылаем нашему окну сообщение WM_LBUTTONDBLCLK
 PostMessage(Application.MainForm.Handle,WM_MyNotifyIcon,0,WM_LBUTTONDBLCLK);
end;

//Обработка при выборе пункта меню "Выход из программы"
procedure TfIconTray.pmIconTrayExitClick(Sender: TObject);
begin
//Посылаем нашему окну сообщение WM_LBUTTONDBLCLK
 PostMessage(Application.MainForm.Handle,WM_MyNotifyIcon,0,WM_LBUTTONDBLCLK);
//Закрываем приложение
 Application.MainForm.CLose;
end;

procedure TfIconTray.FormShow(Sender: TObject);
begin
 if not Boolean(Tag) then
 begin
   Form2.Show;
   Tag := 1;
 end;
end;

end.




panov ©   (2004-10-27 12:29) [10]

Sí, hay una falla en el código, luego se corrige:
procedimiento TfIconTray.MyWndProc (var Message: TMessage); var P: TPoint; comenzar // Procesando el mensaje desde el icono en SysTray si Message.Msg = WM_MyNotifyIcon entonces comenzar caso Message.LParam de WM_LBUTTONDBLCLK: comenzar // Restaurar la aplicación ShowWindow (Application.Handle, SW_RESTORE); // Restaura el formulario principal ShowWindow (Application.MainForm.Handle, SW_RESTORE); // Aplicación al primer plano. SetForegroundWindow (Application.MainForm.Handle); // Quitar el icono IconTray (NIM_DELETE); fin // Haga clic en el botón derecho del ratón WM_RBUTTONUP: comenzar // Lee la posición del cursor en la pantalla. GetCursorPos (P); // Mostrar el menú en la posición del cursor SetForegroundWindow (Application.MainForm.Handle); pmIconTray.Popup (PX, PY); fin fin // Terminar el procesamiento Mensaje.Resultado: = 0; Salida fin // Procesando el botón clic para minimizar en el título de la ventana. if (Message.Msg = WM_SYSCOMMAND) y (Message.wParam = SC_MINIMIZE) entonces comenzar // Añadir un icono IconTray (NIM_ADD); // Ocultar el formulario principal ShowWindow (Application.MainForm.Handle, SW_HIDE); // ocultar la aplicación ShowWindow (Application.Handle, SW_HIDE); // Terminar el procesamiento Mensaje.Resultado: = 0; Salida fin // No es nuestro mensaje: llame al procedimiento de ventana estándar WndProc (Mensaje); fin



Shura ©   (2004-10-27 12:57) [11]

> Dmitry Botvin
Lo registré allí.
> panov
Lo hago casi igual de bien, pero no a través de la intercepción de mensajes, sino a través de ApplicationEvents.OnMinimize, y tampoco tengo MainForm - SDI. La creación de todas las formas se produce después de inicializar.



Shura ©   (2004-10-27 13:03) [12]

Woops! Respecto a "No tengo MainForm" es el culpable, me equivoqué :-) Necesito resolver el resto.



Shura ©   (2004-10-27 13:56) [13]

Este código funcionó, pero solo si hace clic en "menos" en el formulario, y si está en la barra de tareas, no hay efecto.



Páginas: 1 rama entera

Foro: "WinAPI";
Archivo actual: 2004.12.12;
Descargar: [xml.tar.bz2];

arriba





Memoria: 0.62 MB
Tiempo: 0.064 c
4-1098727684
Anti
2004-10-25 22:08
2004.12.12
Trabajar con servicios


1-1101481661
Botón
2004-11-26 18:07
2004.12.12
editando archivos de registro


1-1101645706
Reminador
2004-11-28 15:41
2004.12.12
Cripta-cripta-md5


14-1101236498
Myron
2004-11-23 22:01
2004.12.12
Las últimas dos semanas estaba buscando un trabajo en Moscú. Los resultados.


1-1101726843
Sanya
2004-11-29 14:14
2004.12.12
Teclado vs Usuario





africaans albanés Arabic armenio Azerbaiyán vasco Bielorruso Bulgarian Catalán Chino (simplificado) Chino (tradicional) Croata Checo Danés Dutch Inglés Estonia filipina Finnish Francés
gallego georgiano Alemán Griego criollo haitiano Hebreo hindi Húngaro islandés Indonesian irlandés Italiana Japonés Korean letón lituano macedonio Malay maltés Noruego
persa polaco Portuguese Rumano Ruso Serbio Slovak Esloveno Español swahili Sueco Thai turco ucranio Urdu vietnamita galés yídish bengalí bosnio
cebuano esperanto gujarati hausa hmong igbo javanés kannada khmer lao latín maorí marathi mongol nepali punjabi somalí Tamil telugu yoruba
zulú
Английский Francés Alemán Italiano portugués Русский Español