[Tutorial]Dialog in den Tray minimieren + menü
Ist ja schon etwas länger her, seitdem ich ein Tutorial geposted habe. Ich sage euch mal die Wahrheit, ich hatte keine Lust :P
Aber jetzt hat mich gerad wieder das Fieber gepackt und ich schreibe eins.
In diesem Tutorial werde ich euch zeigen, wie ihr euren Dialog in den Tray minimieren könnt und bei Rechtsklick ein Menü aufrufen könnt. Besonders bei Bot programmierern ist diese Technik beliebt. Und sie ist eigentlich recht Simpel.
#Inhalt:
[-]Voraussetzungen & Programme
[-]Dialog erstellen
[-]Funktion in der Header Datei
[-]Funktionen im Quelltext
[-]Menü erstellen
[-]Menü einbinden
[-]Nachwort
[-]Voraussetzungen & Programme
Voraussetzungen:- Kenntnisse im Umgang mit Visual Studio
Programme:- Visual Studio 2005 oder höher (keine Express Version)
An dieser Stelle sage ich es nochmal. Ich benutzte
keine Express Version. Die Express Version ist zwar auch schön und gut wenn man Programmieren will, aber Programmiere hier mit MFC ( Microsoft Foundation Class) und die Express hat kein MFC. Ihr müsst euch also die Vollversion besorgen.
[-]Dialog erstellen
So, als Erstes erstellen wir eine neue Dialoganwendung, oder öffnen eine bestehende.
Wie das geht sollte ja nun nicht mehr das Problem sein.

