Avatar billede chris18 Nybegynder
23. februar 2000 - 21:38 Der er 14 kommentarer og
2 løsninger

Skjul dialog i MSVC 6

Hej,

Hvordan skjuler man en "dialog based app." allerede når den bliver åbnet? Dvs. at programmet overhovedet ikke skal vise sig på skærmen når man åbner det.
Jeg har forsøgt med ShowWindow(SW_HIDE) i OnInitDialog(), men programmet bliver stadig ikke skjult.

Er der nogen der har løsningen?

Christian
Avatar billede sjensen Nybegynder
23. februar 2000 - 22:26 #1
Hver form har en HIDE metode. Det burde være tilstrækkeligt at kalde den i oninitdialog funktionen.
Avatar billede chris18 Nybegynder
24. februar 2000 - 19:13 #2
ShowWindow(SW_HIDE) er da en HIDE metode, eller hvad??
Avatar billede soepro Nybegynder
25. februar 2000 - 15:45 #3
I BCB har hver form en property der hedder WindowState, som man kan sætte til wsMinimized. Herved startes applikationen op som helt normalt, men kun som ikon i task-linien.
Avatar billede soepro Nybegynder
25. februar 2000 - 15:46 #4
Man kan ikke bruge Hide metoden, fordi den "ophæves" af den Show som windows smider i hovedet på applikationen.
Avatar billede nolle_k Nybegynder
25. februar 2000 - 16:51 #5
Problemet ligger sandsynlig vis i at den app. der laves viser Dialogen ved hjælp af et DoModal() kald der gør at du ikke kan udføre andre handlinger  før dialogboksen er lukket! Der skal derfor laves en Modelless dialog, der så kan minimeres!!  Det er OK at dialogen bare minimeres ik???
Avatar billede nolle_k Nybegynder
25. februar 2000 - 17:19 #6
Hvis du slet ikke har brug for at vinduet skal vises men kan nøjes med at være minimeret hele tiden gør du følgende:
MessageHandle med navnet OnShowWindow(...) tilføjes og følgende skrives efter CDialog::OnShowWindow(..)
SetWindowPos(&wndBottom, 0, 0, 0, 0, SWP_HIDEWINDOW);
Dette gør at dialogen er minimeret! Men altid og kan ikke vises!! Ellers kunne der laves en statisk tæller i OnShowWindow(..) der holder øje med at det kun er første gang vinduet vises vinduet minimeres eller skjules om man vil!!!
Avatar billede nolle_k Nybegynder
25. februar 2000 - 17:20 #7
Men det er knapt så fiks en løsning! MEn giv mig et prej hvis ikke løsningen er tilstrækkelig! Jeg vil nemlig tage hjem og holde weekend nu! Sezzzzz
Avatar billede nolle_k Nybegynder
25. februar 2000 - 17:21 #8
Altså det med den statiske tæller! det andet er sgu i orden du!!
Avatar billede chris18 Nybegynder
27. februar 2000 - 16:47 #9
nolle_k:
Din løsning funkerer fint, men der er bare 2 problemer hvis jeg skal kunne bruge det. Det første er at vinduet skal kunne vises igen (det som kunne løses med en statisk tæller). Det andet er at vinduet skal hellere ikke dukke op på taskbar'en. Det er nemlig meningen at mit program, når det åbnet, skal minimere sig til systemtrayen uden at vise sig på skærmen først.
Mit problem er altså:
Jeg kører mit program, mit ikon kommer frem i system trayen, mit program kommer frem på vinduet og i taskbaren. Jeg vil gerne, at det kun er ikonet i systrayen der vises når programmet startes.
Avatar billede soepro Nybegynder
28. februar 2000 - 09:10 #10
I C++ Builder findes et længere eksempel på en komponent, som automatisk smider applikationen new i system tray'et. Den er lang, og jeg ville lyve hvis jeg sagde at jeg forstod det hele. Humlen er jeg derimod ret sikker på ligger i kaldet at 'Shell_NotifyIcon' API'en, som enten lægger et ikon i system tray'et eller fjerner det igen.

Følgende er fra Windows SDK on-line hjælpen:

Sends a message to the system to add, modify, or delete an icon from the taskbar status area.

WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(

    DWORD dwMessage,    // message identifier
    PNOTIFYICONDATA pnid    // pointer to structure
  );   


Parameters

dwMessage

Identifier of the message to send. This parameter can be one of these values:

NIM_ADD    Adds an icon to the status area.
NIM_DELETE    Deletes an icon from the status area.
NIM_MODIFY    Modifies an icon in the status area.


