谁能给我一个托盘区编程的小例子?越简单越好。

prettywolf 2002-12-01 03:48:49
...全文
91 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
用户 昵称 2003-03-18
  • 打赏
  • 举报
回复
// 激活主窗
void CEllipseWndDlg::OnActivewindow()
{
// 先删除图标
DeleteIcon();
// 显示主窗
ShowWindow(SW_SHOW);
UpdateWindow();
//这里必须也SetForegroundWindow();
}
AmiaBoy 2003-03-17
  • 打赏
  • 举报
回复
rivershan(笨猫)(MS MVP)(爱情失败者)介绍的不错!
rivershan 2002-12-01
  • 打赏
  • 举报
回复
使应用程序显示为任务条通知区中的图标

在Windows 95任务条的右边有一个区域被称为通知区域,在其中可以显示一些应
用程序的图标,用鼠标单击其中的图标一般能弹出应用程序的菜单,双击则能显示应
用程序的完整窗口界面。时钟和音量控制是任务条通知区最常见的图标。

任务条通知区编程可以通过Windows 95外壳编程接口函数Shell_NotifyIcon来实
现,该函数在shellapi.h头文件中声明,其原型如下:

WINSHELLAPI BOOL WINAPI Shell_NotifyIcon( DWORD dwMessage,
PNOTIFYICONDATA pnid);

dwMessage是对通知区图标进行操作的消息,主要有三种,如下表所示。

Shell_NotifyIcon使用的消息
消息说明 NIM_ADD

在任务条通知区插入一个图标
NIM_ DELETE

在任务条通知区删除一个图标
NIM_ MODIFY

对任务条通知区的图标进行修改
pnid传入一个NOTIFYICONDATA结构的指针。NOTIFYICONDATA结构声明及各域的意义表
示如下:

typedef struct _NOTIFYICONDATA { // nid
DWORD cbSize; // NOTIFYICONDATA结构的字节数
HWND hWnd; // 处理通知区图标消息的窗口句柄
UINT uID; // 通知区图标的ID
UINT uFlags; // 表示下述三项是否有意义的标志
UINT uCallbackMessage; // 鼠标点击图标所发出消息的ID
HICON hIcon; // 图标句柄
char szTip[64]; // 当鼠标移到图标上时显示的提示信息
} NOTIFYICONDATA, *PNOTIFYICONDATA;

当用Shell_NotifyIcon在任务条通知区中放置一个图标时,同时也定义了一条回
调消息,当用户用鼠标单击或双击图标时,NOTIFYICONDATA结构中指定的窗口句柄将
接受到该消息。该消息的lParam参数将说明鼠标操作的方式。当应用程序退出时,应
删除任务条中的图标。

下面的示例将说明如何使前述的椭圆窗口程序作为图标显示在任务条通知区中,
当鼠标单击图标时,将弹出一个菜单,当双击时,椭圆窗口将完整显示。

1. 用资源编辑器在EllipseWnd项目的IDR_MENU_CONTEXT菜单中增加一个菜单项“在
任务条中插入图标”(ID为IDM_INSERTICON)。

2. 用资源编辑器在EllipseWnd项目中增加一个菜单资源IDR_MENU_ICON ,在其中设
定三个菜单项:

“激活椭圆窗口”(ID为IDM_ACTIVEWINDOW)
“关于...”(ID为IDM_ABOUTBOX)
“退出 Alt+F4”(ID为IDM_EXIT)

3. 在CEllipseWndDlg.h源文件中定义一个消息UM_ICONNOTIFY用以响应图标操作,并
在CEllipseWndDlg类定义中增加响应该消息的处理函数OnIconNotify。用
ClassWizard增加响应菜单命令IDM_INSERTICON和IDM_ACTIVEWINDOW的函数定义和模
板。CEllipseWndDlg.h中的修改如下:

// 定义响应图标操作的消息
#define UM_ICONNOTIFY WM_USER+100

