Red de conocimiento informático - Problemas con los teléfonos móviles - Cómo minimizar el programa en la bandeja en VC++

Cómo minimizar el programa en la bandeja en VC++

1. Introducción a la bandeja

La llamada "bandeja" en la interfaz del sistema de Windows se refiere a la parte en el lado derecho de la barra de tareas debajo con la hora y el sistema. otros signos. Cuando un programa está minimizado o suspendido, pero no desea ocupar la barra de tareas, puede colocar el programa en el área de la bandeja. De hecho, la programación del área de la bandeja es muy sencilla. Vamos a explicarla brevemente a continuación^_^

2 Funciones relacionadas con la programación de la bandeja

De hecho, la esencia de poner la bandeja. El programa en la bandeja es Primero dibuje un ícono en el área de la bandeja, luego oculte el programa y luego realice el procesamiento de mensajes en el ícono de la bandeja, y eso es todo.

Solo existe una función para dibujar íconos y determinar el mensaje transmitido por el ícono, y es——————

WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(DWORD dwMessage,

PNOTIFYICONDATA pnid);

Esta función se encarga de pasar mensajes al sistema para agregar, modificar o eliminar iconos en el área de la bandeja. Su valor de retorno es de tipo booleano. Es decir, si devuelve 0, es Chengren y tiene éxito si no es 0.

El parámetro dwMessage indica la función de aplicación de esta función, ya sea agregar, eliminar o modificar el icono. Si se agrega, su valor es NIM_ADD; si se elimina, es NIM_DELETE y si se modifica, es NIM_MODIFY; El parámetro pnid es una estructura específica relacionada con el icono del programa en el área de la bandeja. Se define de la siguiente manera:

typedef struct _NOTIFYICONDATA {

DWORD cbSize;

HWND hWnd;

UINT uID;

UINT uFlags;

UINT uCallbackMessage;

HICON hIcon;

char szTip[64];

} NOTIFYICONDATA, * PNOTIFYICONDATA;

A continuación se realiza un análisis de cada parámetro de la estructura:

cbSize: longitud de la estructura, utilizando "bits" como unidad. Generalmente en el programa usamos (DWORD)sizeof(NOTIFYICONDATA) para asignarle un valor.

HWnd: Un identificador. Si se opera el icono de la bandeja, se enviará el mensaje correspondiente a la ventana representada por este identificador. Naturalmente, en la mayoría de los casos es this-m_hWnd.

uID: ID de icono definido en el proyecto

uFlags: Este miembro marca qué datos de otros miembros son válidos, respectivamente NIF_ICON, NIF_MESSAGE, NIF_TIP, que representan datos respectivamente Los miembros válidos son hIcon , uCallbackMessage, szTip. Por supuesto, se pueden vincular tres valores usando "|". Los siguientes miembros se explican respectivamente

hIcon: el identificador del icono que se agregará, eliminará o modificará. Si solo conoce un uID, generalmente puede usar la función LoadIcon para obtener el identificador. Por ejemplo LoadIcon (AfxGetInstanceHandle(),MAKEINTRESOURCE (IDR_MAINFRAME)).

uCallbackMessage: Este es un miembro de datos importante en el funcionamiento del área de la bandeja. Esta es una bandera de mensaje. Cuando el ícono correspondiente en el área de la bandeja se opera con el mouse, se enviará un mensaje a la ventana representada por Hwnd. Por lo tanto, en uFlags, generalmente es necesario marcarlo como válido. Generalmente son mensajes personalizados.

szTip: Texto de sugerencia cuando el mouse se mueve sobre el ícono de la bandeja.

3. Ejemplo de programación de palés

En cuanto a los conocimientos básicos de programación de palés, eso es todo.

A continuación, entraremos en la etapa de ejercicios prácticos específicos y daremos algunos ejemplos de programación de palets para profundizar nuestra comprensión.

1. La función toTray() que minimiza el programa al área de la bandeja del sistema.

void CTimeWakeDlg::toTray()

{

NOTIFYICONDATA nid;

nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA) ;

nid.hWnd=this-m_hWnd;

nid.uID=IDR_MAINFRAME;

nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;

nid.uCallbackMessage=WM_SHOWTASK;//Nombre de mensaje personalizado

nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));

strcpy(nid. szTip, "Recordatorio de tarea programada");//El mensaje de información es "Recordatorio de tarea programada"

Shell_NotifyIcon(NIM_ADD,nid);//Agregue un ícono al área de la bandeja

ShowWindow( SW_HIDE);//Ocultar la ventana principal

}

Esta es una función muy simple. Primero asigna un valor a NOTIFYICONDATA y luego llama a shell_NotifyIcon. El primer parámetro es NIM_ADD. lo que significa sumar. Luego use la función ShowWindow para ocultar la ventana principal. De esta manera se logra la tarea de minimizar el programa al área de la bandeja del sistema.

2. El programa se ha minimizado en el área de la bandeja, pero ¿cómo operar el icono de la bandeja? Esto refleja el papel de uCallbackMessage, un miembro de la estructura NOTIFYICONDATA. La función que proporciona es que cuando el usuario hace clic en el icono en el área de la bandeja con el mouse (ya sea el botón izquierdo o derecho), se enviará un mensaje a la ventana representada por hWnd. El nombre del mensaje es WM_SHOWTASK. Según el mecanismo de mensajes de VC, se agrega una función de respuesta de mensaje al mensaje personalizado.

Declare la función de respuesta de mensaje entre //{{AFX_MSG y //}}AFX_MSG en el archivo de encabezado:

afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam);

Luego agregue la asignación de mensajes en el archivo CPP. Agregue:

ON_MESSAGE(WM_SHOWTASK, onShowTask) entre BEGIN_MESSAGE_MAP y END_MESSAGE_MAP para asignar mensajes y funciones de respuesta de mensajes.

Luego se agrega la implementación de la función onShowTask al archivo CPP:

LRESULT CTimeWakeDlg::onShowTask(WPARAM wParam,LPARAM lParam)

//wParam la recepción es el ID del ícono y lParam recibe el comportamiento del mouse

{

if(wParam!=IDR_MAINFRAME)

return 1;

switch(lParam)

{

case WM_RBUTTONUP://El menú contextual aparece cuando hace clic derecho, solo hay un "Cerrar"

{

LPPOINT lpoint=new tagPOINT;

CMenú menú;

menu.CreatePopupMenu();//Declarar un menú emergente

// Agregue el elemento de menú "Cerrar", haga clic en él para enviar el mensaje WM_DESTROY a la ventana principal (

//oculto) y finalice el programa.

menu.AppendMenu(MF_STRING,WM_DESTROY,"Close");

//Determinar la posición del menú emergente

menu.TrackPopupMenu(TPM_LEFTALIGN ,lpoint- x,lpoint-y,this);

//Recuperación de recursos

HMENU hmenu=menu.Detach();

menu.DestroyMenu( );

eliminar lpoint;

}

romper;

case WM_LBUTTONDBLCLK://Haga doble clic en el botón izquierdo procesando

{

this-ShowWindow(SW_SHOW);//Se realiza la visualización simple de la ventana principal

}

break;

}

devuelve 0;

}