¿Cómo configurar el programa para que se minimice en la bandeja después del inicio?
Puedes sobrecargar el método OnSize() para implementar el icono de la bandeja.
La estructura de datos NOTIFYICONDATA se utiliza para almacenar información sobre el icono de la bandeja. Su estructura es la siguiente:
typedef struct _NOTIFYICONDATA {
DWORD cbSize
; p>HWND hWnd;
UINT uID;
UINT uFlags
UINT uCallbackMessage
HICON hIcon; p>
WCHAR szTip[64];
}NOTIFYICONDATA, *PNOTIFYICONDATA;
Primero, debes agregar la variable NOTIFYICONDATA en la clase de diálogo:
NOTIFYICONDATA nid;
Luego, debes realizar alguna inicialización de nid en OnInitDialog():
nid.cbSize = (DWORD)sizeof( NOTIFYICONDATA); data
nid.hWnd = this-gt; GetSafeHwnd(); //Obtener el identificador de la ventana actual
nid.uID = 100 //Especificar el ID de este nid
p>nid.uFlags = NIF_NOTIFYICONDATA; #definido WM_TRAYICON_RESTORE WM_USER 101 //Este valor suele ser mayor que 100
Sobrecarga el método OnSize(), si la clase de diálogo es CTrayIconDlg;
void CTrayIconDlg:: OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if (nType== TAMAÑO_MINIMIZED) //si el evento está minimizado
{
Shell_ NotifyIcon(NIM_ADD, amp; nid); //agrega un icono al área de la bandeja
ShowWindow(SW_HIDE); // Ocultar la ventana principal
}
}
Ejecute el programa, minimice la ventana y compruebe si la ventana se ocultó correctamente en la bandeja del sistema.
Ahora no puede restaurar la ventana del programa. No importa si hace clic o hace doble clic en el icono pequeño, no hay respuesta. Esto se debe a que su información no se procesa.
Primero, agregue un método a la clase CTrayIconDlg:
afx_msg LRESULT OnRestore(WPARAM wParam, LPARAM lParam);
La implementación es la siguiente:
p>
LRESULT CTrayIconDlg:.OnRestore(WPARAM wParam, LPARAM lParam)
{
if( lParam == WM_LBUTTONDOWN ) //Restaurar si se hace clic izquierdo en el icono
{
ShowWindow(SW_ SHOWNORMAL); //Mostrar la ventana principal
this-gt; SetWindowPos(amp; wndTopMost, 0, 0, 0, 0, 0 , SWP_NOMOVE|SWP_NOSIZE) ; //hacer que la ventana esté siempre en la parte superior
//Shell_ NotifyIcon(NIM_DELETE, amp; nid); restaurado; de lo contrario, mantenga el ícono de la bandeja
}
devuelve 0;
}
Agregue este método al mapa de mensajes: p>
Insertar ON_MESSAGE (WM_TRAYICON_RESTORE, OnRestore) en la tabla de mapeo
BEGIN_MESSAGE_MAP(CForexDemoDlg, CDialog)
...
...
ON_MESSAGE(WM_TRAYICON_RESTORE, OnRestore)
END_MESSAGE_MAP().