首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 软件教学-> 其他工具
把最小化图标放到任务栏右下角_visualbasic教程
作者:网友供稿 点击:0
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
----目前有不少Win95应用程序在最小化后,代表该程序的小图标就会隐藏在屏幕的右下角(即任务栏的右边),如“金山词霸”、“东方快车”等,而我们用VisualBasic编制的程序在最小化后,图标却总是出现在任务栏的中央,并且占据较大的空间。如何让我们自己的程序也能将最小化图标放在任务栏的右边呢?我们可以通过WindowsAPI函数调用来实现该功能。

一、如何添加和隐藏图标
----在Windows的动态连接库Shell32.dll中有一个名为Shell_NotifyIconA的WindowsAPI函数,其功能是对任务栏的右下角图标进行操作,包括添加、删除和修改。Shell_NotifyIconA函数的VB声明格式如下:
----DeclareFunctionShell_NotifyIconALib"SHELL32"(ByValdwMessageAsLong,lpDataAsNOTIFYICONDATA)AsIntegerShell_NotifyIconA有两个参数DwMessage和lpData。DwMessage为操作图标的方式,可能的取值和含义如下:

----0(向任务栏添加图标)
----1(修改任务栏中的图标)
----2(删除任务栏中的图标)

----lpData是自定义数据类型NOTIFYICONDATA的数据,该自定义数据结构由以下成员构成:

----1.cbSize:需填写NOTIFYICONDATA数据结构的长度,在使用时可通过VB的标准函数Len来计算,如nid为NOTIFYICONDATA类型的变量,则cbSize为Len(nid)。

----2.hWnd:最小化窗体的句柄。

----3.uID:使用者为图标所设定的ID,可自定。

----4.uFlags:用来设定后面三个成员(uCallbackMessage、hIcon、szTip)是否有效,等于1时为uCallbackMessage有效,将来使用者在图标上按下鼠标键时,Windows会发出消息给窗体程序;等于2时为hIcon有效,表示要显示图标(如果不显示图标,用户只是无法看见图标,但仍然可在任务栏的图标应该出现的位置上操作);等于4时为szTip有效,当用户将鼠标指针放在图标上时,要显示提示信息,否则不显示。通常将uFlags设定成7(即1+2+4),表示全部有效。

----5.uCallbackMessage:当用户在图标上按下鼠标按键时,Windows发给应用程序的消息编号。

----6.hIcon:图标句柄。

----7.szTip:当用户将鼠标指针放在图标上时显示的提示信息。

----在调用Shell_NotifyIconA函数之前,必须将NOTIFYICONDATA类型变量的以上各成员填写正确的内容。

----该函数如果调用成功则返回1,否则返回0。

----了解了Shell_NotifyIconA函数的功能和用法后,我们可以很容易地将图标添加在任务栏的右边,或者从任务栏上将图标删除。

----如:假设我们事先声明了一个NOTIFYICONDATA型的变量nid,且已经给它的所有成员赋予了合适的值,那么,下面的两条语句分别可完成添加和删除图标的任务:

Shell_NotifyIconA(0,nid)  添加图标
Shell_NotifyIconA(2,nid)删除图标

二、如何响应鼠标按键
----按照上面的方法,我们可以将最小化后的图标放在任务栏的右边,那么当我们在该图标上按下鼠标按键时会发生什么事情呢?很遗憾,什么也没有发生,最小化的窗体不会象我们希望的那样恢复正常显示状态。
----这时怎么回事呢?很简单,前面我们只是将图标添加到了任务栏上,而并没有对鼠标事件做任何的工作,为了对鼠标按键作出响应,我们还有一些事情要做。

----前面已经说过,如果将将NOTIFYICONDATA类型变量的成员uFlags设定为1,则当用户在图标上按下鼠标按键时,Windows会将编号为uCallbackMessage的消息发送到应用程序,因此,为了能响应鼠标事件,我们必须在程序中对该消息进行处理。

----需要注意的是,由于Windows自身的消息处理机制的限制,我们无法直接干预Windows的自身消息处理过程,所以只有采用一种类似于从前DOS环境下截获中断的“曲线救国“的方法来处理消息,过程是:

----在窗体最小化后,立即读取该窗体原消息处理过程的地址并记录在一个全局变量中,方法是调用WindowsAPI函数GetWindowLong,其声明如下:

----DeclareFunctionGetWindowLongLib"user32"Alias"GetWindowLongA"(ByValhWndAsLong,ByValnIndexAsLong)AsLong其中hWnd为窗体句柄,nIndex为过程类型,这里为-4(Windows默认过程)。

----(2)编写自己的消息处理过程,注意参数的数量和类型必须按照下面的格式(过程名可随意):

