任务栏托盘

一、隐藏程序的主窗口

并不在任务栏上出现任务按钮,需设置主边框窗口的风格

BOOL  CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

cs.style = WS_POPUP;//隐藏主窗口

cs.dwExStyle |= WS_EX_TOOLWINDOW;//隐藏任务按钮

return CFrameWnd::PreCreateWindow(cs);

}

 

 

二、托盘程序

 

 

代码
对话框程序

头文件:
NOTIFYICONDATA nd;
LONG OnNotifyIcon(WPARAM wParam, LPARAM lParam);

cpp文件:
#define WM_NOTIFYICON WM_USER+5 //托盘消息
ON_MESSAGE(WM_NOTIFYICON, OnNotifyIcon)
//托盘消息处理
ON_COMMAND(ID_RELOGIN, OnReLogin)//菜单响应函数
ON_COMMAND(ID_CALL, OnCall)


在BOOL CTrayDemoDlg::OnInitDialog()中:

//添加托盘图标
nd.cbSize = sizeof (NOTIFYICONDATA);
nd.hWnd
= m_hWnd;
nd.uID
= IDR_MAINFRAME;
nd.uFlags
= NIF_ICON|NIF_MESSAGE|NIF_TIP;
nd.uCallbackMessage
= WM_NOTIFYICON;
nd.hIcon
= m_hIcon;
lstrcpy(nd.szTip, L
"托盘项目提示");
Shell_NotifyIcon(NIM_ADD,
&nd); //添加托盘图标

//托盘消息:菜单及鼠标动作
LONG CTrayDemoDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
{

//wParam中是响应消息的图标ID,lParam中则是Windows的消息
switch ( lParam )
{
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:// 响应在托盘图标上的单击
{
CMenu pMenu;
if (pMenu.LoadMenu(IDR_TRAYMENU)) // 用户在托盘图标上单击鼠标右键,弹出菜单
{
CMenu
* pPopup = pMenu.GetSubMenu(0);
ASSERT(pPopup
!= NULL);
CPoint Point;
if(IsIconic())
{
pPopup
->EnableMenuItem(ID_RELOGIN,MF_BYCOMMAND | MF_ENABLED );
pPopup
->EnableMenuItem(ID_CALL,MF_BYCOMMAND | MF_ENABLED );
//pPopup->EnableMenuItem(ID_CALL,MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
}


// 确定鼠标位置以便在该位置附近显示菜单
GetCursorPos( &Point );
SetForegroundWindow();
pPopup
->TrackPopupMenu(
TPM_LEFTALIGN
| TPM_RIGHTBUTTON,
Point.x, Point.y,
this);
}
}
break;
case WM_LBUTTONDBLCLK://托盘双击
OnReLogin();
break;
}
return 0;

}

//隐藏对话框并任务栏图标
void CTrayDemoDlg::OnBnClickedQuit()
{
ShowWindow(SW_HIDE);

}

  

 

三、托盘数据结构

typedef struct  _NOTIFYICONDATA

{

DWORD  cbSize;  //结构长度,单位:bit,一般用(DWORD)sizeof(NOTIFYICONDATA)

HWND     hWnd;  //窗口句柄,对托盘图标操作消息所传递的窗口,一般是this->m_hWnd

UINT        uID;       //图标ID

UINT        uFlags;  //有效标志,NIF_ICON标识hIcon有效,NIF_MESSAGE标识uCallbackMessage,NIF_TIP标识szTip

UINT        uCallbackMessage; //自定义消息,处理托盘操作

HICON     hIcon;     //图标,一般是m_hIcon; 如果只知道uID,一般会用LoadIcon(AfxGetInstanceHandle(),MAKEINTERSOURCE(IDR_MAINFRAME))

char         szTip[64];   //托盘提示文字

}NOTIFYICONDATA, *PNOTIFYICONDATA;

 

 四、托盘消息

    绘制图标及其他操作传递消息的系统函数:

    WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(DWORD dwMessage,PNOTIFYICONDATA pnid);

     

    pnid是NOTIFYICONDATA结构指针,dwMessage是被传递的消息

    消息有:

    NIM_ADD

    修改图标

    NIM_DELETE

    删除图标

    NIM_MODIFY

    修改图标

     

    程序退出时删除图标:

    ::Shell_NotifyIcon(NIM_DELETE, &m_tnid);

posted @ 2010-07-22 13:57  宝哥哥  阅读(505)  评论(0编辑  收藏  举报