Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-11-2006
kloud kloud is offline
Miembro
 
Registrado: ene 2006
Posts: 23
Poder: 0
kloud Va por buen camino
Saber la posicion de tu aplicacion en el Systray

Hola, como sabran podemos mover la barra de tareas (taskbar) y ponerla donde queramos. Esto me supone un problema, xk necesito saber la posicion exacta de el icono que colocare en el systray de mi aplicacion para poder mostrar una ventana (como el MSN cuando alguien se conecta o te habla).
Espero vuestra ayuda. Un saludo.
Responder Con Cita
  #2  
Antiguo 28-11-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Colocar la ventana relativa a la posición exacta del icono, aunque supongo que se puede hacer, se me hace un poco excesivo. Yo la colocaría simplemente de acuerdo la posición de la barra de tareas (ésta determina la equina donde se encuentra el área de iconos) y eso lo puedes hacer así:

Código Delphi [-]
uses  ShellApi;

...

var
  AppBarData: TAppBarData;

begin
  AppBarData.cbSize := SizeOf(AppBarData);
  AppBarData.hWnd := 0;

  SHAppBarMessage(ABM_GETTASKBARPOS, AppBarData);
  case AppBarData.uEdge of
    ABE_BOTTOM: ShowMessage('abajo');
    ABE_LEFT: ShowMessage('izquierda');
    ABE_TOP: ShowMessage('arriba');
    ABE_RIGHT: ShowMessage('derecha');
  end;
end;

// Saludos
Responder Con Cita
  #3  
Antiguo 28-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Bueno como dijo el ilustre señor Esperalta "ratón que conoce un agujero sólo pronto le caza el gato", así que vamos a ver cuantos agujeros encontramos.

La primera solución podría ser obtener las coordenadas del propio systray:
Código Delphi [-]
function GetSysTrayRect(var R: TRect): Boolean;
var
  hWnd: THandle;
begin
  Result:= FALSE;
  hWnd:= FindWindow('Shell_TrayWnd',nil);
  if hWnd <> 0 then
  begin
    hWnd:= FindWindowEx(hWnd,0,'TrayNotifyWnd',nil);
    if hWnd <> 0 then
      Result:= GetWindowRect(hWnd,R);
  end;
end;

O incluso si queremos dejar aparte el área destinada al reloj y solo obtener la destinada a los iconos, podemos afinar un poco más el código:
Código Delphi [-]
function GetSysTrayRect(var R: TRect): Boolean;
var
  hWnd: THandle;
begin
  Result:= FALSE;
  hWnd:= FindWindow('Shell_TrayWnd',nil);
  if hWnd <> 0 then
  begin
    hWnd:= FindWindowEx(hWnd,0,'TrayNotifyWnd',nil);
    begin
      hWnd:= FindWindowEx(hWnd,0,'SysPager',nil);
      if hWnd <> 0 then
      begin
        hWnd:= FindWindowEx(hWnd,0,'ToolbarWindow32',nil);
        if hWnd <> 0 then
          Result:= GetWindowRect(hWnd,R);
      end;
    end;
  end;
end;

Un ejemplo de las dos funciones anteriores seria el siguiente:
Código Delphi [-]
var
  R: TRect;
begin
  if GetSysTrayRect(R) then
    ShowMessage(Format('Top=%d Left=%d Bottom=%d Right=%d',
      [R.Top,R.Left,R.Bottom,R.Right]));
end;

Pero ahora que tenemos las coordenadas de la bandeja del sistema, pienso que en realidad no te hace falta para nada . Porque lo realmente bonito son esos globitos amarillos que muestran algunos iconos para notificar algo, seguro que los has visto alguna vez. Y para mostrarlos solo hay que usar un par de funciones de la API y ellas se encargan de todo el trabajo. ¿que opinas?
Responder Con Cita
  #4  
Antiguo 28-11-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Adjunto un pequeño ejemplo de un formulario que ya tiene interconstruido el comportamiento animado y ajustado a la esquina que corresponda según la orilla del monitor donde se encuentre la barra de tareas. Para mostrarla ya sólo hay que usar su método Show o poner su propiedad Visible en true.

En el zip se encuentra un ejecutable pero éste sólo se puede usar si se tiene instalado Delphi 7, si no es así, basta compilarlo.

// Saludos
Archivos Adjuntos
Tipo de Archivo: zip AnimateForm.zip (9,7 KB, 163 visitas)
Responder Con Cita
  #5  
Antiguo 28-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Ahora que veo el código de roman, creo que entendí mal lo que buscaba kloud. Aunque sigo diciendo que los globitos son una manera muy "bonita" de mostrar notificaciones.

Y solo por molestar , en donde usas, por ejemplo
Código Delphi [-]
Top := Screen.Height - Height - TaskBarSize.cy + GetSystemMetrics(SM_CYEDGE);

No podríamos usar:
Código Delphi [-]
Top:=  Screen.WorkAreaHeight - Height;
Responder Con Cita
  #6  
Antiguo 28-11-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
De hecho es lo primero que pensé pero no estoy muy seguro porque me imagino que esas ventanas de notificación suelen salir pegadas a la barra de tareas. Si usamos WorkAreaRect y hay más barras de aplicación, puede ser que la ventana ya no quede pegada a la barra de tareas.

// Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Saber la posición del mouse al interior de un canvas.... DarkMedel Gráficos 6 24-08-2015 20:29:31
Como saber la posicion Fila, Columna en un MEMO? bustio Varios 5 28-01-2013 17:56:48
Saber la posición X-Y del cursor en un edit Sr_Sombrero API de Windows 1 19-06-2006 05:55:49
Cómo eliminar un icono del systray de una aplicación de terceros SYWARE API de Windows 8 22-05-2006 17:36:17
Mi programa en el systray osvrom Varios 6 28-04-2004 04:44:41


La franja horaria es GMT +2. Ahora son las 23:46:44.


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
Copyright 1996-2007 Club Delphi