----SubWndProcForIcon(ByValhWndAsLong,ByValMsgAsLong,ByValwParamAsLong,ByVallParamAsLong)

----(3)将自己的消息处理过程设置为默认的消息处理程序,方法是调用WindowsAPI函数SetWindowLong,其声明如下:

----DeclareFunctionSetWindowLongLib"user32"Alias"SetWindowLongA"(ByValhWndAsLong,ByValnIndexAsLong,ByValdwNewLongAsLong)AsLong

----其中hWnd与nIndex含义同上,dwNewLong为自定义过程的地址,可使用VB的求地址运算符AddressOf得到,如AddressOfWndProcForIcon可得到自定义过程WndProcForIcon的地址。

----(4)当鼠标事件发生后,自己的消息处理过程(现在已成为默认的消息处理过程)首先进行处理,一般是根据按键将窗体恢复或弹出一个PopUp菜单供用户选择。

----(5)让Windows去执行原消息处理过程(该过程的地址由全局变量保存),方法是调用WindowsAPI函数CallWindowProc,其声明如下:

----DeclareFunctionCallWindowProcLib"user32"Alias"CallWindowProcA"(ByVallpPrevWndFuncAsLong,ByValhWndAsLong,ByValMsgAsLong,ByValwParamAsLong,ByVallParamAsLong)AsLong

----其中lpPrevWndFunc为原消息处理程序的地址,其它参数与自定义消息处理过程中的参数相对应。

----细心的读者一定会发现,如果在上述第3步完成后,没有进行第5步,即:使用setWindowLong改变了原先消息处理程序的地址,却没有在程序结束前将地址设定回来,那程序将不会正常结束,往往会造成死机,因此,程序中一定要小心处理这个问题。

----另外,为了正确的处理消息,还有一个问题需要解决,就是如何识别消息是否是由图标发出的?这一点可以这样解决:利用一个全局变量记录下NOTIFYICONDATA型变量的成员uCallbackMessage(消息号)的值,然后在消息处理程序中检查Windows传回的消息号(MsgNo)是否与其一致,如果一致,则说明消息的确是由图标发出的,应该进行处理,否则即可忽略。如本文后面的程序实例就用全局变量IconMsg来实现这一功能(具体请参照程序代码)。

三、程序实例
----下面,我们通过一个简单的实例来实现上述方法:
----1、窗体布局

----新建一个工程IconTest,新建一个标准窗体frmIconTest,在窗体上放置三个命令按钮,名称(Name)分别为cmdCreateIcon、cmdNormalMin和cmdExit,标题(Caption)分别为“最小化到右下角”、“普通最小化”和“退出”。

----2、代码

----添加一个模块modIconTest,在其中编写如下的代码:

