建立一个任务栏通知程序

建立一个任务栏通知程序

 

1.首先建立一个基于对话框的应用程序,名称为Tray。

 

2.在对话框的OnInitDialog()函数中,加入如下代码,使对话框程序运行时出现在任务栏的通知区域:

 

//移动对话框到不可见区域
AfxGetMainWnd()->MoveWindow(-500,-500,100,100,true);  //补充说明:其实直接隐藏来得更好。

//设置对话框属性,使其不在任务栏上显示
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
WS_EX_TOOLWINDOW|WS_EX_STATICEDGE);

 

(对于SDI应用程序,应该在CMainFrame::PreCreateWindow()中使用下面代码使其主窗口不可见且不在任务栏出现
cs.style = WS_POPUP;
cs.dwExStyle = WS_EX_TOOLWINDOW;)

//加到任务栏
NOTIFYICONDATA tnd;
tnd.cbSize=sizeof(NOTIFYICONDATA);
tnd.hWnd=AfxGetMainWnd()->m_hWnd;
tnd.uID=IDR_MAINFRAME;
tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
tnd.uCallbackMessage=WM_PROC;
tnd.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
strcpy(tnd.szTip,"我的任务栏程序");
Shell_NotifyIcon(NIM_ADD,&tnd);

 

3.添加自定义消息处理函数

 

在TrayDlg.h文件开头加入

#define WM_PROC WM_USER+100

 

在中间相应的地方加入:

afx_msg void OnProc(WPARAM wParam,LPARAM lParam);

 

在TrayDlg.cpp中加入:

ON_MESSAGE(WM_PROC,OnProc)

 

以及下面代码来响应鼠标的点击处理

void CTrayDlg::OnProc(WPARAM wParam,LPARAM lParam)
{
  UINT uMouseMsg;//鼠标动作
  uMouseMsg=(UINT) lParam;

  if(uMouseMsg==WM_LBUTTONDOWN)
  {
    ATOM GlobalAtom;
    if(!GlobalFindAtom("Aboutc"))
    {
      GlobalAtom=GlobalAddAtom("Aboutc");

      CAboutDlg dlg; //弹出About对话框
      dlg.DoModal();

      GlobalDeleteAtom(GlobalAtom);
    }
  }
  if(uMouseMsg==WM_RBUTTONDOWN)
  {
    AfxGetMainWnd()->SetForegroundWindow(); //弹出Popup菜单
    CMenu menu;
    menu.LoadMenu(IDR_TRAYMENU);
    CMenu* pPopup=menu.GetSubMenu(0);
    CPoint Point;
    GetCursorPos(&Point);
    pPopup->TrackPopupMenu(TPM_LEFTALIGN,Point.x,Point.y,AfxGetMainWnd(),NULL );
    AfxGetMainWnd()->PostMessage(WM_NULL, 0, 0);
  }
}
并添加一个只有两项(关于|关闭)的子菜单,用于右键点击图标时的弹出菜单

 

4.添加菜单处理程序

void CTrayDlg::OnAboutc()
{
  //利用原子来禁止程序运行多个实例

  ATOM GlobalAtom;
  if(!GlobalFindAtom("Aboutc"))
  {
    GlobalAtom=GlobalAddAtom("Aboutc");

    //弹出About对话框
    CAboutDlg dlg;
    dlg.DoModal();

    GlobalDeleteAtom(GlobalAtom);
  }
}

void CTrayDlg::OnClosec()
{

  NOTIFYICONDATA tnid;
  tnid.cbSize=sizeof(NOTIFYICONDATA);
  tnid.hWnd=AfxGetMainWnd()->m_hWnd;
  tnid.uID=IDR_MAINFRAME;
  Shell_NotifyIcon(NIM_DELETE,&tnid);

  CDialog::OnClose();
  this->PostMessage(WM_CLOSE,0,0);

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值