TonyManero
14-04-2004, 08:31
Ciao a tutti! :D
Sono alle prese con questa ostica funzione.
Qualcuno di voi l'ha usata?
Mi sefvirebbe per mettere l'icona nella barra delle applicazioni per un programma, in modo da poterlo chiudere lasciando un iconcina che ne indichi lo stato.
Uso Borland C++ Builder 4
Ciao! :)
Il codice è per MFC...speroc he tu riesca ad adattarlo senza troppe difficoltà...
#define WM_ICON_NOTIFY WM_USER+1100
BOOL MyTaskBarDeleteIcon(HWND hwnd, UINT uID)
{
BOOL res;
NOTIFYICONDATA tnid;
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = hwnd;
tnid.uID = uID;
res = Shell_NotifyIcon(NIM_DELETE, &tnid);
return res;
}
BOOL MyTaskBarAddIcon(HWND hwnd, UINT uID, HICON hicon, LPSTR lpszTip)
{
BOOL res;
NOTIFYICONDATA tnid;
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = hwnd;
tnid.uID = uID;
tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
tnid.uCallbackMessage = WM_ICON_NOTIFY;
tnid.hIcon = hicon;
if (lpszTip)
lstrcpyn(tnid.szTip, lpszTip, sizeof(tnid.szTip));
else
tnid.szTip[0] = '\0';
res = Shell_NotifyIcon(NIM_ADD, &tnid);
if (hicon)
DestroyIcon(hicon);
return res;
}
LRESULT OnTrayNotification(UINT wParam, LONG lParam)
{
if (wParam != 1)
return 0L;
if (LOWORD(lParam) == WM_LBUTTONDBLCLK)
{
//fai le tue cose qui
}else if (LOWORD(lParam) == WM_RBUTTONUP)
{
//qui utilizzo codice MFc per visualizzare un menu
CMenu menu, *pSubMenu;
CWnd* pTarget = AfxGetMainWnd();
if (!menu.LoadMenu(IDR_TRAYICONMENU)) return 0;
if (!(pSubMenu = menu.GetSubMenu(0))) return 0;
CPoint pos;
GetCursorPos(&pos);
pTarget->SetForegroundWindow();
::TrackPopupMenu(pSubMenu->m_hMenu, 0, pos.x, pos.y, 0,
this->m_hWnd, NULL);
//questo sotto è importante per farlo funzinare su tutti i sistemi
// BUGFIX: See "PRB: Menus for Notification Icons Don't Work Correctly"
pTarget->PostMessage(WM_NULL, 0, 0);
menu.DestroyMenu();
}
return 1;
}
void CTaskBarIconDlg::OnTrayIconRestore()
{
MyTaskBarDeleteIcon(this->m_hWnd, 1);
MyTaskBarAddIcon(this->m_hWnd, 1, this->m_hIcon, "Taskbar Control");
}
//devi chiappare questi messaggi: ovviamente questo è il modo MFC
LRESULT CTaskBarIconDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
static UINT s_uTaskbarRestart;
switch(message)
{
case WM_CREATE:
s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
break;
case WM_ICON_NOTIFY:
OnTrayNotification(wParam, lParam);
break;
default:
if(message == s_uTaskbarRestart)
OnTrayIconRestore();
}
return CWnd::WindowProc(message, wParam, lParam);
}
//questo è l'evento in risposta ad un comando del menù di sistema
void CTaskBarIconDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if (nID == SC_MINIMIZE)
{
ShowWindow(SW_MINIMIZE);
ShowWindow(SW_HIDE);
MyTaskBarAddIcon(this->m_hWnd, 1, this->m_hIcon, "Taskbar Control");
}
else
CDialog::OnSysCommand(nID, lParam);
}
Nell'evento associato a WM_DESTROY devi chiamare MyTaskBarDeleteIcon...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.