Knowledge Base Nr: 00197 TaskbarSupport.cpp - http://www.swe-kaiser.de

Downloads: DemoC++-Klasse

taskbar unterstützng
- anzeigen/managen von trayicons/buttons/menues
- applikation in taskbar und vor alt+tab verstecken

  
/*
WindowProc muss für interaktion mit dem icon überladen werden:

LRESULT CWWWDialInDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if (g_pTB)
{
bool bFiltered = g_pTB->FilterWindowProc(message, wParam, lParam);
if (bFiltered)
return 0;
}

return CDialog::WindowProc(message, wParam, lParam);
}

von der standardimplementierung abweichende aktionen können durch überladen
der virtuellen funktionen implementiert werden. beispiel:

class CMyTaskbarSupport : public CTaskbarSupport
{
public:
CMyTaskbarSupport(CWnd* pWnd) : CTaskbarSupport(pWnd, false) { }
virtual ~CMyTaskbarSupport() {}

virtual bool OnMouseLeftButtonUp();
};

bool CMyTaskbarSupport::OnMouseLeftButtonUp()
{
AfxMessageBox("left mouse button pressed!");
return true;
}
*/

class CTaskbarSupport
{
public:
CTaskbarSupport(CWnd* pWnd, bool bHidden = true);
virtual ~CTaskbarSupport();

bool AddState(HINSTANCE hinst, WORD idi, int nState, const char* szToolTip);
bool SetState(int nState, const char* szToolTip);

void Show();
void Hide();
bool Toggle(); //returns m_bHidden

void Cleanup(); //cleanup tray icon

//overload this functions - return true if filtered
virtual bool OnMouseLeftButtonDown();
virtual bool OnMouseLeftButtonUp();
virtual bool OnMouseRightButtonDown();
virtual bool OnMouseRightButtonUp();

bool FilterWindowProc(UINT message, WPARAM wParam, LPARAM lParam);
//returns true if filtered

protected:
HMENU m_hmenue; /* PopUp-Menü */
HICON m_hIcon[MAXSTATES]; /* Handles auf Tray-Icons */

CWnd* m_pWnd;
bool m_bHidden;

void AddTaskBarIcon(HICON hIcon, const char* szToolTip);
void DeleteTaskBarIcon();
void ModifyTaskBarIcon(int nState, const char* szToolTip);
};

//implementieren in dialogbasierte applikation:
- header includieren
#include "..\cpp_classes\TaskbarSupport.h"
- globale variable anlegen
CTaskbarSupport* g_pTB = 0;
- 2 icons anlegen: IDI_ACTIVE/IDI_PASSIVE
- OnInitDialog() erweitern:
g_pTB = new CTaskbarSupport(this, true);

HINSTANCE hinst = AfxGetInstanceHandle();
g_pTB->AddState(hinst, IDI_ACTIVE, 0, "Warten auf IR-Befehl");
g_pTB->AddState(hinst, IDI_PASSIVE, 1, "IR-Befehl wird ausgeführt");
g_pTB->Hide(); //nutzt leider nix - irgendwas setzt es zurück - also in ontimer() nochmal versuchen
ShowWindow(SW_MINIMIZE);

SetTimer(1, 800, NULL);
- WindowProc() hinzufügen:
if (g_pTB)
{
if (g_pTB->FilterWindowProc(message, wParam, lParam))
return 0;
}
- OnDestroy() oder OnClose():
if (g_pTB)
delete g_pTB;

g_pTB = NULL;
- in OnTimer() hinzufügen:
static bool s_bFirstTime = true;
if (s_bFirstTime)
{
g_pTB->Hide(); //in oninitdialog() nutzts leider nix - irgendwas setzt es zurück - also in hier versuchen
s_bFirstTime = false;
}