class CEllipseWndDlg : public CDialog
{
// Construction
public:
CEllipseWndDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data
//{{AFX_DATA(CEllipseWndDlg)
enum { IDD = IDD_ELLIPSEWND_DIALOG };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA

// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CEllipseWndDlg)

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation

protected:
HICON m_hIcon;
CRgn m_rgnWnd;
// 处理图标的功能函数说明
BOOL AddIcon();
BOOL DeleteIcon();

// Generated message map functions
//{{AFX_MSG(CEllipseWndDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
afx_msg void OnAboutbox();
afx_msg void OnExit();
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnDestroy();
afx_msg void OnInserticon();
afx_msg void OnActivewindow();
//}}AFX_MSG
// 图标消息的处理函数说明
afx_msg void OnIconNotify(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()
};

4. 在CEllipseWndDlg.cpp中增加消息影射条目如下:

BEGIN_MESSAGE_MAP(CEllipseWndDlg, CDialog)
//{{AFX_MSG_MAP(CEllipseWndDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_LBUTTONDOWN()
ON_WM_CONTEXTMENU()
ON_COMMAND(IDM_ABOUTBOX, OnAboutbox)
ON_COMMAND(IDM_EXIT, OnExit)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_COMMAND(IDM_INSERTICON, OnInserticon)
ON_COMMAND(IDM_ACTIVEWINDOW, OnActivewindow)
//}}AFX_MSG_MAP
ON_MESSAGE(UM_ICONNOTIFY, OnIconNotify)
END_MESSAGE_MAP()

5. 在CEllipseWndDlg.cpp中增加如下的函数或代码:

void CEllipseWndDlg::OnDestroy()
{
CDialog::OnDestroy();
// remove main window tag
::RemoveProp(m_hWnd, AfxGetApp()->m_pszExeName);
// 应用程序退出时,删除任务条中图标
DeleteIcon();
}

BOOL CEllipseWndDlg::AddIcon()
{
// 在任务条中增加图标
NOTIFYICONDATA nid;
nid.cbSize = sizeof(nid);
nid.hWnd = m_hWnd;
nid.uID = IDR_MAINFRAME;
nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
nid.uCallbackMessage = UM_ICONNOTIFY;
nid.hIcon = m_hIcon;
CString str = "椭圆窗口";
lstrcpyn(nid.szTip, (LPCSTR)str,
sizeof(nid.szTip) / sizeof(nid.szTip[0]));
return Shell_NotifyIcon(NIM_ADD, &nid);
}

BOOL CEllipseWndDlg::DeleteIcon()
{
// 删除任务条中的图标
NOTIFYICONDATA nid;
nid.cbSize = sizeof(nid);
nid.hWnd = m_hWnd;
nid.uID = IDR_MAINFRAME;
return Shell_NotifyIcon(NIM_DELETE, &nid);
}

// 响应图标消息处理函数
void CEllipseWndDlg::OnIconNotify(WPARAM wParam, LPARAM lParam)
{
switch ((UINT)lParam)
{

// 鼠标单击操作
case WM_LBUTTONDOWN:

case WM_RBUTTONDOWN:
{
// 装入图标操作菜单
CMenu menu;
menu.LoadMenu(IDR_MENU_ICON);
// 鼠标单击位置
CPoint point;
GetCursorPos(&point);
// 将背景窗口激活
SetForegroundWindow();
// 显示图标菜单
menu.GetSubMenu(0)->TrackPopupMenu(
TPM_LEFTBUTTON|TPM_RIGHTBUTTON,
point.x, point.y, this, NULL);
// 增加一个额外消息,使菜单操作正确
PostMessage(WM_USER, 0, 0);
break;
}
// 鼠标双击操作
case WM_LBUTTONDBLCLK:
// 激活应用程序
OnActivewindow();
break;
}
}

// 插入图标到任务条通知区
void CEllipseWndDlg::OnInserticon()
{
// 先隐藏主窗
ShowWindow(SW_HIDE);
// 插入图标
AddIcon();
}

// 激活主窗
void CEllipseWndDlg::OnActivewindow()
{
// 先删除图标
DeleteIcon();
// 显示主窗
ShowWindow(SW_SHOW);
UpdateWindow();
}
howkforth 2002-12-01
  • 打赏
  • 举报
回复
老兄
请讲得再明白一点好吗?
我没看懂
kingcom_xu 2002-12-01
  • 打赏
  • 举报
回复
http://www.codeproject.com/shell/systemtray.asp
approach 2002-12-01
  • 打赏
  • 举报
回复
http://personal.fj.cninfo.net/lmmweb/vc/sys/28.htm

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