任务栏托盘

一、隐藏程序的主窗口

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

BOOL  CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

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

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

return CFrameWnd::PreCreateWindow(cs);

}

 

 

二、托盘程序

 

 

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
对话框程序

头文件:
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);

转载于:https://www.cnblogs.com/followmyheart/articles/1783012.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值