1.首先,要使程序的主窗口不可见,并且不在任务栏上出现任务按钮,要做到这两点,需分别设置主边框窗口的风格和扩展风格:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style =WS_POPUP;//使主窗口不可见
cs.dwExStyle |=WS_EX_TOOLWINDOW;//不显示任务按钮
return CFrameWnd::PreCreateWindow(cs);
}
2.其次,利用系统函数Shell_NotifyIcon将一个图标显示在任务栏的通告区中。该函数的原型为:
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA pnid
);
3.int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
…
NOTIFYICONDATA tnd;
tnd.cbSize=sizeof(NOTIFYICONDATA);
tnd.hWnd=this->m_hWnd;
tnd.uID=IDR_MAINFRAME;
tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
tnd.uCallbackMessage=WM_LIBEN;
tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(tnd.szTip,"提示信息");
Shell_NotifyIcon(NIM_ADD,&tnd);
…
}
在调用该函数之前,需要确定其参数的取值,其中之一为一个具有NOTIFYICONDATA类型的结构。
4.void CMainFrame::OnLiben(WPARAM wParam,LPARAM lParam)
{
UINT uID;//发出该消息的图标的ID
UINT uMouseMsg;//鼠标动作
POINT pt;
uID=(UINT) wParam;
uMouseMsg=(UINT) lParam;
if(uMouseMsg==WM_RBUTTONDOWN)//如果是单击右键
{
switch(uID)
{
case IDR_MAINFRAME://如果是我们的图标
GetCursorPos(&pt);//取得鼠标位置
…//执行相应操作
break;
…
default:
…
}
5.afx_msg void OnLiben(WPARAM wParam,LPARAM lParam);
6.ON_MESSAGE(WM_LIBEN,OnLiben)
好了试试看。
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style =WS_POPUP;//使主窗口不可见
cs.dwExStyle |=WS_EX_TOOLWINDOW;//不显示任务按钮
return CFrameWnd::PreCreateWindow(cs);
}
2.其次,利用系统函数Shell_NotifyIcon将一个图标显示在任务栏的通告区中。该函数的原型为:
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA pnid
);
3.int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
…
NOTIFYICONDATA tnd;
tnd.cbSize=sizeof(NOTIFYICONDATA);
tnd.hWnd=this->m_hWnd;
tnd.uID=IDR_MAINFRAME;
tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
tnd.uCallbackMessage=WM_LIBEN;
tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(tnd.szTip,"提示信息");
Shell_NotifyIcon(NIM_ADD,&tnd);
…
}
在调用该函数之前,需要确定其参数的取值,其中之一为一个具有NOTIFYICONDATA类型的结构。
4.void CMainFrame::OnLiben(WPARAM wParam,LPARAM lParam)
{
UINT uID;//发出该消息的图标的ID
UINT uMouseMsg;//鼠标动作
POINT pt;
uID=(UINT) wParam;
uMouseMsg=(UINT) lParam;
if(uMouseMsg==WM_RBUTTONDOWN)//如果是单击右键
{
switch(uID)
{
case IDR_MAINFRAME://如果是我们的图标
GetCursorPos(&pt);//取得鼠标位置
…//执行相应操作
break;
…
default:
…
}
5.afx_msg void OnLiben(WPARAM wParam,LPARAM lParam);
6.ON_MESSAGE(WM_LIBEN,OnLiben)
好了试试看。
给你段大致代码:
void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
{
switch(nID)
{
case SC_MINIMIZE:
{
HICON hicon=LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDR_MAINFRAME));
HWND hwnd=this->GetSafeHwnd();
//当最小化时,添加图标到任务栏右下脚
m_Tray.TaskBarAddIcon(hwnd,IDR_NOTIFYICON,hicon,"好好学习!");
//this->ShowWindow(SW_HIDE);
break;
} case SC_CLOSE:
{
HWND hwnd=this->GetSafeHwnd();
//关闭时,去掉图标
m_Tray.TaskBarDeleteIcon(hwnd,IDR_NOTIFYICON);
break;
}
default :
CFrameWnd::OnSysCommand(nID, lParam);
}
}
//其中m_Tray是封装托盘区域操作类的一个实例。
你需要了解NOTIFYICONDATA结构和Shell_NotifyIcon()的用法。你搜索一下MSDN或者CSDN论坛。应该可以找到你的答案