W
So, hab meine Klasse jetzt verbessert. Ich hatte sie darauf ausgelegt, dass ein Fenster die Nachrichten des TrayIcons bekommt. Jetzt braucht man kein Fenster mehr und kann die Nachrichten direkt in einer WindowProc abfangen. Den neuen Quellcode werd ich gleich hochladen.
@<flo>: Ich hab ein Testprogramm gemacht. Dies funktioniert hundertpro. Kannste ja so in dein Projekt einbauen. Ist jetzt echt easy. So sieht's aus:
#include <windows.h>
// Der Klassen-Header von CTrayIcon
#include "CTrayIcon.h"
// In der Resource sind ein Icon und ein Menu enthalten
#include "Resource.rh"
//---------------------------------------------------------------------------
LRESULT CALLBACK TrayProc(HWND, UINT, WPARAM, LPARAM lParam);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
// Eine MSG-Struktur für die Message-Loop
MSG msg;
// Ein CTrayIcon
//======================================================================
//
// 1.Parameter: klar!
//======================================================================
//
// 2.Parameter: Hier wird die WNDPROC übergeben, die alle Nachrichten abfängt
// Es kann auch ein Fenster angegeben werden. Dann empfängt dieses die Nachrichten
// Die Nachrichten sind entweder WM_TRAYMESSAGE oder WM_COMMAND
// WM_TRAYMESSAGE:
// wParam: Ein Zeiger auf die CTrayIcon-Instanz, die die Message sendet
// lParam: MouseAction wie z.B. WM_LBUTTONUP
//-----------------------------------------------------
// WM_COMMAND:
// Kommt dann an, wenn auf ein MenuItem geklickt wird.
// a) TrayIcon mit Fenster: Das Menu muss dem Fenster gehören
// b) TrayIcon mit WNDPROC: Die Nachricht wird ganz normal wie in a) behandelt
//======================================================================
//
// 3.Parameter: Hier kannst du ein HICON oder eine Icon-ID angeben
//======================================================================
//
// 4.Parameter: Der Text, der erscheint, wenn der Mauszeiger über dem
// TrayIcon verharrt
//======================================================================
CTrayIcon TrayIcon(hInstance,
(WNDPROC)TrayProc,
ID_ICO_LETTER,
TEXT("My Hint"));
// Wir geben dem TrayIcon das Popup-Menu
// 1.Parameter: Das Menu, indem das Popup-Menu enthalten ist
// Man ein HMENU oder die ID angeben
// 2.Parameter: Position des PopupMenus im Menu (hier: das erste)
TrayIcon.SetPopupMenu(ID_TRAYPOPUPMENU, 0);
// Das TrayIcon wird angezeigt
// Ausblenden geht mit CTrayIcon::Hide()
TrayIcon.Show();
// Die Message-Loop
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
//---------------------------------------------------------------------------
LRESULT CALLBACK TrayProc(HWND, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
switch(uiMsg)
{
// Eine Mausaktion ist durchgeführt worden
case WM_TRAYMESSAGE:
{
switch(lParam)
{
// Es wurde der linke Mousebutton losgelassen
case WM_LBUTTONUP:
MessageBox(NULL, TEXT("Du hast mich geklickt"), TEXT("INFO"), MB_OK);
break;
}
}
break;
// Es wurde im Menu geklickt
case WM_COMMAND:
{
switch( LOWORD(wParam) )
{
// Das MenuItem mit der ID ID_MI_EXIT wurde angeklickt
case ID_MI_EXIT:
// Das Programm wird beendet
PostQuitMessage(0);
break;
}
}
break;
}
return 0;
}
//---------------------------------------------------------------------------
Ach ja, falls dich das Resource-Skript dazu noch interessiert:
#include "Resource.rh"
//-------------------------------------------------------
ID_ICO_LETTER ICON DISCARDABLE "Letter2.ico"
//-------------------------------------------------------
ID_TRAYPOPUPMENU MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
MENUITEM "Show NetSend" ID_MI_SHOW
MENUITEM "Exit NetSend" ID_MI_EXIT
END
END
//-------------------------------------------------------
[ Dieser Beitrag wurde am 12.04.2003 um 00:35 Uhr von WebFritzi editiert. ]