您的位置:首页 > 其它

vc学习之关于缩放到托盘区

2006-03-02 10:01 176 查看
昨天为了这个缩放调了很长时间,非常郁闷的发现最终导致为题的只是没有映射消息,现在我把最终代码的实现贴出来看看

1、增加自定义消息、图标
#define WM_NOTIFYICON WM_USER+5
#define IDI_ICON 0x0005

2、增加响应函数
在DECLARE_MESSAGE_MAP()前面增加
afx_msg void OnNotifyIcon(WPARAM wParam, LPARAM lParam);

3、增加消息映射
ON_MESSAGE(WM_NOTIFYICON,OnNotifyIcon)

4、增加消息映射函数体
void CGateWayMonitorDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
{
if (wParam == IDI_ICON )
{
//响应不同的消息
switch(lParam)
{
case WM_LBUTTONDOWN:
ShowWindow(SW_SHOWNORMAL);
this->SetActiveWindow();
IconRemoveFromTray();
break;
case WM_RBUTTONDOWN:
//弹出右键菜单
//PopupRightMenu(IDR_MENU);
CMenu menu;
CPoint pos;
menu.LoadMenu(IDR_MENU_TRAY_POP); //菜单
//载入事先定义的菜单
CMenu* pMenu=menu.GetSubMenu(0);

GetCursorPos(&pos);

pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd());
break;
}
}}

5、增加托盘区变量
NOTIFYICONDATA m_nd;//便于删除

6、增加函数
BOOL CGateWayMonitorDlg::IconAddToTray(CString strTitle)
{
BOOL bReturn;

bReturn = FALSE;

// 将图标放入系统托盘
m_nd.cbSize = sizeof (NOTIFYICONDATA);
m_nd.hWnd = m_hWnd;
m_nd.uID = IDI_ICON;
m_nd.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
m_nd.uCallbackMessage= WM_NOTIFYICON;
m_nd.hIcon = m_hIcon;

if (strTitle == "") strTitle = "网关监视进程";

strcpy(m_nd.szTip, strTitle);

bReturn = Shell_NotifyIcon(NIM_ADD, &m_nd);

if (bReturn == TRUE)
{
ShowWindow(SW_HIDE);
}
else
{
AfxMessageBox("将窗口缩放到托盘区失败!失败原因:未知");
}

return bReturn;
}

7、增加加入到托盘区函数
BOOL CGateWayMonitorDlg::IconAddToTray(CString strTitle)
{
BOOL bReturn;

bReturn = FALSE;

// 将图标放入系统托盘
m_nd.cbSize = sizeof (NOTIFYICONDATA);
m_nd.hWnd = m_hWnd;
m_nd.uID = IDI_ICON;
m_nd.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
m_nd.uCallbackMessage= WM_NOTIFYICON;
m_nd.hIcon = m_hIcon;

if (strTitle == "") strTitle = "网关监视进程";

strcpy(m_nd.szTip, strTitle);

bReturn = Shell_NotifyIcon(NIM_ADD, &m_nd);

if (bReturn == TRUE)
{
ShowWindow(SW_HIDE);
}
else
{
AfxMessageBox("将窗口缩放到托盘区失败!失败原因:未知");
}

return bReturn;
}

8、增加删除托盘区图标函数
BOOL CGateWayMonitorDlg::IconRemoveFromTray()
{
//将图标从托盘区删除
BOOL bReturn;

bReturn = Shell_NotifyIcon(NIM_DELETE, &m_nd);
return bReturn;
}

9、在需要调用的地方 写入
IconAddToTray("");

10、大功告成
有一个优点,可以及时地删除托盘区的图标,不会造成延时
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: