MFC任务栏和状态栏快速开发

任务栏和状态栏快速开发


1.  MFC下托盘图标的实现和托盘菜单

对话框头文件XXXDlg.h:

1.添加成员变量NOTIFYICONDATA m_nid;

2.添加tray消息响应函数的声明

//响应在托盘图标上的单击

LONGOnNotifyIcon(WPARAM wParam,LPARAM lParam);

----------------------------------------------------------------------

对话框实现文件XXXDlg.cpp:

1.定义tray消息#defineWM_NOTIFYICON   WM_USER+5  

2.CXXXDlg的构造函数添加

//InitializeNOTIFYICONDATA struct

memset(&m_nid,0, sizeof(m_nid));

m_nid.cbSize = sizeof(m_nid);

m_nid.uFlags = NIF_ICON |NIF_TIP | NIF_MESSAGE;

3.CXXXDlg的析构函数添加

m_nid.hIcon = NULL;

Shell_NotifyIcon(NIM_DELETE,&m_nid);

4.添加消息映射:

BEGIN_MESSAGE_MAP(CXXXDlg, CDialog)
 //...
ON_MESSAGE(WM_NOTIFYICON,OnNotifyIcon)//手工添加消息映射
 //...
END_MESSAGE_MAP() 

5.OnInitDialog函数添加:

//添加系统托盘

m_nid.cbSize = sizeof(NOTIFYICONDATA);

m_nid.hWnd = m_hWnd;

m_nid.uID = IDR_MAINFRAME;

m_nid.uFlags = NIF_ICON |NIF_MESSAGE | NIF_TIP;

m_nid.uCallbackMessage= WM_NOTIFYICON;

m_nid.hIcon =m_hIcon;

strcpy(m_nid.szTip,_T("XXX系统"));

Shell_NotifyIcon(NIM_ADD,&m_nid);

6. OnNotifyIcon函数的实现:

//响应在托盘图标上的单击

LONG CMainDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)

{

    //wParam中是响应消息的图标ID,lParam中则是Windows的消息

    switch (lParam)// The backdrop icon sent us a message.  Let's see what it is

    {

    case WM_RBUTTONDOWN:

    {// 用户在托盘图标上单击鼠标右键,弹出菜单

        CMenupMenu;

        if(pMenu.LoadMenu(IDR_NOTIFY_MENU))

        {

            CMenu*pPopup = pMenu.GetSubMenu(0);

            int id;

            ASSERT(pPopup!=NULL);

            CPointPoint;

            if(IsIconic()) pPopup->EnableMenuItem(ID_MINSIZE,MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);

            // 根据对话框窗口的显示/隐藏状态修改菜单名称

            if(IsWindowVisible())

            {

                if(!IsIconic())

                   pPopup->EnableMenuItem(ID_MAINDLG,MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);

            }

            else

                pPopup->EnableMenuItem(ID_HIDE,MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);

            //确定鼠标位置以便在该位置附近显示菜单

            GetCursorPos(&Point);

            SetForegroundWindow();

            //根据菜单项操作

            id = pPopup->TrackPopupMenu(TPM_RETURNCMD |TPM_LEFTALIGN | TPM_RIGHTBUTTON,Point.x,Point.y, this);

            CWnd*pWnd = AfxGetMainWnd();

            switch(id)

            {

            case ID_MAINDLG:

                //窗口前端显示

                SetForegroundWindow();

                ShowWindow(SW_SHOWNORMAL);

                break;

            case ID_HIDE:

                pWnd->ShowWindow(SW_HIDE);

                break;

            case ID_MINSIZE:

                pWnd->ShowWindow(SW_SHOWMINIMIZED);

                break;

            case ID_EXIT:

                ::PostQuitMessage(0);

                break;

            default:

                break;

            }

        }

    }

    break;

    case WM_LBUTTONDBLCLK:

    case WM_LBUTTONDOWN:

        //窗口前端显示

        SetForegroundWindow();

        ShowWindow(SW_SHOWNORMAL);

        break;

    }

    return 0;

}

1.  MFC状态栏显示系统时间

1.  头文件中声明:

private:

CStatusBar m_StatusBar;          //状态栏对象

2. OnInitDialog函数添加

//创建状态栏

    m_StatusBar.CreateEx(this, SBARS_SIZEGRIP);

    UINT panels[5];

    m_StatusBar.SetIndicators(panels, 32);

    CRect rect;

    GetClientRect(rect);

    int width = rect.Width()/5;

    for (int i = 0; i<5; i++)

    {

        m_StatusBar.SetPaneInfo(i, 1000 + i, 0,width);

    }

    m_StatusBar.SetPaneText(0, _T("当前登录用户:"));

    m_StatusBar.SetPaneText(1,theApp.m_strCurUser + _T("(")+theApp.m_strUserType +_T(")"));

    m_StatusBar.SetPaneText(2, _T("当前系统时间:"));

    RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);

    //启动ID为1的定时器,定时时间为1秒,刷新系统时间 

SetTimer(1,1000, NULL);

3. Timer消息

//定时器

void CMainDlg::OnTimer(UINT_PTR nIDEvent)

{

    CString str; //获取系统时间  

    CTime tm = CTime::GetCurrentTime();

    str =tm.Format(_T("%Y-%m-%d %H:%M:%S"));

    m_StatusBar.SetPaneText(3, str);

    CDialogEx::OnTimer(nIDEvent);

}

4. OnSize消息

void CMainDlg::OnSize(UINT nType, int cx,int cy)

{

    CDialogEx::OnSize(nType,cx, cy);

    //判断状态栏是否被创建

    if (IsWindow(m_StatusBar.m_hWnd))

    {

        CRectrect;

        GetClientRect(rect);

        intwidth = rect.Width() / 5;

        for (int i =0; i<5; i++)

        {

            m_StatusBar.SetPaneInfo(i, 1000 + i,0, width);

        }

        RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);

    }

}

参考网址: http://blog.sina.com.cn/s/blog_4a6151550100lqk0.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苦逼的IT男

你的鼓励是我最大的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值