托盘编程全接触C言语教程-C / C++-优质IT资源分享社区

admin
管理员
管理员
  • UID1
  • 粉丝30
  • 关注4
  • 发帖数581
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:313回复:0

  托盘编程全接触C言语教程

楼主#
更多 发布于:2016-05-31 16:37

所谓的“托盘”,在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;

下面就对该构造各个参数进行刨析:

cbSize :

构造的长度,用“位”来做单位。通常在程序中,咱们用(DWORD)sizeof(NOTIFYICONDATA) 给它赋值。

HWnd :

一个句柄,假如对托盘中的图标进行操作,相应的音讯就传给这个句柄所代表的窗口。天然了,大多数情况下是this->m_hWnd喽。

uID : 在工程中界说的图标ID

uFlags : 这个成员象征着别的哪些成员的数据是有用的,别离为NIF_ICON,

NIF_MESSAGE, NIF_TIP,别离代表着数据有用的成员是hIcon, uCallbackMessage,

szTip。当然,三个值可以用“|”联系到一同。下面别离对涉及到的成员进行论述

hIcon : 要添加,删除或修正的图标句柄。假如只知道个uID,

通常可能会用函数LoadIcon来得到句柄。例如LoadIcon ( AfxGetInstanceHandle() ,MAKEINTRESOURCE

(IDR_MAINFRAME) )。

uCallbackMessage :

这在对托盘区的操作中,是对比主要的数据成员。这是个音讯象征,当用鼠标对托盘区相应图标进行操作的时分,就会传递音讯给Hwnd所代表的窗口。所以说,在uFlags中,通常都得象征它有用。这儿通常都是自界说的音讯。

szTip : 鼠标移动到托盘图标上时的提示文字。

三、托盘编程比如

有关托盘编程的基础知识呢,也就上面这些了。下面呢,咱们就进入详细的实战演练期间,举几个托盘编程的比如瞧瞧,加深了解。

1、将程序最小化到体系托盘区的函数toTray()。

void CTimeWakeDlg::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;//自界说的音讯称号

nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));

strcpy(nid.szTip,"计划使命提示");//信息提示条为“计划使命提示”

Shell_NotifyIcon(NIM_ADD,&nid);//在托盘区添加图标

ShowWindow(SW_HIDE);//躲藏主窗口

}

这是个很简略的函数,里边首先给NOTIFYICONDATA赋值,然后调用shell_NotifyIcon,

头一个参数是NIM_ADD,表明添加。然后用函数ShowWindow 躲藏主窗口,这么,就完成了将程序最小化到体系托盘区的使命了。

2、程序现已最小化到托盘区了,可是呢,对托盘图标的操作怎么进行呢?这就表现了构造NOTIFYICONDATA的成员uCallbackMessage

的效果了。它所供给的效果即是,当用户用鼠标点击托盘区的图标的时分(无论是左键仍是右键),会向hWnd所代表的窗口传送音讯,假如是上例,音讯的称号即是WM_SHOWTASK。依据VC的音讯机制,对自界说音讯添加音讯响应函数。

在头文件的//pw_AFX_MSG和//AFX_MSG之间声明音讯响应函数:

afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM

lParam);

然后在CPP文件中添加音讯映射。在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP

之间参加: ON_MESSAGE(WM_SHOWTASK,onShowTask)将音讯和音讯响应函数映射起来。

然后即是在CPP文件中参加函数onShowTask的完成了:

LRESULT CTimeWakeDlg::onShowTask(WPARAM

wParam,LPARAM lParam)

//wParam接纳的是图标的ID,而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,"封闭");

//断定弹出式菜单的方位

menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);

//资源收回

HMENU hmenu=menu.Detach();

menu.DestroyMenu();

delete lpoint;

}

break;

case WM_LBUTTONDBLCLK://双击左键的处理

{

this->ShowWindow(SW_SHOW);//简略的显现主窗口完事儿

}

break;

}

return 0;

}

优质IT资源分享社区为你提供此文。

本站有大量优质C、C++教程视频,资料等资源,包含C,C++基础教程,高级进阶教程等等,教程视频资源涵盖传智播客,极客学院,达内,北大青鸟,猎豹网校等等IT职业培训机构的培训教学视频,价值巨大。欢迎点击下方链接查看。

C、C++教程视频

优质IT资源分享社区(www.itziyuan.top)
一个免费,自由,开放,共享,平等,互助的优质IT资源分享网站。
专注免费分享各大IT培训机构最新培训教学视频,为你的IT学习助力!

!!!回帖受限制请看点击这里!!!
!!!资源失效请在此版块发帖说明!!!

[PS:按 CTRL+D收藏本站网址~]

——“优质IT资源分享社区”管理员专用签名~

本版相似帖子

游客