【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);
}

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

时间: 2024-10-12 13:10:14

【VC编程技巧】窗体?3.7托盘程序介绍(模拟QQ消息)的相关文章

【VC编程技巧】窗体?3.5对单文档或者多文档程序制作启动画面

(一)概要: 文章描述了怎样通过Visual C++ 2012或者Visual C++ .NET,为单文档或者多文档程序制作启动画面.在Microsoft Visual Studio 6.0中对于单文档程序(SDI)我们可以很方便利用微软提供的组件Visual C++ Component (Splash Screen).因为在Microsoft Visual Studio 6.0以后的版本或者Visual C++ .NET没有提供这个组件,我们可以通过自定义对话框来实现Splash Screen

【VC编程技巧】窗体?3.6以渐变效果载入对话框

平时我们经常可以看到很多应用程序启动过程很酷,什么百叶窗,渐变,各种效果,今天我们看一下如何在程序中增加这种效果. 一.示例展示: 二.示例思路: 1.首先介绍两个知识,一个是函数MoveWindow(),一个是定时器.  函数MoveWindow():改变指定窗口的位置和大小.对顶窗口来说,位置和大小取决于屏幕的左上角;对子窗口来    说,位置和大小取决于父窗口客户区的左上角.函数原形如下: BOOL MoveWindow( HWND hWnd, int X, int Y, int nWi

【VC编程技巧】窗体?3.9静态窗口分割 (固定分割线)

上一章节说明了如何静态的分割窗口,分割后窗口的分割线是可以拖动的,有的时候我们需要固定分割线,那么如何实现固定分割呢? 我们需要构造出固定分割窗口类(CFixedSplitterWnd),来实现我们对窗口的固定分割,以上一章例来说明. 1.新创建MFC类,从CSplitterWnd继承,并重载WM_LBUTTONDOWN ,WM_MOUSEMOVE 和 WM_SETCURSOR消息响应函数. 2.新构造的CFixedSplitterWnd使用方法和CSplitterWnd一样. 通过MFC类向导

【VC编程技巧】窗体?3.8静态窗口分割

窗口分割在平时编成中用的特别多,Windows的资源管理器,编写代码的IDE(Visual Stdio,Eclipse)都有窗口分割,下面我们以单文档维例开始讲如何进行窗口分割! CSplitterWnd Class class CSplitterWnd : public CWnd CSplitterWnd类很方便的提供了窗口分割的功能,只需下面几步就能完成窗口分割: 定义CSplitterWnd对象在窗口框架类(CFrameWnd或者CMDIChildWnd)中: 重载框架类成员函数CFram

【VC编程技巧】窗体?3.4利用bitmap改变对话框的背景。

效果图: 代码: 1.在对话框初始化函数OnInitDialog中加载bitmap,然后创建新的画刷. // CBitmapDemoDlg メッセージ ハンドラー BOOL CBitmapDemoDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // "バージョン情報..." メニューをシステム メニューに追加します. // IDM_ABOUTBOX は.システム コマンドの範囲内になければなりません. ASSERT((IDM_ABOUT

【VC编程技巧】窗口?3.6以渐变效果加载对话框

平时我们常常能够看到非常多应用程序启动过程非常酷.什么百叶窗.渐变,各种效果,今天我们看一下怎样在程序中添加这样的效果. 一.演示样例展示: 二.演示样例思路: 1.首先介绍两个知识,一个是函数MoveWindow(),一个是定时器. ? 函数MoveWindow():改变指定窗体的位置和大小.对顶窗体来说,位置和大小取决于屏幕的左上角;对子窗体来    说,位置和大小取决于父窗体客户区的左上角.函数原形例如以下: BOOL MoveWindow( HWND hWnd, int X, int Y

【VC编程技巧】控件?4.1位图Button

4.1位图Button 给按钮增加位图,或改变按钮字体,可以让按钮达到跟炫的效果:如何给按钮增加位图,和改变按钮上文字的字体?请看下面示例! 1>创建对话框程序,建立如下对话框: 图1 资源ID说明: 左边按钮ID:IDC_BUTTON1 右边按钮ID:IDCANCEL 2>设置button属性,设置选项如下图箭头处: 图2 3>添加位图到工程,如下图箭头处: 图3 4>给左边按钮添加控件变量(利用类向导); CBitmapButton m_bitmapButton; ※如果类向导

【VC编程技巧】控件?4.4ListBox控件(打造带有复选框的ListBox)

4.4ListBox控件(打造带有复选框的ListBox) 下面通过两种方式构建复选框ListBox 1.对话框中插入ListBox控件(IDC_LIST1,IDC_LIST2),如下设置属性 图1 方式一: 2.对ListBox控件(IDC_LIST1)关联控件变量m_checkListBox1,将控件变量类型CListBox -> CCheckListBox(需要手动完成). //修改控件变量类型:CListBox -> CCheckListBox CCheckListBox m_chec

【VC编程技巧】控件?4.2自定义EDIT(只限字母字符输入)

4.2自定义EDIT 自定义button,自定义editbox可以使button和editbox更符合自己的需求.请看下面示例:只限字母字符输入的editbox建立. 1.了解函数CWnd::SubclassDlgItem BOOL SubclassDlgItem( UINT nID, CWnd* pParent ); 说明:调用这个函数可以"动态子类化"从对话框模板中创建出来的控件:并且将控件绑定在CWnd对象上. 参数: nID   控件的ID pParent  控件父层(一般是对