【VC编程技巧】窗体☞3.7托盘程序介绍(模拟QQ消息)


所谓的托盘程序就是运行时在系统托盘区(就是桌面右下角显示时间的区域)出现一个小图标的程序。代表它运行的图标称作托盘图标。我们可以通过使用小图标来控制应用程序的状态。

 

(一)NOTIFYICONDATA Structure

 

typedef struct _NOTIFYICONDATA {

    DWORDcbSize;//结构体大小

    HWNDhWnd;//接受icon消息的窗口句柄

    UINT uID;//icon图标的资源Id

    UINTuFlags;//标志一些成员是否有效

    UINTuCallbackMessage;//自定义消息

    HICONhIcon;//资源icon句柄

    TCHARszTip[64];//鼠标移动到icon上,提示消息

    DWORDdwState;//图标的状态

    DWORDdwStateMask;//图标状态的有效

    TCHARszInfo[256];//气泡消息

    union {

        UINTuTimeout;

        UINTuVersion;

    };

    TCHARszInfoTitle[64];//气泡消息标题

    DWORDdwInfoFlags;//气泡消息标志位

    GUIDguidItem;//win7以前保留字段,以后标识icon的guid

    HICONhBalloonIcon;//自定义气泡消息icon

} NOTIFYICONDATA, *PNOTIFYICONDATA;

 

(二)函数:BOOLShell_NotifyIcon(DWORD dwMessage,

   PNOTIFYICONDATA lpdata);

   

     参数

     dwMessage:表示函数行为

             NIM_ADD:表示添加icon到状态栏

             NIM_DELETE:删除icon从状态栏

             NIM_MODIFY:修改icon在状态栏

     lpdata:上述结构体NOTIFYICONDATA

 


(三)模拟QQ消息示例

 



 

 

示例代码:

1.初始化函数OnInitDialog()中,初始化icon图标,添加icon到托盘中,设置定时期去更新托盘中的icon图标。

// CTrayProgramDlg 消息处理程序

BOOL CTrayProgramDlg::OnInitDialog()
{
        ...
	// TODO: 在此添加额外的初始化代码
	
	//初始化icon信息
	InitIcon();
	//应用程序添加到托盘
	AddToTray();
	//设置并启动定时器
	SetTimer(1, 500, NULL);

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}


2.初始化icon图标函数,添加icon图标到托盘函数和更新icon图标函数

void CTrayProgramDlg::InitIcon(void)
{
	m_isUpadate = 0x00;
	m_hIcon1 = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON1));
}

//添加icon到托盘
void CTrayProgramDlg::AddToTray(void)
{
	ZeroMemory(&m_nid, sizeof(m_nid));
	m_nid.cbSize = sizeof(NOTIFYICONDATA);
	m_nid.hWnd = m_hWnd;
	m_nid.uID = IDI_ICON1;
	m_nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP|NIF_INFO;
	m_nid.uCallbackMessage = WM_TRAYNOTIFY;
	m_nid.hIcon = m_hIcon1;
	m_nid.dwInfoFlags = NIIF_INFO;
	m_nid.uVersion = NOTIFYICON_VERSION_4;

	lstrcpy(m_nid.szTip, _T("心"));
	lstrcpy(m_nid.szInfo, _T("愿得一人心,白首不相离!"));
	lstrcpy(m_nid.szInfoTitle, _T("白头吟"));
	
	//在托盘添加图标
	Shell_NotifyIcon(NIM_ADD, &m_nid);
	
}
//更新托盘icon
void CTrayProgramDlg::UpdateIcon(void)
{
	m_nid.uFlags = NIF_ICON;
    Shell_NotifyIcon(NIM_MODIFY, &m_nid);
}


3.定时器相应函数

void CTrayProgramDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: ここにメッセージ ハンドラー コードを追加するか、既定の処理を呼び出します。
	if (nIDEvent == 1)
	{
		if (m_isUpadate ^= 0x01 )
		{
			//将图标句柄设为0
			m_nid.hIcon = 0;	
		}
		else
		{
			//将图标句柄还原
			m_nid.hIcon = m_hIcon1;
		}
		//更新icon图标
		UpdateIcon();	
	}
	
	CDialogEx::OnTimer(nIDEvent);
}

P.S文章示例代码:
http://download.csdn.net/detail/chenjintaoxp/7693189

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值