MFC程序任务栏托盘图标的实现

1.首先自定义函数

//添加任务栏托盘图标,Tray托盘
BOOL CChatRoomDlg::TrayMyIcon(BOOL bAdd)//bAdd为TRUE就添加,bAdd为FALSE就不添加。
{
    BOOL bRet = FALSE;
    NOTIFYICONDATA tnd;
    tnd.cbSize = sizeof(NOTIFYICONDATA);
    tnd.hWnd = GetSafeHwnd();//就是m_hWnd
    tnd.uID = IDR_MAINFRAME;
    if(bAdd == TRUE)
    {
        tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;//uFlags这个参数为了标识下面的哪个参数可用
        tnd.uCallbackMessage = WM_TRAYICON_MSG;//NIF_MESSAGE,任务栏托盘图标在被鼠标点击时触发的消息
        tnd.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));//NIF_ICON
        //_tcscpy_s(tnd.szTip,sizeof(tnd.szTip),_T("聊天室v1.0"));//NIF_TIP
        memcpy(tnd.szTip,_T("聊天室v1.0"),sizeof(tnd.szTip));
        ShowWindow(SW_MINIMIZE);//把窗口最小化。
        ShowWindow(SW_HIDE);//只是把程序窗口隐藏了。(界面的可视化设计其实就是一层窗户纸,捅破了就好了)
        bRet = Shell_NotifyIcon(NIM_ADD,&tnd);//添加任务栏托盘图标
    }
    else
    {
        ShowWindow(SW_SHOWNA);//显示窗口
        SetForegroundWindow();//把程序窗口设置成前景图标
        bRet = Shell_NotifyIcon(NIM_DELETE,&tnd);//删除任务栏托盘图标
    }
    return bRet;
}


2.下面的函数是自定义的动态菜单的命令响应函数,在命令响应函数中调用TrayMyIcon();函数就可以实现点击该菜单时,程序界面消失,在任务栏托盘中显示一个图标。

//添加任务栏托盘图标
void CChatRoomDlg::OnMenuitemtray()
{
    TrayMyIcon();
}


3.添加鼠标移动到任务栏托盘图标上时的自定义消息

#define WM_TRAYICON_MSG (WM_USER+100)//任务栏图标显示的消息(nd.uCallbackMessage = WM_TRAYICON_MSG;)

在消息映射中添加消息和消息响应函数的映射

ON_MESSAGE(WM_TRAYICON_MSG, OnTrayCallBackMsg)

下面是定义的是响应该消息的回调函数

//任务栏托盘图标的响应函数,鼠标只要放到任务栏托盘图标,就会触发WM_TRAYICON_MSG,消息调用这个函数
LRESULT CChatRoomDlg::OnTrayCallBackMsg(WPARAM wparam, LPARAM lparam)
{
    switch(lparam)
    {
    case WM_RBUTTONUP://鼠标右键单击的消息
        {
            CMenu mMenu,*pMenu = NULL;
            CPoint pt;
            mMenu.LoadMenu(IDR_MENU2);
            pMenu = mMenu.GetSubMenu(0);
            GetCursorPos(&pt);
            SetForegroundWindow();//不加这一段代码可能出现右键菜单不消失的现象
            pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,pt.x,pt.y,this);
            break;
        }
    case WM_LBUTTONDBLCLK://鼠标左键双击的消息
        {
           ShowWindow(SW_RESTORE);
        }
        SetForegroundWindow();
        TrayMyIcon(FALSE);
        break;
    default:
        break;
    }
    return NULL;
}


至此就可以实现程序任务栏托盘图标的显示了,可以在switch中增加其他的消息响应。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章