ITPub博客

首页 > 应用开发 > IT综合 > VC编制系统托盘的一种实现方法[习作]

VC编制系统托盘的一种实现方法[习作]

原创 IT综合 作者:mantian 时间:2005-09-22 11:58:11 0 删除 编辑

关键字:VC 系统托盘 Shell_NotifyIcon NOTIFYICONDATA

参考文献:MSDN www.vckbase.com

其实有人已经把这些东西写得很好,就是觉得自己再写一遍,能够加深自己的印象。

[@more@]

首先还是简单介绍一下Windows托盘区编程。只有Shell_NotifyIcon一个函数可用。他的功能就是Sends a message to the taskbar's status area. Shell_NotifyIcon的结构

BOOL Shell_NotifyIcon(

DWORD dwMessage,

PNOTIFYICONDATA lpdata

);

dwMessage可以取如下值(我只把需要的列出来,嘿,其他的看MSDN

NIM_ADD 添加图标

NIM_DELETE 删除图表

Lpdata 是一个指向NOTIFYICONDATA结构的指针。该结构包括处理图标的信息,回调函数,把鼠标放在上面能显示的提示信息等等。

具体操作的时候,只需要先定义NOTIFYICONDATA nc,然后把nc的结构填充满了。调用Shell_NotifyIcon就可以了。

好了,介绍完毕,下面是具体的详细步骤,我已经力图把它叙述得很清楚,如果你觉得我的步骤还比较不清楚,也可以向我索要全部代码。

1.首先创建一个但文档的工程。我的叫MyTest。在出现的对话框中右击-property –style,并把其中的maxmize boxminimize box勾上。

2.CMyTestDlg的头文件中(MyTestDlg.h)加入以下两个变量的声明:

BOOL m_bIsMinimized;

BOOL m_bIsFirstMinimized;

并且在构造函数中初始化

m_bIsMinimized = FALSE;

m_bIsFirstMinimized = FALSE;

3.在资源中添加一个菜单,ID为默认的就成

4.在Class Wizzard 中添加OnDestroy()消息映射函数。接下来我们需要重写他。

void CMyTestDlg::OnDestroy()

{

CDialog::OnDestroy();

NOTIFYICONDATA nc;

nc.cbSize = sizeof(NOTIFYICONDATA);

nc.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

nc.hWnd = m_hWnd;

nc.uCallbackMessage = WM_NOTIFYICON;

nc.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP ;

nc.uID = IDC_NOTIFYICON;

Shell_NotifyIcon(NIM_DELETE , &nc);

}

5.自己需要手工添加两个消息映射函数

定义消息

#define WM_NOTIFYICON (WM_USER+101)

#define IDC_NOTIFYICON (WM_USER+102)

#define WM_MINIMIZE (WM_USER+103)

CMyTestDlg的头文件中

//{{AFX_MSG(CMyTestDlg)

//以下两个需要手动添加

afx_msg void OnNotifyIcon(WPARAM wParam,LPARAM lParam);

afx_msg void OnMyMinimize();

//}}AFX_MSG

CMyTestDlg的实现文件中(CMyTestDlg.cpp

BEGIN_MESSAGE_MAP END_MESSAGE_MAP()中添加。

ON_MESSAGE(WM_MINIMIZE, OnMyMinimize)

ON_MESSAGE(WM_NOTIFYICON,OnNotifyIcon)

实现这两个函数就成了。

void CMyTestDlg::OnNotifyIcon(WPARAM wParam,LPARAM lParam)

{

UINT nID = (UINT)wParam;

UINT uMouseMsg = (UINT)lParam;

switch(uMouseMsg)

{

case WM_LBUTTONDBLCLK:

if(m_bIsMinimized = TRUE)

{

ShowWindow(SW_SHOW);

m_bIsMinimized = !m_bIsMinimized;

}

break;

case WM_RBUTTONDOWN:

CMenu menu;

CPoint curpos;

GetCursorPos(&curpos);

if(menu.LoadMenu(IDR_MENU1))

{

CMenu* pPopup;

pPopup = menu.GetSubMenu(0);

ASSERT(pPopup != NULL);

SetForegroundWindow();

pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,

curpos.x,curpos.y,AfxGetMainWnd());

}

}

}

void CMyTestDlg::OnMyMinimize()

{

if(m_bIsFirstMinimized == FALSE)

{

NOTIFYICONDATA nc;

nc.cbSize = sizeof(NOTIFYICONDATA);

nc.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

nc.hWnd = m_hWnd;

lstrcpy(nc.szTip,"最小化");

nc.uCallbackMessage = WM_NOTIFYICON;

nc.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP ;

nc.uID = IDC_NOTIFYICON;

Shell_NotifyIcon(NIM_ADD , &nc);

m_bIsFirstMinimized = TRUE;

}

ShowWindow(SW_HIDE);

m_bIsMinimized = TRUE;

}

6.将

void CMyTestDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

if(nID == SC_MINIMIZE)

OnMyMinimize();

else

CDialog::OnSysCommand(nID, lParam);

}

}

修改成这个模样。

这些就是如何实现啦,还有可以在菜单中实现退出,显示程序,以及加上个定时器,进而可以实现托盘的动画实现。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/559014/viewspace-806886/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 搞笑墓碑文
下一篇: 最近学习的体会
请登录后发表评论 登录
全部评论
  • 博文量
    49
  • 访问量
    1076686