Il n'y a pas de moyen purement SDL2 pour ce faire, comme l'a dit Cody, Shell_NotifyIcon
est la fonction nécessaire pour créer une icône de zone de notification (barre d'état système).
Le code que j'utilisé pour obtenir l'icône est
SDL_Window *window = SDL_CreateWindow("Test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 200, 200, SDL_WINDOW_HIDDEN);
SDL_SysWMinfo info;
SDL_VERSION(&info.version);
NOTIFYICONDATA icon;
if (SDL_GetWindowWMInfo(window, &info))
{
icon.uCallbackMessage = WM_USER + 1;
icon.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
icon.hIcon = LoadIcon(NULL, IDI_INFORMATION);
icon.cbSize = sizeof(icon);
icon.hWnd = info.info.win.window;
strcpy_s(icon.szTip, "Test tip");
bool success = Shell_NotifyIcon(NIM_ADD, &icon);
}
Cela crée une fenêtre cachée, et une icône (en utilisant l'icône de l'information par défaut).
Pour interagir avec ce SDL, vous devez activer les événements de gestion des fenêtres spécifiques de la plate-forme, cela se fait comme suit SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE);
Après cela, dans la boucle de l'événement principal, vous devez tester SDL_SYSWMEVENT
, qui contient des informations sur l'utilisateur a interagi avec l'icône de la zone de notification. Cela recherche également l'événement minimize et cache la fenêtre qui le supprime de la barre des tâches. Ceci est réalisé dans l'extrait suivant
SDL_Event e;
while (SDL_PollEvent(&e) != 0)
{
switch (e.type)
{
case SDL_SYSWMEVENT:
if (e.syswm.msg->msg.win.msg == WM_USER + 1)
{
if (LOWORD(e.syswm.msg->msg.win.lParam) == WM_LBUTTONDBLCLK)
{
SDL_ShowWindow(window);
SDL_RestoreWindow(window);
}
}
break;
case SDL_QUIT:
running = false;
break;
case SDL_WINDOWEVENT:
if (e.window.event == SDL_WINDOWEVENT_MINIMIZED)
SDL_HideWindow(window);
break;
}
}
Vous êtes à la recherche d'une icône de notification. Je ne connais pas SDL2, donc je ne sais pas si ça enveloppe ça. Dans Win32, vous utilisez la fonction 'Shell_NotifyIcon' pour les manipuler. –
merci, @CodyGray –