收藏 分销(赏)

VB最小化编程.docx

上传人:xrp****65 文档编号:6416505 上传时间:2024-12-08 格式:DOCX 页数:36 大小:35.72KB 下载积分:10 金币
下载 相关 举报
VB最小化编程.docx_第1页
第1页 / 共36页
VB最小化编程.docx_第2页
第2页 / 共36页


点击查看更多>>
资源描述
要实现窗口最小化必须满足以下条件:  1:按下最小化按钮,窗体不可见  2:最小化后,最小化窗体的图标必须出现在任务栏的通知区域中  3:当双击通知区域中的图标时,窗体又显示出来,同时通知区域中的图标消失.  要满足上面的条件:  1:首先屏蔽窗体中系统自带的最小化图标,即Form.MinButton=False  2:声明1个API函数:  Public Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias " Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long  注意:上面这个API函数在XP中没有别名,将别名去掉后为:  Public Declare Function Shell_NotifyIcon Lib "shell32.dll"(ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long  3:声明7个常数:  Public Const NIM_ADD = &H0  Public Const NIM_DELETE = &H2  Public Const NIF_ICON = &H2  Public Const NIF_MESSAGE = &H1  Public Const NIF_TIP = &H4  Public Const WM_MOUSEMOVE = &H200  Public Const WM_LBUTTONDBLCLK = &H203  4:定义1个NOTIFYICONDATA类型  Public Type NOTIFYICONDATA  cbSize as Long  hWnd as Long  uId as Long  uFlags as Long  uCallBackMessage as Long  hIcon as Long  szTip as String  End Type  5:声明一个nid的类型  Public nid as NOTIFYICONDATA  思路清晰后,开始编写代码  1:在窗体中画1个Command,它的Caption属性为:"最小化"  2:将窗体Form的MinButton的属性设为:"False"  3:在窗体中添加1个模块,模块中的代码为:  Public Declare Function Shell_NotifyIcon Lib "shell32.dll"(ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long  Public Const NIM_ADD = &H0  Public Const NIM_DELETE = &H2  Public Const NIF_ICON = &H2  Public Const NIF_MESSAGE = &H1  Public Const NIF_TIP = &H4  Public Const WM_MOUSEMOVE = &H200  Public Const WM_LBUTTONDBLCLK = &H203  Public Type NOTIFYICONDATA  cbSize as Long  hWnd as Long  uId as Long  uFlags as Long  uCallBackMessage as Long  hIcon as Long  szTip as String  End Type  Public nid as NOTIFYICONDATA  4:编写Command的单击事件:  Private Sub Command1_Click()  nid.cbSize = Len(nid)  nid.uId = vbNull  nid.hWnd = Me.hWnd  nid.uFlags = NIF_TIP Or NIF_MESSAGE Or NIF_ICON  nid.uCallBackMessage = WM_MOUSEMOVE  nid.hIcon = Me.Icon  nid.szTip = "窗体最小化"  Shell_NotifyIcon NIM_ADD, nid  Me.Hide  End Sub  5:编写窗体的MouseMove事件:  Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)  Dim msg As Long  msg = X / 15  If msg = WM_LBUTTONDBLCLK Then  Me.Show  Shell_NotifyIcon NIM_DELETE, nid  End If  End Sub  按F5启动,单击Command,看看通知区域中是不是多了个窗体的图标?双击该图标,窗体又显示出来了! 一、Shell_NotifyIcon 函数说明   此函数用来向任务栏托盘区域发送消息   1、函数格式   BOOL Shell_NotifyIcon( DWORD dwMessage,PNOTIFYICONDATA lpdata);   2、参数说明:   dwMessage为输入参数,传递发送的消息,表明要执行的操作。可选的值如下:   NIM_ADD   向托盘区域添加一个图标。此时第二个参数lpdata指向的NOTIFYICONDATA结构体中的hWnd和uID成员用来标示这个图标,以便以后再次使用Shell_NotifyIcon对此图标操作。   NIM_DELETE   删除托盘区域的一个图标。此时第二个参数lpdata指向的NOTIFYICONDATA结构体中的hWnd和uID成员用来标示需要被删除的这个图标。   NIM_MODIFY   修改托盘区域的一个图标。此时第二个参数lpdata指向的NOTIFYICONDATA结构体中的hWnd和uID成员用来标示需要被修改的这个图标。   NIM_SETFOCUS   Version 5.0. 设置焦点。比如当用户操作托盘图标弹出菜单,而有按下ESC键将菜单消除后,程序应该使用此消息来将焦点设置到托盘图标上。   NIM_SETVERSION   Version 5.0. 设置任务栏按照第二个参数lpdata指向的NOTIFYICONDATA结构体中的uVersion成员指定的版本号来工作。此消息可以允许用户设置是否使用基于Windows2000的version 5.0的风格。uVersion的缺省值为0,默认指明了使用原始Windows 95图标消息风格。具体这两者的区别请参考msdn中的Shell_NotifyIcon函数说明的Remarks。   lpdata为输入参数,是指向NOTIFYICONDATA结构体的指针,结构体内容用来配合第一个参数wMessage进行图标操作。   3、返回值   如果图标操作成功返回TRUE,否则返回FALSE。   如果dwMessage参数设为NIM_SETVERSION,则如果版本设置成功返回TRUE,如果设置的版本不支持返回FALSE。 [编辑本段] 二、NOTIFYICONDATA 结构体说明   包含系统需要的用来传递托盘区域消息的信息。   1、格式   typedef struct _NOTIFYICONDATA {   DWORD cbSize;   HWND hWnd;   UINT uID;   UINT uFlags;   UINT uCallbackMessage;   HICON hIcon;   TCHAR szTip[64];   DWORD dwState;   DWORD dwStateMask;   TCHAR szInfo[256];   union {   UINT uTimeout;   UINT uVersion;   };   TCHAR szInfoTitle[64];   DWORD dwInfoFlags;   GUID guidItem;   } NOTIFYICONDATA, *PNOTIFYICONDATA;   2、成员说明:   cbSize   结构体的大小,以字节为单位。   hWnd   窗口的句柄。标示的窗口用来接收与托盘图标相关的消息。Shell_NotifyIcon函数调用时,hWnd和uID成员用来标示具体要操作的图标。   uID   应用程序定义的任务栏图标的标识符。Shell_NotifyIcon函数调用时,hWnd和uID成员用来标示具体要操作的图标。通过将多次调用,你可以使用不同的uID将多个图标关联到一个窗口hWnd。   uFlags   此成员表明具体哪些其他成员为合法数据(即哪些成员起作用)。此成员可以为以下值的组合:   NIF_ICON   hIcon成员起作用。   NIF_MESSAGE   uCallbackMessage成员起作用。   NIF_TIP   szTip成员起作用。   NIF_STATE   dwState和dwStateMask成员起作用。   NIF_INFO   使用气球提示代替普通的工具提示框。szInfo, uTimeout, szInfoTitle和dwInfoFlags成员起作用。   NIF_GUID   保留。   uCallbackMessage   应用程序定义的消息标示。当托盘图标区域发生鼠标事件或者使用键盘选择或激活图标时,系统将使用此标示向由hWnd成员标示的窗口发送消息。消息响应函数的wParam参数标示了消息事件发生的任务栏图标,lParam参数根据事件的不同,包含了鼠标或键盘的具体消息,例如当鼠标指针移过托盘图标时,lParam将为WM_MOUSEMOVE。   hIcon   增加、修改或删除的图标的句柄。注意,windows不同版本对于图标有不同要求。Windows XP可支持32位。   szTip   指向一个以\0结束的字符串的指针。字符串的内容为标准工具提示的信息。包含最后的\0字符,szTip最多含有64个字符。   对于Version 5.0 和以后版本,szTip最多含有128个字符(包含最后的\0字符)。   dwState   Version 5.0,图标的状态,有两个可选值,如下:   NIS_HIDDEN   图标隐藏   NIS_SHAREDICON   图标共享   dwStateMask   Version 5.0. 指明dwState成员的那些位可以被设置或者访问。比如设置此成员为NIS_HIDDEN,将导致只有hidden状态可以被获取。   szInfo   Version 5.0. 指向一个以\0结束的字符串的指针。字符串的内容为气球提示内容。最多含有255个字符。如果要移除已经存在的气球提示信息,设置uFlags成员为NIF_INFO,同时将szInfo设为空。   uTimeout   和uVersion成员为联合体。uTimeout表示气球提示超时的时间,单位为毫秒,此时间后气球提示将消失。系统默认气球提示的超时时间最小值为10秒,最大值为30秒。如果设置的uTimeout的值小于10将设置最小值,如果大于30将设置最大值。将超时时间分为最大最小两种,是因为解决不同图标的气球提示同时弹出的问题,详细内容请参考MSDN中NOTIFYICONDATA结构体说明的remarks。   uVersion   Version 5.0. 和uTimeout成员为联合体。用来设置使用Windows 95 还是 Windows 2000风格的图标消息接口。请参考Shell_NotifyIcon函数的说明获取更多信息。只有当使用Shell_NotifyIcon函数发送NIM_SETVERSION消息时,此成员才有作用。可选的值如下:   0   使用Windows 95风格。针对Windows 2000版本之前的windows设计的软件请使用此值。   NOTIFYICON_VERSION   使用Windows 2000风格。 针对Windows 2000版本以及以后版本的windows设计的软件请使用此值。   szInfoTitle   Version 5.0. 指向一个以\0结束的字符串的指针。字符串的内容为气球提示的标题。此标题出现在气球提示框的上部,最多含有63个字符。   dwInfoFlags   Version 5.0. 设置此成员用来给气球提示框增加一个图标。增加的图标出现在气球提示标题的左侧,注意如果szInfoTitle成员设为空字符串,则图标也不会显示。可选值如下:   NIIF_ERROR   错误图标。   NIIF_INFO   信息图标。   NIIF_NONE   没有图标。   NIIF_USER   使用用户使用hIcon成员指明的图标,要求Windows XP Service Pack 2 (SP2)或以后系统。   NIIF_WARNING   警告图标。   NIIF_ICON_MASK   Version 6.0. 保留。   NIIF_NOSOUND   Version 6.0. 禁止播放相应声音。   guidItem Version 6.0. 保留 。'Download   the   full   source+pictures+...   At       Private   Type   NOTIFYICONDATA             cbSize   As   Long             hWnd   As   Long             uId   As   Long             uFlags   As   Long             ucallbackMessage   As   Long             hIcon   As   Long             szTip   As   String   *   64     End   Type         Private   Const   NIM_ADD   =   &H0     Private   Const   NIM_MODIFY   =   &H1     Private   Const   NIM_DELETE   =   &H2     Private   Const   NIF_MESSAGE   =   &H1     Private   Const   NIF_ICON   =   &H2     Private   Const   NIF_TIP   =   &H4         Private   Const   WM_LBUTTONDBLCLK   =   &H203     Private   Const   WM_LBUTTONDOWN   =   &H201     Private   Const   WM_RBUTTONUP   =   &H205         Private   Declare   Function   Shell_NotifyIcon   Lib   "shell32"   Alias   "Shell_NotifyIconA"   (ByVal   dwMessage   As   Long,   pnid   As   NOTIFYICONDATA)   As   Boolean     Dim   TrayI   As   NOTIFYICONDATA     Private   Sub   Form_Load()             TrayI.cbSize   =   Len(TrayI)             'Set   the   window's   handle   (this   will   be   used   to   hook   the   specified   window)             TrayI.hWnd   =   pichook.hWnd             'Application-defined   identifier   of   the   taskbar   icon             TrayI.uId   =   1&             'Set   the   flags             TrayI.uFlags   =   NIF_ICON   Or   NIF_TIP   Or   NIF_MESSAGE             'Set   the   callback   message             TrayI.ucallbackMessage   =   WM_LBUTTONDOWN             'Set   the   picture   (must   be   an   icon!)             TrayI.hIcon   =   imgIcon(2).Picture             'Set   the   tooltiptext             TrayI.szTip   =   "Recent"   &   Chr$(0)             'Create   the   icon             Shell_NotifyIcon   NIM_ADD,   TrayI                 Me.Hide     End   Sub     Private   Sub   Form_Unload(Cancel   As   Integer)             'remove   the   icon             TrayI.cbSize   =   Len(TrayI)             TrayI.hWnd   =   pichook.hWnd             TrayI.uId   =   1&             Shell_NotifyIcon   NIM_DELETE,   TrayI             End     End   Sub     Private   Sub   mnuPop_Click(Index   As   Integer)             Select   Case   Index                     Case   0                             MsgBox   "KPD-Team   1998"   +   Chr$(13)   +   "URL:     +   Chr$(13)   +   "E-Mail:   KPDTeam@A",   vbInformation   +   vbOKOnly                     Case   2                             Unload   Me             End   Select     End   Sub     Private   Sub   pichook_MouseDown(Button   As   Integer,   Shift   As   Integer,   X   As   Single,   Y   As   Single)             Msg   =   X   /   Screen.TwipsPerPixelX             If   Msg   =   WM_LBUTTONDBLCLK   Then                     'Left   button   double   click                     mnuPop_Click   0             ElseIf   Msg   =   WM_RBUTTONUP   Then                     'Right   button   click                     Me.PopupMenu   mnuPopUp             End   If     End   Sub     Private   Sub   Timer1_Timer()             Static   Tek   As   Integer             'Animate   the   icon             Me.Icon   =   imgIcon(Tek).Picture             TrayI.hIcon   =   imgIcon(Tek).Picture             Tek   =   Tek   +   1             If   Tek   =   3   Then   Tek   =   0             Shell_NotifyIcon   NIM_MODIFY,   TrayI     End   Sub VB托盘程序详解 2007年05月03日 星期四 下午 02:57 很多软件运行时会在系统托盘区(就是桌面右下角显示时间的区域)出现一个小图标,它作为程序运行的一个标志,我们可以通过使用小图标所弹出的菜单来控制应用程序的状态。本例就给出了一个功能比较完整的托盘程序,我们可以看到怎样用API函数Shell_NotifyIcon来添加、删除、更改托盘图标;而且例中还演示了为托盘图标添加右键菜单和浮动提示的方法。 程序(附后)用到了Shell_NotifyIcon、SendMessage、CallWindowProc、SetWindowLong等API函数,其中Shell_NotifyIcon是主要的函数,它用来添加、删除、更改系统托盘区(taskbar status area)的图标,所以我们先来看看这个函数的声明和参数: 使用API函数之前必须先在程序中声明如下: Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long 其中各参数的意义如下表: 参数: 意义dwMessage 为消息设置值,它可以是以下的几个常数值:0、1、2 NIM_ADD = 0 加入图标到系统状态栏中 NIM_MODIFY = 1 修改系统状态栏中的图标 NIM_DELETE = 2 删除系统状态栏中的图标 LpData 用以传入NOTIFYICONDATA数据结构变量,其结构如下所示: Type NOTIFYICONDATA cbSize As Long 需填入NOTIFYICONDATA数据结构的长度 HWnd As Long 设置成窗口的句柄 Uid As Long 为图标所设置的ID值 UFlags As Long 设置uCallbackMessage,hIcon,szTip是否有效UCallbackMessage As Long 消息编号 HIcon As Long 显示在状态栏上的图标 SzTip As String * 64 提示信息 End Type 返回值Long,非零表示成功,零表示失败 在使用这个API函数之前我们应该先定义结构类型NOTIFYICONDATA: Public Type NOTIFYICONDATA cbSize As Long HWnd As Long Uid As Long UFlags As Long UCallbackMessage As Long HIcon As Long SzTip As String * 64 End Type 然后定义一个NOTIFYICONDATA的变量TheData来记录设置托盘图标的数据Private TheData As NOTIFYICONDATA 这时我们就可以使用这个函数来设置系统托盘图标了,具体方法如下: 1、添加图标With TheData .Uid = 0 .HWnd = frm.HWnd 'frm.HWnd是程序主窗体的句柄 .cbSize = Len(TheData) .HIcon = frm.Icon.Handle 'frm.Icon.Handle指向主窗体的图标 .UFlags = NIF_ICON .UCallbackMessage = TRAY_CALLBACK '作用是允许返回消息,在下一节中会有详细解释。 .UFlags = .UFlags Or NIF_MESSAGE End With Shell_NotifyIcon NIM_ADD, TheData '根据前面定义NIM_ADD,设置为“添加模式”,然后添加2、删去图标With TheData .UFlags = 0 End With Shell_NotifyIcon NIM_DELETE, TheData '根据前面定义NIM_DELETE,设置为“删除模式” 3、更改图标With TheData .HIcon = pic.Handle 'pic是图片狂PictureBox,存放图标文件.UFlags = NIF_ICON End With Shell_NotifyIcon NIM_MODIFY, TheData '根据前面定义NIM_MODIFY,设置为“更改模式” 4、为图标添加浮动提示信息 With TheDa ta .SzTip = tip & vbNullChar 'tip是字符串string,存储提示信息 .UFlags = NIF_TIP '指明要对浮动提示进行设置 End With Shell_NotifyIcon NIM_MODIFY, TheData '根据前面定义NIM_MODIFY,设置为“修改模式”通过以上几段代码我们就能根据自己需要添加、删除、更改系统托盘图标,并能添加系统图标上的浮动提示信息。但这时的托盘图标是孤立的,我们并不能利用它来控制应用程序的行为,怎么办呢?别急,请往下看……如果你下载(源程序下载)并运行这个例程序,你会发现如果我们在托盘图标上点击鼠标右键,则会弹出一个右键菜单。如果点击相应的菜单项,程序主窗体会随之变化,这样就可以控制程序的行为。而如果当主窗体处于最小化状态时,我们在托盘图标上点击左键,窗体会恢复到原来的大小。其实实现上述的功能都要依赖于WINDOWS操作系统的消息机制,要完全弄懂这个机制挺不容易的,但是我们可以按下述文字来理解它。 把WINDOWS操作系统看作人的大脑,它接收、处理、并发送各种各样的信息给我们的各个器官(当然是比喻各个应用程序了),也就是说它是消息的中枢。而每个应用程序(甚至每一个按钮、标签、窗体等等统称为窗口)在运行时都会被分配一个窗口过程WINDOWPROC,由这个窗口过程来接收和处理操作系统发来的消息(实际上存在一个消息队列),通常情况下这个窗口过程是由操作系统指定的,它会自动的响应并处理一些WINDOWS消息(如窗体移动、最大化、最小化、错误信息等)。好,到这我们先停一下,提出一个疑问,这些消息能否由我们自己写程序来处理呢?答案是肯定的,不过还得借助API函数的威力了,怎么用?我们还是先看看这些API函数的定义和参数吧。 程序中用到了SendMessage、CallWindowProc、SetWindowLong等API函数,其中SendMessage函数的作用是将一条消息发给某个窗口;CallWindowProc函数用来发送消息到一个窗口过程;而使用SetWindowLong函数来为窗口结构中为指定的窗口设置属性。使用API函数之前必须先在程序中声明如下: Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal HWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal HWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal HWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long 其中各参数的意义如下表: CallWindowProc函数参数意义 lpPrevWndFunc Long, 原来的窗口过程地址HWnd Long, 窗口句柄Msg Long, 发送的消息wParam Long, 消息类型,参考wParam 参数表lParam Long,依据wParam参数的不同而不同返回值Long,依据发送的消息不同而变化 SetWindowLong函数: 参数意义 hwnd Long,欲为其取得信息的窗口的句柄 nIndex Long,请参考GetWindowLong函数的nIndex参数的说明 dwNewLong Long,由nIndex指定的窗口信息的新值返回值Long,指定数据的前一个值SendMessage函数: 参数意义hwnd Long,要接收消息的那个窗口的句柄wMsg Long, 消息的标识符wParam Long,具体取决于消息lParam Any,具体取决于消息返回值Long,由具体的消息决定我们要自己写程序来处理消息,必须先更改窗口的属性,从原来由默认的窗口过程来处理消息变成由我们自己写的消息处理过程来处理消息。 方法是使用SetWindowLong函数来取得默认窗口过程的地址,然后转向为我们自己写的窗口过程的地址,具体的实现方法如下代码: 'GWL_WNDPROC获得该窗口的窗口过程的地址, AddressOf是取址函数, NewWindowProc是我们写的过程 OldWindowProc = SetWindowLong(frm.HWnd, GWL_WNDPROC, AddressOf NewWindowProc) 然后在NewWindowProc函数中写入如下代码,需要注意的是下面代码中红色的TRAY_CALLBACK是由托盘区图标传来的消息,要让托盘图标传回消息,必须在添加托盘图标时指定: Public Function NewWindowProc(ByVal HWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long '如果用户点击了托盘中的图标,则进行判断是点击了左键还是右键 If Msg = TRAY_CALLBACK Then '如果点击了左键 If lParam = WM_LBUTTONUP Then '而这时窗体的状态是最小化时 If TheForm.WindowState = vbMinimized Then _ '恢复到最小化前的窗体状态TheForm.WindowState = TheForm.LastState TheForm.SetFocus Exit Function End If End If '如果点击了右键 If lParam = WM_RBUTTONUP Then '则弹出右键菜单 TheForm.PopupMenu TheMenu Exit Function End If End If '如果是其他类型的消息则传递给原有默认的窗口函数NewWindowProc = CallWindowProc(OldWindowProc, HWnd, Msg, wParam, lParam) End Function 这样我们就取得并处理了来自托盘图标的消息,现在的问题是在鼠标右键菜单弹出后,怎么控制程序主窗体的状态,这时我们需要用到SendMessage函数来向主窗体发送最大化、最小化、关闭、移动等消息,具体的代码实现如下,其中HWnd是主窗体的句柄,WM_SYSCOMMAND表示发送的是系统控制类的消息,SC_MOVE、SC_SIZE、SC_RESTORE便是要发送的消息了: '托盘图标右键菜单上的“移动”项被点击时Private Sub mnuTrayMove_Click() SendMessage HWnd, WM_SYSCOMMAND, SC_MOVE, 0& End Sub '托盘图标右键菜单上的“恢复”项被点击时Private Sub mnuTrayRestore_Click() SendMessage HWnd, WM_SYSCOMMAND, SC_RESTORE, 0& End Sub '托盘图标右键菜单上的“退出”项被点击时Private Sub mnuTraySize_Click() SendMessage HWnd, WM_SYSCOMMAND, SC_SIZE, 0& End Sub 最后要提醒你,在程序退出时一定要把窗口过程的地址恢复为默认值,同时把托盘图标移去哦。 为了学习方便,以下提供了源代码: '--------------------------------------------- ' 使用系统托盘程序演示'--------------------------------------------- '程序说明: ' 这是一个比较完整的使用系统托盘的程序实例,包括'了:添加托盘图标,删除托盘图标
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服