OptionExplicit
定义常量
PublicConstGWL_WNDPROC=(-4)
PublicConstWM_LBUTTONDOWN=&H201
PublicConstNIM_ADD=0
PublicConstNIM_DELETE=2
PublicConstNIF_MESSAGE=1
PublicConstNIF_ICON=2
PublicConstNIF_TIP=4
定义全局变量
PublicIconMsgAsLong消息编号
PublicOldWinProcAsLong原消息处理程序的地址
定义自定义数据类型
PublicTypeNOTIFYICONDATA
cbSizeAsLong
hWndAsLong
uIDAsLong
uFlagsAsLong
uCallbackMessageAsLong
hIconAsLong
szTipAsString*64
EndType
WindowsAPI函数声明
DeclareFunctionCallWindowProcLib"user32"Alias
"CallWindowProcA"(ByVallpPrevWndFuncAsLong,
ByValhWndAsLong,ByValMsgAsLong,ByVal
wParamAsLong,ByVallParamAsLong)AsLong
DeclareFunctionGetWindowLongLib"user32"
Alias"GetWindowLongA"(ByValhWndAsLong,
ByValnIndexAsLong)AsLong
DeclareFunctionSetWindowLongLib"user32"Alias
"SetWindowLongA"(ByValhWndAsLong,ByValnIndex
AsLong,ByValdwNewLongAsLong)AsLong
DeclareFunctionShell_NotifyIconALib"SHELL32"(ByVal
dwMessageAsLong,lpDataAsNOTIFYICONDATA)AsInteger
自定义消息处理程序
SubMyProc(ByValhWndAsLong,ByValMsgAsLong,
ByValwParamAsLong,ByVallParamAsLong)
根据Msg判断,消息是否是图标发出的,
如果是,再进行处理
IfMsg=IconMsgThen
IflParam=WM_LBUTTONDOWNThen
frmIconTest.Show如果在图标上按
下了左键则显示窗体
EndIf
EndIf
执行全程变量OldWinProc记录的原
消息处理程序的地址中的消息处理程序
CallWindowProcOldWinProc,hWnd,Msg,wParam,lParam
EndSub
在frmIconTest的窗体模块中编写如下代码:
OptionExplicit
DimHadAddAsBoolean
DimnidAsNOTIFYICONDATA
PrivateSubcmdEnd_Click()
IfHadAddThen
如果曾向右下角添加过小图标
则根据事先记录的OldWinProc
恢复原来的消息处理程序,并删除图标
SetWindowLongfrmIconTest.hWnd,
GWL_WNDPROC,OldWinProc
CallShell_NotifyIconA(NIM_DELETE,nid)
删除图标
EndIf
UnloadMe卸载窗体
EndSub
PrivateSubcmdCreateIcon_Click()
IfNotHadAddThen
如果没有产生过图标,则添加图标到右下角
Withnid
以下填写nid变量的所有成员
.cbSize=Len(nid)填写自定义数据类型的长度
.hWnd=frmIconTest.hWnd填写窗体的句柄
.uID=9999图标的Id,可随意
允许显示图标、提示并产生消息
.uFlags=NIF_ICON NIF_TIP NIF_MESSAGE
.hIcon=frmIconTest.Icon.Handle图标句柄
.szTip="单击鼠标左键恢复窗体!"提示信息
.uCallbackMessage=2图标的消息号
EndWith
Shell_NotifyIconANIM_ADD,nid添加图标
IconMsg=nid.uCallbackMessage
用全局变量记录消息号,
读取frmIconTest正常的消息处理程序
的地址保存在全程变量OldWinProc中
OldWinProc=GetWindowLong(frmIconTest.hWnd,
GWL_WNDPROC)
用自定义过程MyProc的地址
代替正常消息处理程序的地址
SetWindowLongfrmIconTest.hWnd,
GWL_WNDPROC,AddressOfMyProc
frmIconTest.Hide隐藏窗体
HadAdd=True置“已经添加图标”标志
Else
frmIconTest.Hide如果已经有小图标了,
则直接隐藏窗体
EndIf
EndSub
PrivateSubcmdNormalMin_Click()
frmIconTest.WindowState=1普通最小化窗体
EndSub
PrivateSubForm_Load()
HadAdd=False将“是否添加了图标的标志”置为False
下面为窗体装载图标,读者应当根据自己的VB目录而定
frmIconTest.Icon=oadPicture("c:\MyIcon\files10.ico")
EndSub

----按下F5,执行本程序,单击“最小化到右下角”按钮,窗体将消失,同时任务栏的右边出现代表窗体的图标(如图2),在该图标上单击鼠标左键,窗体恢复正常。再单击“普通最小化图标”按钮,你会看到窗体虽然也消失了,但最小化图标在任务栏的中间,即普通位置(如图3)。

----本程序用VB5编制,在Pwin95下调试正常。->


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·用javascript调用webservice(webservice behavior)-ASP教程,ASP应用
·Java中对文件的操作-JSP教程,Java技巧及代码
·VB.net进阶:VB.net下的Sniffer-.NET教程,VB.Net语言
·如何利用VB.NET修改系统时间-.NET教程,VB.Net语言
·电源技术与电子变压器
·解析几种有效开关电源电磁干扰抑制
·教你完全卸载智能abc输入法
·电源系统中多个子系统之间电磁兼容
·ASP.net 2.0 自定义控件的开发之数据分页 第一章-.NET教程,Asp.Net开发
·VS2005新控件之GridView 使用高级技巧系列[二][视频]-.NET教程,评论及其它
最新文章
·3000ip以下网站该如何赚钱_网赚技巧
·谈谈我的下载站日ip5000 月收入3000的经验_站长心得
·photoshop绘制逼真的自然背景:山间瀑布_photoshop教程
·删掉系统文件 让windows vista少占用我们的硬盘_windows vista
·突出网页内重要内容保证adsense匹配准确_网赚技巧
·借台电脑办网站—访深圳外来工站长姚永卫_站长访谈
·创建优秀网站的6个好习惯_站长心得
·做一个网站 营造氛围有多重要?_站长心得
·如何让网民爱上你的网站?(3)_站长心得
·专家支招域名安全“三原则”有效规避域名掠夺_站长心得
相关主题
西部数码虚拟主机

友情链接
CNNIC 西部数码
万网 自助建站
虚拟主机 asp空间
域名注册 域名
域名申请 主页空间
论坛空间 网站空间
国际域名 虚拟空间
空间租用 DDOS防火墙
成都主机托管 四川主机托管
主机租用 服务器租用
网站目录 自助建站
虚拟主机 网址大全
软件下载
自助链接
虚拟主机资讯 特价虚拟主机
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
发表评论 打印  刷新     关闭