Ich nenne mein Projekt: DialogTray
Dann stellen wir aud Dialogbasierend und machen die ActiveX Steuerelemente weg. Außerdem solltet ihr auch die Minimieren-Schaltfläche aktivieren.
[-]Funktion in der Header Datei
So nun gehen wir in die CDialogTrayDlg.h (Die Header datei für den Hauptdialog)
Nun haben wir dort unter
Protected: folgendes stehen:
PHP Code:
protected:
HICON m_hIcon;
// Generierte Funktionen für die Meldungstabellen
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
Nun deklarieren wir unsere Funktion z.B. nach afx_msg void OnPaint();
Wir fügen also folgendes hinzu:
PHP Code:
LRESULT OnTrayNotification(WPARAM wParam, LPARAM lParam);
[-]Funktionen im Quelltext
So nun müssen wir unsere Funktionen hinzufügen. Auch wenn es etwas kompliziert aussieht, ist es das nicht.
Wir gehen in die DialogTrayDlg.cpp und fügen nach den Includes folgendes ein:
PHP Code:
#define WM_NOTIFICATION (WM_APP+100)
Dann scrollen wir etwas weiter runter.
Irgendwann sollen wir folgendes sehen:
PHP Code:
BEGIN_MESSAGE_MAP(CDialogTrayDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
(Das sollte eigentlich direkt über der Funktion OnIntitDialog sein. Also leicht zu finden)
Nach dem ON_WM_SYSCOMMAND() fügen wir folgendes ein:
PHP Code:
ON_MESSAGE(WM_NOTIFICATION, OnTrayNotification)
So nun scrollen wir noch ein Stück nach unten, bis wir folgende Funktion sehen:
PHP Code:
void CDialogTrayDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
Und in die ELSE Anweisung schreiben wir folgendes:
PHP Code:
switch( nID){
case SC_MINIMIZE: {
ShowWindow(SW_HIDE);
NOTIFYICONDATA tnd;
ZeroMemory(&tnd, sizeof (NOTIFYICONDATA));
tnd.cbSize = sizeof (NOTIFYICONDATA);
tnd.hWnd = m_hWnd;
tnd.uID = 1;
tnd.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
tnd.uCallbackMessage = WM_NOTIFICATION;
tnd.hIcon = (HICON) LoadImage(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDR_MAINFRAME),IMAGE_ICON, 16,16,LR_SHARED|LR_DEFAULTCOLOR);
wcscpy( tnd.szTip, _T("Mein Dialog"));
Shell_NotifyIcon(NIM_ADD,&tnd);
}break;
default: CDialog::OnSysCommand(nID, lParam); }
So und wir scollen wieder etwas weiter runter. Nach der folgenden Funktion:
PHP Code:
HCURSOR CDialogTrayDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
Fügen wir unsere Funktion ein, die wir auch in der Header deklariert haben.
PHP Code:
LRESULT CDialogTrayDlg::OnTrayNotification(WPARAM wp, LPARAM lp)
{
switch (lp){
case WM_LBUTTONUP: ShowWindow(SW_SHOW);
NOTIFYICONDATA iconData;
iconData.cbSize = sizeof(NOTIFYICONDATA);
iconData.hWnd = this->GetSafeHwnd();
iconData.uID = 1;
return Shell_NotifyIcon(NIM_DELETE,&iconData);
}
return 0;
}
Und ihr seid Fertig. Kompeliert das Projekt und wenn der Dialog offen ist, minimiert ihn. Dann sollte nur das das Icon im Tray zu sehen sein. Wenn ihr nun einen Linksklick da drauf macht, kommt der Dialog wieder hoch.
[-]Menü erstellen
So, natürlich wäre es super, wenn man den Bot , Hack oder jedes andere Programm was ihr habt, und es im Tray minimiert habt, von dort aus auch steuern könntet.
Also erstellen wir uns ein Menü. Wir gehen in die Ressourcenansicht und machen dort einen Rechtsklick und gehen auf "Ressource hinzufügen".
Und dort wählen wir Menü und klicken auf Neu.
Dann klicken wir auf unser Menü und dort wo "Hier eingeben" steht geben wir unsere Menüpunkte ein. Das erste ist wie man es von Menüs kennt, die Überschrift. Die datrunter die Menüeinträge für Funktionen.
[-]Menü einbinden
Jetzt müssen wir unser Menü noch einbinden.
Dafür gehen wir wieder in unsere DialogTrayDlg.h
Nach den ganzen Protected sachen, schreiben wir :
PHP Code:
public:
CMenu m_TrayMenu;
Damit haben wir nun ein CMenu Objekt angelegt. Und können von überall aus darauf zugreifen.
Dann gehen wir in die DialogTrayDlg.cpp und scrollen runter zu unserer
LRESULT CDialogTrayDlg::OnTrayNotification(WPARAM wp, LPARAM lp) Funktion.
Wir erinnern uns:
PHP Code:
LRESULT CDialogTrayDlg::OnTrayNotification(WPARAM wp, LPARAM lp)
{
switch (lp){
case WM_LBUTTONUP: ShowWindow(SW_SHOW);
NOTIFYICONDATA iconData;
iconData.cbSize = sizeof(NOTIFYICONDATA);
iconData.hWnd = this->GetSafeHwnd();
iconData.uID = 1;
return Shell_NotifyIcon(NIM_DELETE,&iconData);
}
return 0;
}
Nun fügen wir ein case WM_RBUTTONUP hinzu. Damit wenn wir einen Rechtsklick auf das TrayIcon machen, das Menü geladen wird.
Das sieht dann so aus:
PHP Code:
case WM_RBUTTONUP: CPoint pt;
GetCursorPos(&pt);
m_TrayMenu.GetSubMenu(0)->TrackPopupMenu(TPM_RIGHTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,pt.x,pt.y,this);
So jetzt scrollen wir noch etwas hoch. Bis wir die
CDialogTrayDlg::OnInitDialog() Funktion finden.
Über dem return TRUE; sollte
// TODO: Hier zusätzliche Initialisierung einfügen
Da drunter schreiben wir:
PHP Code:
m_TrayMenu.LoadMenu(IDR_MENU1);
Somit läd das Objekt immer unser erstelltes Menü. IDR_MENU1 ist die ID. Die kann natürlich anders sein, wenn ihr die verändert habt.
Jetzt seid ihr fertig. Wenn ihr alles richtig gemacht habt, sollte wenn man auf die Minimieren Schaltfläche klickt, der Dialog in den Tray gehen. Bei Rechtsklick das Menü anzeigen und bei Linksklick wieder Maximiert werden.
[-]Nachwort
So ich hoffe es hat euch gefallen. Auch wenn es etwas kompliziert scheint, ist es doch recht einfach. Jetzt könnt ihr eure Hacks, Bots oder auch andere Programme in den Tray minimieren und von dort aus über ein Menü steuern!
Viel Spaß damit.