# Tray Icon



## 2fast4you87 (25. Februar 2006)

Hallo,

Vc 6.0 Dialog bassierend.
Ich habe nen Button dazu die OnClick Methode 


```
void CTicketDlg::OnOK() 
{
	HWND hMeinFenster; 
	hMeinFenster = ::FindWindow(0,"ticket"); // hwnd von meinem fenster

	Icon_in_Taskleiste(hMeinFenster, 1); // durch übergabe von hwnd verschwindet 
                                                                      //nicht mehr das Tray Icon, wenn ich mit 
                                                                      //der Maus da drüber fahre.
}
```

Icon_in_Taskleiste habe ich in die Klasse von meinem Dialog Fenster implementiert.

Dann habe ich aus diesen Forum diesen code hinzugefügt :


```
void CTicketDlg::Icon_in_Taskleiste (HWND hwnd, BOOL bAnzeigen)
{
	NOTIFYICONDATA tsym;
    ZeroMemory (&tsym, sizeof (NOTIFYICONDATA));

	if (bAnzeigen)
	{
		tsym.cbSize = sizeof (NOTIFYICONDATA);
		tsym.hWnd   = hwnd;
		tsym.uID    = 1;
		tsym.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
		tsym.uCallbackMessage = WM_APP;
		tsym.hIcon  = m_hIcon;
		strcpy (tsym.szTip, "Mein Programm...");
		Shell_NotifyIcon (NIM_ADD, &tsym);
	}

	else
	{
		tsym.cbSize = sizeof (NOTIFYICONDATA);
		tsym.hWnd   = hwnd;
		tsym.uID    = 1;
		tsym.uFlags = 0;
		Shell_NotifyIcon (NIM_DELETE, &tsym);
	}
}
```

Der Autor dieses Quelltext sagt das es möglich ist, wenn ich nun auf das Icon Klicke das was passiert!

Wollte sowas wie ICQ machen minimieren dann Tray Icon und Haupt dlg SW_HIDE wenn ich nen Klick aufs Tray Icon mache SW_SHOW und Tray Icon wieder weg.


Habt ihr ne Ahnung wie? 


Gruß 2fast...


----------



## Tobias K. (25. Februar 2006)

moin


Wo soll denn das Problem liegen?
Einfach MEthode hinzufügen, Code rein, Button auf Funktion "zeigen lassen" fertig.


mfg
umbrasaxum


----------



## MCoder (25. Februar 2006)

Du musst Deinem Dialog einen Message-Handler für die "WM_APP" Message hinzufügen, funktioniert wie hier beschrieben.

Gruß
MCoder


----------



## 2fast4you87 (26. Februar 2006)

Hallo,


```
if (bAnzeigen)
	{
		tsym.cbSize = sizeof (NOTIFYICONDATA);
		tsym.hWnd   = hwnd;
		tsym.uID    = 1;
		tsym.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
		tsym.uCallbackMessage = WM_APP;
		tsym.hIcon  = m_hIcon;
		strcpy (tsym.szTip, "Mein Programm...");
		Shell_NotifyIcon (NIM_ADD, &tsym);
	}
```

tsym.uCallbackMessage = WM_APP; << hier kann ich auch andere Sachen eintragen wie z.B.


```
tsym.uCallbackMessage = WM_LBUTTONDOWN;
```

dann Springt der aber, wenn ich nur über das tray mit der Maus zeige, sofort in die Methode und wiederholt die irgendwie 10.

@MCoder: Habe das gemacht was du da geschrieben hast. Nur komplett verstanden habe ich es nicht.

Durch hinzufügen in die Message Map rufe ich bei einem bestimmten ereigniss die Methode auf.

```
ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)
```

OnMyMessage << also diese Methode, wenn ich nun aber mit PostMessage oder SendMessage eine nachricht schicke, dann geht der nicht in diese methode.

Und mir ist auch nicht klar, wie ich im Sagen soll wenn du aufs Icon klickst soll der in die Methode hinein gehn!


Gruß 2fast ....


----------



## MCoder (26. Februar 2006)

Hallo,

also bei tsym.uCallbackMessage würde ich tunlichst nur selbst definierte Messages eintragen, aber keine schon existierenden Windows-Messages. Das dürfte unter Umständen seltsame Effekte ergeben.
Die Message sollte im Bereich WM_APP bis 0xBFFF liegen, also am besten etwa so definieren:

```
#define WM_MYMESSAGE       WM_APP+1
```



			
				2fast4you87 hat gesagt.:
			
		

> dann Springt der aber, wenn ich nur über das tray mit der Maus zeige, sofort in die Methode und wiederholt die irgendwie 10.


 Der Message-Handler reagiert auf alle Mausereignisse, also auch auf die Mausbewegung, was natürlich ständige Aufrufe erzeugt. Du must daher die dich interessierende Message herausfiltern. Die Message steht in lParam:

```
LRESULT xyz::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
    if( lParam == WM_LBUTTONDOWN) // linker Mausklick
    {
        // ...
    }

    return 0;
}
```



			
				2fast4you87 hat gesagt.:
			
		

> @MCoder: Habe das gemacht was du da geschrieben hast. Nur komplett verstanden habe ich es nicht.


 Den Ablauf kann man eigentlich nur so abschreiben. Das ist das von der MFC fest vorgegebene Schema, um eine Windows-Message zu verwenden. PostMessage oder SendMessage sollte schon funktionieren (brauchst du allerdings hier nicht). Wenn nicht ist da was falsch implementiert.


			
				2fast4you87 hat gesagt.:
			
		

> Und mir ist auch nicht klar, wie ich im Sagen soll wenn du aufs Icon klickst soll der in die Methode hinein gehn!


 Das erledigt die Funktion "Shell_NotifyIcon (NIM_ADD, &tsym);", die NOTIFYICONDATA-Struktur hast du ja vorher mit den nötigen Daten gefüttert.

Gruß
MCoder


----------



## 2fast4you87 (27. Februar 2006)

@MCoder und Tobias K.

Vielen Dank!

Man Klar ich muss die Nachricht der verschickt werden soll natürlich eingeben.
Also entweder eine vorgefährtigte oder eine eigene ->


```
tsym.uCallbackMessage = WM_MYMESSAGE;
```

Und die Dann auswerten. ^^


```
LRESULT CTicketDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
	if( lParam == WM_LBUTTONDOWN) // linker Mausklick
    {
        AfxMessageBox("moep");
    }

    return 0;
}
```

Nochmals vielen Dank !

@MCoder woher weißt du so viel über MFC?


----------



## MCoder (27. Februar 2006)

2fast4you87 hat gesagt.:
			
		

> @MCoder woher weißt du so viel über MFC?


Nach einigen Jährchen Windows-Programmierung mit der MFC sammelt sich so die eine oder andere Erfahrung an ;-)


----------

