原创 VC打造系统托盘图标(转帖)

2008-10-20 22:19 3288 3 3 分类: 软件与OS
添加和删除系统托盘图标:

//需要添加一个成员变量
NOTIFYICONDATA m_nd; //NOTIFYICONDATA结构

/***************************************
* 将图标加入系统托盘
* 参数:
* hWnd - 窗体句柄
* hIcon  - 所要加入的图标句柄
* title     - 悬停于系统托盘之上时所要显示的消息
* uCallbackMessage - 消息标识(需用户自己定义消息)
***************************************/
void CMyDlg::AddIcon(HWND hWnd, HICON hIcon, UINT uCallbackMessage, char *title)
{
        m_nd.cbSize = sizeof(NOTIFYICONDATA);
        m_nd.hWnd = hWnd;
        m_nd.uID = IDR_MAINFRAME;
        m_nd.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
        m_nd.uCallbackMessage = uCallbackMessage;
        m_nd.hIcon = hIcon;
        strcpy(m_nd.szTip, title);
        Shell_NotifyIcon(NIM_ADD, &m_nd);       //加入图标
}

//删除系统托盘图标
void CMyDlg::RemoveIcon()
{
        Shell_NotifyIcon(NIM_Delete, &m_nd);
}
下面就是为图标添加自己的响应消息:

//用户定义的消息(在相应头文件中加入)
#define MYWM_NOTIFYICON WM_USER+1

//添加WinProc消息函数
LRESULT CMyCatchScreenDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
switch(message)
{
  case MYWM_NOTIFYICON:
   //如果是用户定义的消息
   if(lParam==WM_LBUTTONDOWN)
   {
    //添加自己的函数
  
    //鼠标单击图标时主窗口出现
    //ShowMyWindow();
   }
   else if(lParam==WM_RBUTTONDOWN)
   {
    //添加自己的函数
  
    //鼠标右键单击弹出选单
    /*
    CMenu menu;
    menu.LoadMenu(IDR_MY_MENU); //载入事先定义的选单
    CMenu*pMenu=menu.GetSubMenu(0);
    CPoint pos;
    GetCursorPos(&pos);
    pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd());
    */
   }
  break;
}
return CDialog::WindowProc(message, wParam, lParam);
}
调用演示:

void CMyDlg::ShowMyWindow()
{
        RemoveIcon();   //删除系统图标
        ShowWindow(SW_SHOW);    //显示窗口
}

void CMyDlg::HideMyWindow()
{
        ShowWindow(SW_HIDE);    //隐藏窗口
        AddIcon(m_hWnd,m_hIcon,MYWM_NOTIFYICON,"MyDlg");        //添加系统图标
}


PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
3
关闭 站长推荐上一条 /3 下一条