Michael's Space

Technology changes the world, serves the people.
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
如何实现模式对话框程序启动时的系统栏显示
Michael Wednesday, December 13, 2006

在实际工作中,需要用到一些类似状态监控的程序,它们往往在一启动时就要最小化到系统栏上.
这里涉及到两个问题:1)如何在启动时隐藏主窗口; 2)用托盘实现系统栏显示.
模式对话框和非模式对话框的区别在于是否自身拥有一个消息循环,对于模式对话框程序,要实现程序启动时的隐藏,一个比较完美(无闪烁地隐藏)的做法如下
 1BOOL CMyApp::InitInstance()
 2
{
 3  // 

 4
 5  CMyDlg* pDlg = new CMyDlg;
 6  if (pDlg->Create(IDD_MY_DIALOG)) 
{
 7    m_pMainWnd =
 pDlg;
 8
    Run();
 9    if (pDlg) 
{
10
      delete pDlg;
11      pDlg =
 NULL;
12    }

13  }

14  return FALSE;
15}

这里使用CWnd::Create()函数来创建一非模式对话框,同时添加了消息循环的处理Run(). 因为pDlg(属性为非visible)并没有调用ShowWindow(),所以创建后为隐藏状态.

关于托盘的显示只要调用WINDOWS的SHELL API即可.
以下代码用于添加一托盘:
1        NOTIFYICONDATA nc;
2    nc.cbSize=sizeof(NOTIFYICONDATA);
3    nc.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
4    nc.hWnd=m_hWnd;
5    lstrcpy(nc.szTip,"Hi!");
6    nc.uCallbackMessage=WM_NC;
7    nc.uFlags=NIF_ICON | NIF_MESSAGE | NIF_TIP;
8    nc.uID=IDC_NC;
9    Shell_NotifyIcon(NIM_ADD,&nc);

以下代码用于删除一托盘:
1        NOTIFYICONDATA nc;
2    nc.cbSize=sizeof(NOTIFYICONDATA);
3    nc.hWnd=m_hWnd;
4    nc.uCallbackMessage=WM_NC;
5    nc.uFlags=NIF_ICON | NIF_MESSAGE | NIF_TIP;
6    nc.uID=IDC_NC;
7    Shell_NotifyIcon(NIM_DELETE,&nc);

托盘图标的消息定义及响应函数如下:
//定义消息码
#define  WM_NC  1001
#define  IDC_NC 1002

//定义消息映射
ON_MESSAGE(WM_NC,OnNc)

//定义消息处理函数声明
afx_msg void OnNc(WPARAM wParam,LPARAM IParam);

//定义消息处理函数实现
 1void CMyDlg::OnNc(WPARAM wParam,LPARAM IParam)
 2{
 3    if ((IParam == WM_LBUTTONDOWN) || (IParam == WM_RBUTTONDOWN))
 4    {
 5        CMenu menu;
 6        menu.LoadMenu(IDR_MENU1);
 7        CMenu* pPopup=menu.GetSubMenu(0);
 8        ::SetMenuDefaultItem(pPopup->m_hMenu,0,TRUE);
 9        CPoint Point;
10        GetCursorPos(&Point);
11        pPopup->TrackPopupMenu(TPM_LEFTALIGN,Point.x,Point.y,AfxGetMainWnd(),NULL);
12    }

13}

最后很关键的是,因为我们采用了非模式框来隐藏窗口,当对话框退出后,我们需要调用PostQuitMessage()来发送WM_QUIT消息给应用程序从而结束消息循环退出整个程序.

[全文完]

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理