Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
|
[Win32] используя ShellAPI. Почитай в MSDN про Shell_NotifyIcon. Пример кода внутри(MS VC 6 + MFC). 09.06.01 19:59 Число просмотров: 1612
Автор: йцукенг <jcukeng> Статус: Member Отредактировано 09.06.01 20:01 Количество правок: 1
|
предполагаем, что программа на MS VC 6 + MFC
глобальные переменные:
HICON hIcon;
NOTIFYICONDATA niData;
в InitInstance:
после:
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
добавь:
hIcon=LoadIcon(IDR_MAINFRAME);
BOOL brc;
niData.cbSize=sizeof(NOTIFYICONDATA);
niData.hIcon=hIcon;
niData.uID=123;
niData.hWnd=this->m_pMainWnd->m_hWnd;
strcpy(niData.szTip,"Моя прога. (С) йцукенг");
niData.uCallbackMessage=WM_USER+38;
niData.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP;
brc=Shell_NotifyIcon(NIM_ADD,&niData);
if(!brc)
{
MessageBox(NULL,"Не получается добавить ICON to"
"tray","Error",MB_ICONSTOP);
return FALSE;
}
m_pMainWnd->ChangeIconicState();
в карту сообщений CMainFrame добавь:
ON_MESSAGE(WM_USER+38,OnTrayNotify)
код:
afx_msg LRESULT CMainFrame::OnTrayNotify(WPARAM wparam,LPARAM lparam)
{
switch (lparam)
{
case WM_LBUTTONDOWN:
case WM_LBUTTONDBLCLK:
ChangeIconicState();
break;
/* case WM_RBUTTONDOWN:
AfxGetApp()->PostThreadMessage(WM_QUIT,0,0);
break;
*/
default:
break;
}
return 0;
}
CMainFrame::ChangeIconicState()
{
static bool be_iconic=false;
ShowWindow(be_iconic);
ShowOwnedPopups(be_iconic);
if(!be_iconic)
SetWindowPos(&CWnd::wndBottom, 0, 0, 0, 0,
SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
else
{
SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0,
SWP_NOMOVE|SWP_NOSIZE);
SetFocus();
}
be_iconic=!be_iconic;
};
и для полноты картины:
в message map:
ON_WM_SYSCOMMAND()
код:
afx_msg void CMainFrame::OnSysCommand( UINT nID, LPARAM lParam )
{
CFrameWnd::OnSysCommand(nID,lParam);
if(((nID & 0xFFF0) == SC_MINIMIZE))
{
if(theApp.is_iconized)
{
theApp.ChangeIconicOnlyState();
return;
}
}
};
////
и, наконец:
int ISPGatewayApp::ExitInstance()
{
BOOL brc;
brc=Shell_NotifyIcon(NIM_DELETE,&niData);
if(!brc)
MessageBox(NULL,"Error!!!","",MB_ICONSTOP);
return CWinApp::ExitInstance();
}
---
код, который я привел выдран из моей (реально работающей) программы и немного модифицирован.
по идее, должен работать, но я не проверял.
удачи!
йцукенг
|
<programming>
|
[C++] Народ, как сделать так чтобы программа не помещалась на панель задачь?(как аська, только в трее) 09.06.01 18:19
Автор: Stervyatnik Статус: Незарегистрированный пользователь
|
-------------
|
|
Не делай окон :) 10.06.01 16:19
Автор: Raven Статус: Незарегистрированный пользователь
|
> -------------
|
|
[Win32] используя ShellAPI. Почитай в MSDN про Shell_NotifyIcon. Пример кода внутри(MS VC 6 + MFC). 09.06.01 19:59
Автор: йцукенг <jcukeng> Статус: Member Отредактировано 09.06.01 20:01 Количество правок: 1
|
предполагаем, что программа на MS VC 6 + MFC
глобальные переменные:
HICON hIcon;
NOTIFYICONDATA niData;
в InitInstance:
после:
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
добавь:
hIcon=LoadIcon(IDR_MAINFRAME);
BOOL brc;
niData.cbSize=sizeof(NOTIFYICONDATA);
niData.hIcon=hIcon;
niData.uID=123;
niData.hWnd=this->m_pMainWnd->m_hWnd;
strcpy(niData.szTip,"Моя прога. (С) йцукенг");
niData.uCallbackMessage=WM_USER+38;
niData.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP;
brc=Shell_NotifyIcon(NIM_ADD,&niData);
if(!brc)
{
MessageBox(NULL,"Не получается добавить ICON to"
"tray","Error",MB_ICONSTOP);
return FALSE;
}
m_pMainWnd->ChangeIconicState();
в карту сообщений CMainFrame добавь:
ON_MESSAGE(WM_USER+38,OnTrayNotify)
код:
afx_msg LRESULT CMainFrame::OnTrayNotify(WPARAM wparam,LPARAM lparam)
{
switch (lparam)
{
case WM_LBUTTONDOWN:
case WM_LBUTTONDBLCLK:
ChangeIconicState();
break;
/* case WM_RBUTTONDOWN:
AfxGetApp()->PostThreadMessage(WM_QUIT,0,0);
break;
*/
default:
break;
}
return 0;
}
CMainFrame::ChangeIconicState()
{
static bool be_iconic=false;
ShowWindow(be_iconic);
ShowOwnedPopups(be_iconic);
if(!be_iconic)
SetWindowPos(&CWnd::wndBottom, 0, 0, 0, 0,
SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
else
{
SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0,
SWP_NOMOVE|SWP_NOSIZE);
SetFocus();
}
be_iconic=!be_iconic;
};
и для полноты картины:
в message map:
ON_WM_SYSCOMMAND()
код:
afx_msg void CMainFrame::OnSysCommand( UINT nID, LPARAM lParam )
{
CFrameWnd::OnSysCommand(nID,lParam);
if(((nID & 0xFFF0) == SC_MINIMIZE))
{
if(theApp.is_iconized)
{
theApp.ChangeIconicOnlyState();
return;
}
}
};
////
и, наконец:
int ISPGatewayApp::ExitInstance()
{
BOOL brc;
brc=Shell_NotifyIcon(NIM_DELETE,&niData);
if(!brc)
MessageBox(NULL,"Error!!!","",MB_ICONSTOP);
return CWinApp::ExitInstance();
}
---
код, который я привел выдран из моей (реально работающей) программы и немного модифицирован.
по идее, должен работать, но я не проверял.
удачи!
йцукенг
|
|
|