2017-01-03 1 views
2

J'ai créé une application SDL2 et je souhaite qu'elle soit réduite dans la barre d'état système plutôt que dans la barre des tâches.Réduire la fenêtre à la barre d'état système

SDL_MinimizeWindow ne fait pas ce que je veux, il laisse l'icône de la barre des tâches. Y a-t-il un moyen d'y parvenir avec SDL?

+2

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. –

+0

merci, @CodyGray –

Répondre

4

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; 
    } 
}