[Win32/c++/API]Minimaliseren naar system tray*

Pagina: 1
Acties:

  • neevedr
  • Registratie: November 2002
  • Laatst online: 21:33

neevedr

Dat was ik niet!

Topicstarter
Ik wil graag mijn applicatie minimaliseren naar alleen de system tray, de hoofdvenster moet dus verdwijnen. Ik maak hem aan met de code
code:
1
2
3
4
5
6
7
    hwnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        g_szClassName,
        "The title of my window",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
        NULL, NULL, hInstance, NULL);

En laat hem zien met:
code:
1
2
        ::ShowWindow(m_hWnd, m_dwCreationFlags);
        ::UpdateWindow(m_hWnd);

Als ik hem met
code:
1
        ::DestroyWindow(m_hWnd);

weer verwijder wordt 'onder water' ook de case WM_DESTROY: aangeroepen en sluit dus mijn hele applicatie. Hoe is dit te voorkomen? Ik wil geen gebruik van MFC maken omdat ik daar (nog) geen verstand van heb.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Duh, je roept DestroyWindow aan, dus het is de bedoeling dat je window ook daadwerkelijk gedestroyed wordt :)

Wat jij wil is dat ie niet meer zichtbaar wordt, dat doe je met ShowWindow en als parameter SW_HIDE

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

.oisyn schreef op 28 juni 2004 @ 22:53:
Duh, je roept DestroyWindow aan, dus het is de bedoeling dat je window ook daadwerkelijk gedestroyed wordt :)

Wat jij wil is dat ie niet meer zichtbaar wordt, dat doe je met ShowWindow en als parameter SW_HIDE
Zou dat niet:

code:
1
ShowWindow(hwnd,SW_MINIMIZE);


moeten zijn?

Verwijderd

Verwijderd schreef op 29 juni 2004 @ 00:49:
[...]


Zou dat niet:

code:
1
ShowWindow(hwnd,SW_MINIMIZE);


moeten zijn?
Minimize minimaliseert in de taakbalk, hide verbergt het volledig.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Verwijderd schreef op 29 juni 2004 @ 00:49:
[...]
Zou dat niet:

code:
1
ShowWindow(hwnd,SW_MINIMIZE);

moeten zijn?
Hij wil naar de systray (de Notification Area officieel), niet naar de taakbalk :)

Overigens gaat een systray icon aanmaken nog een sport worden als je met ShowWindow al de mist in gaat :X Nofi aan de topicstarter, maar al eens een goed boek overwogen?

Professionele website nodig?


Verwijderd

nu kan ik geen C(++) , wel delphi echter waar maak je je tray icon aan?
(maak je überhaupt wel een tray icon aan? )

ipv goed boek, zou je hier kunnen beginnen: http://msdn.microsoft.com

[ Voor 25% gewijzigd door Verwijderd op 29-06-2004 01:30 ]


  • neevedr
  • Registratie: November 2002
  • Laatst online: 21:33

neevedr

Dat was ik niet!

Topicstarter
Het is gelukt! Notification Area icon maak ik met deze functie aan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void CMyNote::TrayMessage(HWND hWnd)
{
    char szBuff[] = "Mijn Notities";
    nResource = IDI_ICON1;
    hIcon =(HICON)LoadImage(m_hInstance, MAKEINTRESOURCE(nResource), IMAGE_ICON, 16, 16, 0);
    
    tnd.cbSize              = sizeof(NOTIFYICONDATA);
    tnd.hWnd                = hWnd;
    tnd.uID                 = IDI_ICON1;
    
    tnd.uFlags              = NIF_MESSAGE | NIF_ICON | NIF_TIP;
    tnd.uCallbackMessage    = WM_MY_TRAY_NOTIFICATION;
    tnd.hIcon               = hIcon;
    lstrcpyn(tnd.szTip, szBuff, sizeof(tnd.szTip));
    
    
    Shell_NotifyIcon(NIM_ADD, &tnd);
    Shell_NotifyIcon(NIM_MODIFY, &tnd);
}

Moet nu alleen nog uitzoeken hoe de message afhandeling werkt als ik op minimaliseer druk. Ik dacht zelf aan
code:
1
2
3
4
        case WM_SYSCOMMAND:
            if (wParam == SC_MINIMIZE)
                ::ShowWindow(m_hWnd, SW_HIDE);
            break;
Maar dan werkt alleen het minimaliseren en alle andere muis functies zoals menu/kruisje niet meer.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

neevedr schreef op 29 juni 2004 @ 12:58:
code:
1
2
3
4
        case WM_SYSCOMMAND:
            if (wParam == SC_MINIMIZE)
                ::ShowWindow(m_hWnd, SW_HIDE);
            break;
Maar dan werkt alleen het minimaliseren en alle andere muis functies zoals menu/kruisje niet meer.
Laat de rest van je WndProc eens zien?

Professionele website nodig?


Verwijderd

Het kruisje kan je afvangen door WM_SYSCOMMAND met wParam==SC_CLOSE af te vangen. Is dat wat je bedoelt?

Verwijderd

neevedr schreef op 29 juni 2004 @ 12:58:
Moet nu alleen nog uitzoeken hoe de message afhandeling werkt als ik op minimaliseer druk. Ik dacht zelf aan
code:
1
2
3
4
        case WM_SYSCOMMAND:
            if (wParam == SC_MINIMIZE)
                ::ShowWindow(m_hWnd, SW_HIDE);
            break;
Maar dan werkt alleen het minimaliseren en alle andere muis functies zoals menu/kruisje niet meer.
C++:
1
2
3
4
5
        case WM_SYSCOMMAND:
            if (wParam == SC_MINIMIZE)
                ::ShowWindow(m_hWnd, SW_HIDE);
            break;
        default: DefWindowProc(.... etc); break;


Het is gebruikelijk om aan het eind van je window proc voor de messages die je niet (of niet helemaal) afhandelt 'DefWindowProc()' aan te roepen. Zo blijven nieuwe messages in toekomstige windows versies ook werken...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het lijkt me sowieso ook handig om je DefWindowProc ook aan te roepen als wParam != SC_MINIMIZE

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Ja. Uit mijn code voorbeeldje blijkt dat niet, maar uit mijn commentaar erbij wel :) .

[ Voor 3% gewijzigd door Verwijderd op 29-06-2004 17:15 ]


  • neevedr
  • Registratie: November 2002
  • Laatst online: 21:33

neevedr

Dat was ik niet!

Topicstarter
Alweer gelukt, was niet duidelijk uit Qlone's bericht, de default waarde had ik wel gedaan. Wist niet dat wParam != SC_MINIMIZE ook moest, is eigenlijk wel logisch ook.
Bedankt saam ;)

[ Voor 7% gewijzigd door neevedr op 29-06-2004 19:16 ]

Pagina: 1