vc将对话框缩小到托盘

本文介绍了如何在VC编程中实现将对话框窗口最小化到系统托盘区的功能,通过关键代码展示实现过程。
摘要由CSDN通过智能技术生成
一、托盘简介 


所谓的“托盘”,在Windows系统界面中,指的就是下面任务条右侧,有系统时间等等的标志的那一部分。在程序最小化或挂起时,但有不希望占据任务栏的时候,就可以把程序放到托盘区。其实,托盘区的编程很简单,下面简要阐述一下子喽^_^ 


二、托盘编程相关函数 


其实呢,把程序放到托盘上的本质就是先在托盘区绘制一个图标,然后把程序隐藏不见,再对托盘的图标进行消息处理,就可以了。 

绘制图标以及确定图标所传送消息的函数只有一个,那就是—————— 

WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage, 
PNOTIFYICONDATA pnid); 
这个函数呢,负责向系统传递消息,以添加、修改或删除托盘区的图标。她的返回值呢,是个布尔类型的。就是说,如果返回0,那就是成仁啦,非0才成功。 
参数dwMessage 是表示这个函数的应用功能是哪一方面,是添加、删除,还是修改图标。如果是添加,则它的值为NIM_ADD;删除则是NIM_DELETE;而修改是NIM_MODIFY。参数pnid就是具体的和程序在托盘区的图标有关系的结构了。它的定义如下: 

typedef struct _NOTIFYICONDATA { 
DWORD cbSize; 
HWND hWnd; 
UINT uID; 
UINT uFlags; 
UINT uCallbackMessage; 
HICON hIcon; 
char szTip[64]; 
} NOTIFYICONDATA, *PNOTIFYICONDATA; 


三、请看代码


void CMyDlg::ToTray()
{
	NOTIFYICONDATA nid;
	nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
	nid.hWnd=this->m_hWnd;
	nid.uID=IDR_MAINFRAME;
	nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;
	nid.uCallbackMessage=WM_SHOWTASK;//自定义的消息名称,消息映射用:ON_MESSAGE(WM_SHOWTASK,onShowTask)
	nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
	strcpy(nid.szTip,"程序正在工作");//信息提示条为“计划任务提醒”
	Shell_NotifyIcon(NIM_ADD,&nid);//在托盘区添加图标
	ShowWindow(SW_HIDE);//隐藏主窗口
}

LRESULT CMyDlg::onShowTask(WPARAM wParam,LPARAM lParam)
{
	if(wParam!=IDR_MAINFRAME)
		return 1;
	switch(lParam)
	{
	case WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个“关闭”
		{ 
			
			LPPOINT lpoint=new tagPOINT;
			::GetCursorPos(lpoint);//得到鼠标位置
			CMenu menu;
			menu.CreatePopupMenu();//声明一个弹出式菜单
			//增加菜单项“退出”,点击则发送消息WM_DESTROY给主窗口(已
			//隐藏),将程序结束。
			menu.AppendMenu(MF_STRING,WM_DESTROY,"退出"); 
			//确定弹出式菜单的位置
			SetForegroundWindow();//很重要,弹出菜单在失去焦点不能自动消失,这也是MSDN的官方解释
			menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x-120,lpoint->y-30,this);
			
			//资源回收
			HMENU hmenu=menu.Detach();
			menu.DestroyMenu();
			delete lpoint;
		}
		break;
	case WM_LBUTTONUP://单击恢复
		{
			this->ShowWindow(SW_SHOW);//显示主窗口
		}
		break;
	}
	return 0;
}

void CMyDlg::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
	ToTray();//调用
	//CDialog::OnClose();不注释就直接退出了
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值