pnid

Pointer to a NOTIFYICONDATA structure. The content of the structure depends on the value of dwMessage.



Return Values

If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero.
Avatar billede soepro Nybegynder
28. februar 2000 - 09:14 #11
Parameter to er en struct som i BCB eksemplet er initialiseret sådan her:

TNotifyIconData &FNid;
:
memset(&FNid, 0, sizeof(TNotifyIconData));
FNid.cbSize = sizeof(TNotifyIconData);
FNid.hWnd = AllocateHWnd(OnMessage);
FNid.uID = (UINT)this;
FNid.hIcon = FIcon->Handle;
FNid.uFlags = NIF_ICON | NIF_MESSAGE;
FNid.uCallbackMessage = WM_SYSTEM_TRAY_NOTIFY;

hvorefter der laves dette kald, for at aktivere ikon'et:

Shell_NotifyIcon(NIM_ADD, &FNid)
Avatar billede chris18 Nybegynder
28. februar 2000 - 19:15 #12
Soepro:
Det er rigtigt, men det har jeg allerede implementeret. Mit program kommer frem i systemtrayen som ønsket, det eneste problem er bare at få applikationen skjult fra starten. Det er åbenbart ikke helt så ligetil i MSVC++ 6.0.
Avatar billede chris18 Nybegynder
10. marts 2000 - 09:00 #13
Nu har jeg fundet ud af det. Det var en del mere besværligt end jeg havde regnet med. Man skulle ændre i sin InitInstance, sådan så den slet ikke kaldte DoModal. Derefter skulle man lave systray ikonet i sin InitInstance. Når man så f.eks. dobbeltklikker på ikonet kan man så vise dialogen ved DoModal.

Men jeg acepterer nu alligevel jeres svar da de var med til at finde løsningen.
Avatar billede nolle_k Nybegynder
10. marts 2000 - 09:04 #14
Hvordan laver man så dette Systray Ikon??? Berig os med din viden!!

Jeg kunne da godt have fortalt dig at det er DoModal() kaldet, der viser dialogen!!

//Nolle_K
Avatar billede chris18 Nybegynder
10. marts 2000 - 20:02 #15
Jeg har lavet en class der hedder CTrayIcon.

I den er der så en create funktion der ser således ud:

BOOL CTrayIcon::Create(CWnd*pParent, UINT uCallBackMessage, LPCSTR szToolTip)//, HICON icon, UINT uID)
{
    m_trayIcon.cbSize = sizeof(NOTIFYICONDATA);
    m_trayIcon.hWnd = pParent->GetSafeHwnd()? pParent->GetSafeHwnd() : m_hWnd;
    m_trayIcon.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);//icon;
    _tcscpy(m_trayIcon.szTip, _T("Dit program"));
    m_trayIcon.uCallbackMessage = uCallBackMessage;
    m_trayIcon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
    m_trayIcon.uID = IDR_MAINFRAME;
   
    return Shell_NotifyIcon(NIM_ADD, &m_trayIcon);
}

For så at vise ikonet, sletter du al koden som i forvejen står i InitInstance. Herefter ændrer du return værdien til TRUE så programmet ikke bare lukker. Inde i InitInstance skriver du så:

CString ClassName = AfxRegisterWndClass(0);

    // Laver et usynligt vindue
    m_Invisible.CreateEx(WS_EX_TOPMOST, ClassName, _T(""), WS_POPUP, 0, 0, 100, 25, NULL, NULL);

    m_pMainWnd = &m_Invisible;

    Icon.Create(m_pMainWnd,WM_ICON_NOTIFY,"Dit program");

Og Icon skal selvfølgelig være af typen CTrayIcon. WM_ICON_NOTIFY er en message du selv definerer som f.eks. WM_USER + 10. (spørg mig ikke hvorfor det virker... koden er inspireret af eksembler fra www.codeguru.com)

Det skulle gerne vise ikonet.

Så kommer det næste problem som jeg ikke helt har fået løst endnu. Man skal jo gerne kunne åbne en PopUp menu når man højreklikker på ikonet, og hvis man dobbeltklikker skulle dialogen gerne vises. Det gøres med en OnNotifyIcon funktion, men jeg har ikke helt fået den til at virke :-(.

Håber det var godt nok, ellers så sig lige til!

Christian    
Avatar billede chris18 Nybegynder
10. marts 2000 - 20:04 #16
Det skal lige siges, at i det første kode eksembel er variablen m_TrayIcon af typen NOTIFYICONDATA
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester