1 VB编程  
 〖ALT键+鼠标右键开始╱暂停;鼠标左键控制速度〗 
启动自动滚屏功能  
VB编程的七个优良习惯 
作者:木子  
1、"&"替换"+" 2、变量命名大小写,语句错落有秩,源代码维护方面  
3、请养成以下的“对象命名约定”良好习惯 4、在简单的选择条件情况下,使用IIf()函数  
5、尽量使用Debug.Print进行调试 6、在重复对某一对象的属性进行修改时,尽量使用With....End With  
7、MsgBox中尽量使用消息图标,这样程序比较有规范 8、在可能的情况下使用枚举  
1、"&"替换"+" 
在很多人的编程语言中,用“+”来连接字符串,这样容易导致歧义。良好的习惯是用“&”来连接字符串.  
不正确:  
Dim sMessage As String 
sMessage = "1" + "2"  
正确:  
Dim sMessage As String 
sMessage = "1" & "2"  
注意:"&"的后面有个空格 
2、变量命名大小写,语句错落有秩,源代码维护方面 
下面大家比较一下以下两段代码:  
读懂难度很大的代码: 
Dim SNAME As String 
Dim NTURN As Integer 
If NTURN = 0 Then 
If SNAME = "vbeden" Then 
Do While NTURN < 4 
NTURN = NTURN + 1 
Loop 
End If 
End If  
容易读懂的代码: 
Dim sName As String 
Dim nTurn As Integer 
If nTurn = 0 Then 
   If sName = "vbeden" Then 
      Do While nTurn < 4 
          nTurn = nTurn + 1 
      Loop 
   End If 
End If 
[返回索引] 
3、请养成以下的“对象命名约定”良好习惯 
推荐使用的控件前缀 
  
控件类型 前缀 例子  
3D Panel  pnl pnlGroup  
ADO Data ado adoBiblio  
Animated button ani aniMailBox  
Check box chk chkReadOnly  
Combo box, drop-down list box cbo cboEnglish  
Command button cmd cmdExit  
Common dialog  dlg dlgFileOpen  
Communications  com comFax  
Control (当特定类型未知时,在过程中所使用的) ctr ctrCurrent  
Data dat datBiblio  
Data-bound combo box dbcbo dbcboLanguage  
Data-bound grid dbgrd dbgrdQueryResult  
Data-bound list box dblst dblstJobType  
Data combo dbc dbcAuthor  
Data grid dgd dgdTitles  
Data list dbl dblPublisher  
Data repeater drp drpLocation  
Date picker dtp dtpPublished  
Directory list box dir dirSource  
Drive list box drv drvTarget  
File list box fil filSource  
Flat scroll bar fsb fsbMove  
Form frm frmEntry  
Frame fra fraLanguage  
Gauge gau gauStatus  
Graph gra graRevenue  
Grid grd grdPrices  
Hierarchical flexgrid flex flexOrders  
Horizontal scroll bar hsb hsbVolume  
Image img imgIcon  
Image combo imgcbo imgcboProduct  
ImageList ils ilsAllIcons  
Label lbl lblHelpMessage  
Lightweight check box lwchk lwchkArchive  
Lightweight combo box lwcbo lwcboGerman  
Lightweight command button lwcmd lwcmdRemove  
Lightweight frame lwfra lwfraSaveOptions  
Lightweight horizontal scroll bar lwhsb lwhsbVolume  
Lightweight list box lwlst lwlstCostCenters  
Lightweight option button lwopt lwoptIncomeLevel  
Lightweight text box lwtxt lwoptStreet  
Lightweight vertical scroll bar lwvsb lwvsbYear  
Line lin linVertical  
List box lst lstPolicyCodes  
ListView lvw lvwHeadings  
MAPI message mpm mpmSentMessage  
MAPI session mps mpsSession  
MCI mci mciVideo  
Menu mnu mnuFileOpen  
Month view mvw mvwPeriod  
MS Chart ch chSalesbyRegion  
MS Flex grid msg msgClients  
MS Tab  mst mstFirst  
OLE container ole oleWorksheet  
Option button opt optGender  
Picture box pic picVGA  
Picture clip clp clpToolbar  
 
 
  
 作者: 61.142.212.*  2005-10-28 20:38   回复此发言    
 
--------------------------------------------------------------------------------
 
2 VB编程  
 ProgressBar prg prgLoadFile  
Remote Data rd rdTitles  
RichTextBox rtf rtfReport  
Shape shp shpCircle  
Slider sld sldScale  
Spin spn spnPages  
StatusBar sta staDateTime  
SysInfo sys sysMonitor  
TabStrip tab tabOptions  
Text box txt txtLastName  
Timer tmr tmrAlarm  
Toolbar tlb tlbActions  
TreeView tre treOrganization  
UpDown upd updDirection  
Vertical scroll bar vsb vsbRate  
-------------------------------------------------------------------------------- 
推荐使用的数据访问对象 (DAO) 的前缀 
用下列前缀来指示数据访问对象  
数据库对象 前缀 例子  
Container con conReports  
Database db dbAccounts  
DBEngine dbe dbeJet  
Document doc docSalesReport  
Field fld fldAddress  
Group grp grpFinance  
Index ix idxAge  
Parameter prm prmJobCode  
QueryDef  qry qrySalesByRegion  
Recordset rec recForecast  
Relation rel relEmployeeDept  
TableDef tbd tbdCustomers  
User usr usrNew  
Workspace wsp wspMine  
-------------------------------------------------------------------------------- 
应用程序频繁使用许多菜单控件,对于这些控件具备一组唯一的命名约定很实用。除了最前面 "mnu" 标记以外,菜单控件的前缀应该被扩展:对每一级嵌套增加一个附加前缀,将最终的菜单的标题放在名称字符串的最后。下表列出了一些例子。 
推荐使用的菜单前缀  
菜单标题序列 菜单处理器名称  
File Open mnuFileOpen  
File Send Email mnuFileSendEmail  
File Send Fax  mnuFileSendFax  
Format Character mnuFormatCharacter  
Help Contents mnuHelpContents  
当使用这种命名约定时,一个特定的菜单组的所有成员一个接一个地列在 Visual Basic 的“属性”窗口中。而且,菜单控件的名字清楚地表示出它们所属的菜单项。 
为其它控件选择前缀 
对于上面没有列出的控件,应该用唯一的由两个或三个字符组成的前缀使它们标准化,以保持一致性。只有当需要澄清时,才使用多于三个字符的前缀。 
常量和变量命名约定 
除了对象之外,常量和变量也需要良好格式的命名约定。本节列出了 Visual Basic 支持的常量和变量的推荐约定。并且讨论标识数据类型和范围的问题。 
变量应该总是被定义在尽可能小的范围内。全局 (Public) 变量可以导致极其复杂的状态机构,并且使一个应用程序的逻辑非常难于理解。全局变量也使代码的重用和维护更加困难。 
Visual Basic 中的变量可以有下列范围 
  
范围 声明位置 可见位置  
过程级 过程,子过程或函数过程中的 ‘Private’ 在声明它的过程中  
模块级 窗体或代码模块(.frm、.bas )的声明部分中的 ‘Private’ 窗体或代码模块中的每一个过程  
全局 代码模块(.bas)的声明部分中的 ‘Public’ 应用程序中的每一处  
在 Visual Basic 的应用程序中,只有当没有其它方便途径在窗体之间共享数据时才使用全局变量。当必须使用全局变量时,在一个单一模块中声明它们,并按功能分组。给这个模块取一个有意义的名称,以指明它的作用,如 Public.bas。 
较好的编码习惯是尽可能写模块化的代码。例如,如果应用程序显示一个对话框,就把要完成这一对话任务所需要的所有控件和代码放在单一的窗体中。这有助于将应用程序的代码组织在有用的组件中,并减小它运行时的开销。 
除了全局变量(应该是不被传递的),过程和函数应该仅对传递给它们的对象操作。在过程中使用的全局变量应该在过程起始处的声明部分中标识出来。此外,应该用 ByVal 将参数传递给 Sub 过程及 function 过程,除非明显地需要改变已传递的参数值。 
随着工程大小的增长,划分变量范围的工作也迅速增加。在类型前缀的前面放置单字母范围前缀标明了这种增长,但变量名的长度并没有增加很多。 
 
 
  
 作者: 61.142.212.*  2005-10-28 20:38   回复此发言    
 
--------------------------------------------------------------------------------
 
3 VB编程  
 
变量范围前缀 
  
范围 前缀 例子  
全局 g gstrUserName  
模块级 m mblnCalcInProgress  
本地到过程 无 dblVelocity  
如果一个变量在标准模块或窗体模块中被声明为 Public,那么该变量具有全局范围。如果一个变量在标准模块或窗体模块中被分别声明为 Private,那么该变量有模块级范围。 
注意: 一致性是卓有成效地使用这种技术的关键;Visual Basic 中的语法检查器不会捕捉以 "p." 开头的模块级变量。 
常量 
常量名的主体是大小写混合的,每个单词的首字母大写。尽管标准 Visual Basic 常量不包含数据类型和范围信息,但是象 i、s、g 和 m 这样的前缀对于理解一个常量的值和范围还是很有用的。对于常量名,应遵循与变量相同的规则。例如: 
mintUserListMax   '对用户列表的最大限制 
                  '(整数值,本地到模块) 
gstrNewLine       '新行字符 
                  '(字符串,应用程序全局使用) 
变量 
声明所有的变量将会节省编程时间,因为键入操作引起的错误减少了(例如,究竟是 aUserNameTmp,还是 sUserNameTmp,还是 sUserNameTemp)。在“选项”对话框的“编辑器”标签中,复选“要求变量声明”选项。Option Explicit 语句要求在 Visual Basic 程序中声明所有的变量。 
应该给变量加前缀来指明它们的数据类型。而且前缀可以被扩展,用来指明变量范围,特别是对大型程序。 
用下列前缀来指明一个变量的数据类型。 
变量数据类型 
  
数据类型 前缀 例子  
String (字符串类型) str strFName  
Integer (短整数类型) int intQuantity  
Long (长整数类型) lng lngDistance  
Single (单精度浮点数类型) sng sngAverage  
Double (双精度浮点数类型) dbl dblTolerance  
Boolean (布尔类型) bln blnFound  
Byte (字节类型) byt bytRasterData  
Date (日期类型) dte dteNow  
Currency (货币计算与定点计算类型) cur curRevenue  
Object (对象类型) obj objCurrent  
Variant (变体类型) vnt vntCheckSum  
描述变量和过程名 
变量或过程名的主体应该使用大小写混合形式,并且应该足够长以描述它的作用。而且,函数名应该以一个动词起首,如 InitNameArray 或 CloseDialog。 
对于频繁使用的或长的项,推荐使用标准缩略语以使名称的长度合理化。一般来说,超过 32 个字符的变量名在 VGA 显示器上读起来就困难了。 
当使用缩略语时,要确保它们在整个应用程序中的一致性。在一个工程中,如果一会儿使用 Cnt, 一会儿使用 Count,将导致不必要的混淆。 
用户定义的类型 
在一项有许多用户定义类型的大工程中,常常有必要给每种类型一个它自己的三个字符的前缀。如果这些前缀是以 "u" 开始的,那么当用一个用户定义类型来工作时,快速识别这些类型是很容易的。例如,ucli 可以被用来作为一个用户定义的客户类型变量的前缀。 
[返回索引] 
4、在简单的选择条件情况下,使用IIf()函数 
罗索的代码: 
If nNum = 0 Then 
  sName = "sancy" 
Else 
  sName = "Xu" 
End If  
简单的代码: 
sName=IIf(nNum=0,"sancy","Xu") 
5、尽量使用Debug.Print进行调试 
在很多初学者的调试中,用MsgBox来跟踪变量值.其实用Debug.Print不仅可以达到同样的功效,而且在程序最后编译过程中,会被忽略.而MsgBox必须手动注释或删除.  
通常: 
MsgBox nName  
应该:  
Debug.Print nName 
6、在重复对某一对象的属性进行修改时,尽量使用With....End With 
通常: 
Form1.Height = 5000 
Form1.Width = 6000 
Form1.Caption = "This is MyLabel" 
应该: 
With Form1 
  .Height = 5000 
  .Width = 6000 
  .Caption = "This is MyLabel" 
End With 
这种结构程序执行效率比较高,特别在循环语句里。 
7、MsgBox中尽量使用消息图标,这样程序比较有规范 
 
 
  
 作者: 61.142.212.*  2005-10-28 20:38   回复此发言    
 
--------------------------------------------------------------------------------
 
4 VB编程  
 
一般来说  
vbInformation 用来提示确认或成功操作的消息  
vbExclamation 用来提示警告的消息  
vbCritical 用来提示危机情况的消息  
vbQuestion 用来提示询问的消息 
[返回索引] 
8、在可能的情况下使用枚举 
枚举的格式为  
[Public | Private] Enum name 
membername [= constantexpression] 
membername [= constantexpression] 
.... 
End Enum 
Enum 语句包含下面部分: 
部分 描述  
Public 可选的。表示该 Enum 类型在整个工程中都是可见的。Enum 类型的缺省情况是 Public。  
Private 可选的。表示该 Enum 类型只在所声明的模块中是可见的。  
name 必需的。该 Enum 类型的名称。name 必须是一个合法的 Visual Basic 标识符,在定义该 Enum 类型的变量或参数时用该名称来指定类型。  
membername 必需的。用于指定该 Enum 类型的组成元素名称的合法 Visual Basic 标识符。  
constantexpression 可选的。元素的值(为 Long 类型)。可以是别的 Enum 类型。如果没有指定 constantexpression,则所赋给的值或者是 0(如果该元素是第一个 membername),或者比其直接前驱的值大 1。  
说明 
所谓枚举变量,就是指用 Enum 类型定义的变量。变量和参数都可以定义为 Enum 类型。Enum 类型中的元素被初始化为 Enum 语句中指定的常数值。所赋给的值可以包括正数和负数,且在运行时不能改变。例如: 
Enum SecurityLevel IllegalEntry = -1 SecurityLevel1 = 0 SecurityLevel2 = 1 End Enum  
Enum 语句只能在模块级别中出现。定义 Enum 类型后,就可以用它来定义变量,参数或返回该类型的过程。不能用模块名来限定 Enum 类型。类模块中的 Public Enum 类型并不是该类的成员;只不过它们也被写入到类型库中。在标准模块中定义的 Enum 类型则不写到类型库中。具有相同名字的 Public Enum 类型不能既在标准模块中定义,又在类模块中定义,因为它们共享相同的命名空间。若不同的类型库中有两个 Enum 类型的名字相同,但成员不同,则对这种类型的变量的引用,将取决于哪一个类型库具有更高的引用优先级。 
不能在 With 块中使用 Enum 类型作为目标。 
Enum 语句示例 
下面的示例演示用 Enum 语句定义一个命名常数的集合。在本例中是一些可以选择的颜色常数用于设计数据库的数据输入窗体。 
Public Enum InterfaceColors 
icMistyRose = &HE1E4FF& 
icSlateGray = &H908070& 
icDodgerBlue = &HFF901E& 
icDeepSkyBlue = &HFFBF00& 
icSpringGreen = &H7FFF00& 
icForestGreen = &H228B22& 
icGoldenrod = &H20A5DA& 
icFirebrick = &H2222B2& 
End Enum 
好处是加快编程速度 
  
 
 
  
 作者: 61.142.212.*  2005-10-28 20:38   回复此发言    
 
--------------------------------------------------------------------------------
 
5 VB编程基础课  
 VB编程基础课  
什么是API API文本游览器  
API函数声明 数据类型与"类型安全"  
常 数 结 构  
小 结 一些API函数集: 控件与消息函数、硬件与系统函数、菜单函数、绘图函数  
  
什么是API [返回] 
  
首先,有必要向大家讲一讲,什么是API。所谓API本来是为C和C++程序员写的。API说来说去,就是一种函数,他们包含在一个附加名为DLL的动态连接库文件中。用标准的定义来讲,API就是Windows的32位应用程序编程接口,是一系列很复杂的函数,消息和结构,它使编程人员可以用不同类型的编程语言编制出的运行在Windows95和Windows NT操作系统上的应用程序。可以说,如果你曾经学过VC,那么API对你来说不是什么问题。但是如果你没有学过VC,或者你对Windows95的结构体系不熟悉,那么可以说,学习API将是一件很辛苦的事情。 
如果你打开WINDOWS的SYSTEM文件夹,你可以发现其中有很多附加名为DLL的文件。一个DLL中包含的API函数并不只是一个,数十个,甚至是数百个。我们能都掌握它嘛?回答是否定的∶不可能掌握。但实际上,我们真的没必要都掌握,只要重点掌握Windos系统本身自带的API函数就可以了。但,在其中还应当抛开掉同VB本身自有的函数重复的函数。如,VB 
的etAttr命令可以获得文件属性,SetAttr可以设置文件属性。对API来讲也有对应的函数 
GetFileAttributes和SetFileAttributes,性能都差不多。如此地一算,剩下来的也就5、600个。是的,也不少。但,我可以敢跟你说,只要你熟悉地掌握100个,那么你的编程水平比现在高出至少要两倍。尽管人们说VB和WINDOWS具有密切的关系,但我认为,API更接近 
WINDOWS。如果你学会了API,首要的收获便是对WINDOWS体系结构的认识。这个收获是来自不易的。 
如果你不依靠API会怎么样?我可以跟你说,绝大多是高级编程书本(当然这不是书的名程叫高级而高级的,而是在一开始的《本书内容》中指明《本书的阅读对象是具有一定VB基础的读者》的那些书),首先提的问题一般大都是从API开始。因此可以说,你不学API,你大概将停留在初级水平,无法往上攀登。唯一的途径也许就是向别人求救∶我快死了,快来救救我呀,这个怎么办,那个怎么办?烦不烦呢?当然,现在网上好人太多(包括我在内,嘻嘻),但,你应当明白,通过此途径,你的手中出不了好的作品。这是因为缺乏这些知识你的脑子里根本行不成一种总体的设计构思。  
API文本游览器 [返回] 
  
很多API函数都是很长很长的。想看什么样子吗?如下就是作为例子的API DdeClientTransaction函数∶ 
Declare Function DdeClientTransaction Lib "user32" (pData As Byte, ByVal cbData As Long, ByVal hConv As Long, ByVal hszItem As Long, ByVal wFmt As Long, ByVal wType As Long, ByVal dwTimeout As Long, pdwResult As Long) As Long 
哇!这么长?如果你从来没有接触过API,我想你肯定被吓住了。你也许考虑,该不该继续学下去。不过不要担心,幸运的是Microsoft的设计家们为我们提供了有用的工具,这便是API 
文本查看器。 
通过API文本查看器,我们可以方便地查找程序所需要的函数声明、结构类型和常数,然后将它复制到剪贴板,最后再粘贴到VB程序的代码段中。在大多数情况下,只要我们确定了程序所需要的函数、结构和常数这三个方面后,就可以通过对API文本游览器的以上操作将他们加入到程序段中,从而程序中可以使用这些函数了。这些是学习API最基本的常识问题,它远远占不到API的庞大的体系内容。今后我们把精力浪费(这绝不是浪费)在哪里呢?那就是∶ 
什么时候使用什么函数,什么时候使用什么结构类型,什么时候使用什么常数。  
API函数声明 [返回] 
  
让我们回想一下。在VB中,如何声明函数呢?我想,如果你正在看此文,那么你绝对能够回答得出这个问题。以下便是你应该很熟悉的函数声明∶ 
Function SetFocus (ByVal hwnd As Long) As Long 
 
 
  
 作者: 61.142.212.*  2005-10-28 20:43   回复此发言    
 
--------------------------------------------------------------------------------
 
6 VB编程基础课  
 即,这行代码定义了名为SetFocus的函数,此函数具有一个Long型数据类型的参数,并按值传递(ByVal),函数执行后将返回一个Long型数据。 
API函数的声明也很类似,如,API中的SetFocus 函数是这样写的∶ 
Declare Function SetFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long 
有点复杂了一些。是的,是复杂了点。但我可以告诉你,除了这些多出来的部分,其他部分还是和你以前学到的东西是一样的。函数在程序中的调用也是一样。如: 
Dim dl As Long 
dl&=SetFoucs(Form1.Hwnd) 
但,一点是清楚的。它不象你自己写的程序那样能够看到里面的运行机理,也不像VB 
自带的函数那样,能够从VB的联机帮助中查到其用法。唯一的方法就是去学、查VB以外的资料。 
Declare 语句用于在模块级别中声明对动态链接库 (DLL) 中外部过程的引用。对此,你只要记住任何API函数声明都必须写这个语句就可以了。 
Iib 指明包含所声明过程或函数的动态链接库或代码资源。也就是说,它说明的是,函数或过程从何而来的问题。 
如在上例中,SetFocus Lib "user32"说明 函数 SetFocus 来自 user32.dll文件。主要的dll动态连接库文件有∶ 
user32.dll Windows管理。生成和管理应用程序的用户接口。 
GDI32.dll 图形设备接口。产生Windows设备的图形输出 
Kernel32.dll 系统服务。访问操作系统的计算机资源。 
注意,当DLL文件不在Windows或System文件夹中的时候,必须在函数中说明其出处( 
路径)。如,SetFocus Lib "c:\Mydll\user32" 
函数声明中的Alias 是可选的。表示将被调用的过程在动态链接库 (DLL) 中还有另外的名称(别名)。如,Alias "SetFocus" ,说明SetFocus函数在User32.dll中的另外一个名称是, 
SetFocus。怎么两个名都一样呢?当然,也可以是不同的。在很多情况下,Alias说明的函数名,即别名最后一个字符经常是字符A,如SetWindowsText函数的另一个名称是 
SetWindowsTextA,表示为Alias "SetWindowsTextA"。这个A只不过是设计家们的习惯的命名约定,表示函数属于ANSI版本。 
那么,别名究竟有什么用途呢?从理论上讲,别名提供了用另一个名子调用API的函数方法。如果你指明了别名,那么 尽管我们按Declare语句后面的函数来调用该函数,但在函数的实际调用上是以别名作为首要选择的。如,以下两个函数(Function,ABCD)声明都是有效的,他们调用的是同一个 SetFocus函数∶ 
Declare Function SetFocus Lib "user32" "SetFocus" (ByVal hwnd As Long) As Long 
Declare ABCD SetFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long 
需要注意的是,选用Alias的时候,应注意别名的大小写;如果不选用Alias 时的时候,函数名必须注意大小写,而且不能改动。当然,在很多情况下,由于函数声明是直接从API 
文本游览器中拷贝过来的,所以这种错误的发生机会是很少的,但您有必要知道这一点。 
最后提醒你一句,API声明(包括结构、常数)必须放在窗体或模块的"通用(General Declarations)段。  
数据类型与"类型安全" [返回] 
  
API函数中使用的数据类型基本上和VB中的一样。但作为WIN32的API函数中,不存在Integer 
数据类型。另外一点是在API函数中看不到Boolean数据类型。 Variant数据类型在API函数中是以Any的形式出现,如Data As Any。尽管其含义是允许任意参数类型作为一个该API函数的参数传递,但这样做存在一定的缺点。其原因是,这将会使得对目标参数的所有类型检查都会被关闭。这自然会给各种类型的参数调用带来了产生错误的机会。 
为了强制执行严格的类型检查,并避免上面提到的问题,一个办法是在函数里使用上面提到到Alias技术。如对API函数 GetDIBits 可进行另外一种声明方法。如下∶ 
GetDIBits函数的原型∶ 
Public Declare Function GetDIBits Lib "gdi32" Alias "GetDIBits" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long 
 
 
  
 作者: 61.142.212.*  2005-10-28 20:43   回复此发言    
 
--------------------------------------------------------------------------------
 
7 VB编程基础课  
 GetDIBits函数的改型∶ 
Public Declare Function GetDIBitsLong Lib "gdi32" Alias "GetDIBits" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Long, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long 
通过本课程前面所学到的知识,我们已经可以得知原型 GetDIBits函数也好,改型 GetDIBitsLong函数也好,实际将调用的都是Alias所指定的 GetDIBits原函数。但你应当看到,两者的区别在于,我们在改型的函数中强制指定lpBits参数为Long形。这样就会使得函数调用中发生的错误机率减少到了最小。这种方法叫做"安全类型"声明。 
API函数中经常看到的数据类型有∶Long,String,Byte,Any....(也就这些吧。)  
常 数 [返回] 
  
对于API常数来讲,没有什么太特别的学问。请看VB中的以下代码∶ 
Msg = MsgBox("您好", vbOKCancel) 
我们知道, vbOKCancel这个常数的值等于1。对上面的代码我们完全可以这样写,而不会影响代码的功能∶ 
Msg = MsgBox("您好", 1) 
但你大概不太愿意选择后一种,因为这会使得看懂代码费劲起来。这种方法也被API采取了。只是API常数必须在事情之前做好初始化声明VB本身是看不懂的。其内容仍然来自与API 
文本游览器。具体形式如下等等∶ 
Public Const ABM_ACTIVATE = &H6  
Public Const RIGHT_CTRL_PRESSED = &H4  
Public Const RPC_E_SERVER_DIED = &H80010007 
Private Const RPC_S_CALL_FAILED_DNE = 1727&  
在常数的初始化中,有些程序使用Global,如Global Const ABM_ACTIVATE = &H6,但我认为Public完全可以代替它。过去我也用过Global,但现在不大用了。一会儿用这个,一会儿用那个,各程序之间不能保持一致性了,起码看起来别扭。  
结 构 [返回] 
  
结构是C和C++语言中的说法。在VB中一般称为自定义数据类型。想必很多朋友都已经认识它。在API领域里,我更喜欢把它叫做结构,因为API各种结构类型根本不是我定义( 
自定义)的。 
在VB中,API结构同样由TYPE.......END TYPE语句来定义。如,在API中,点(Point)结构的定义方法如下: 
Public Type POINTAPI 
X As Long '点在X坐标(横坐标)上的坐标值 
Y As Long '点在Y坐标(纵坐标)上的坐标值 
End Type 
又如,API中矩形(Rect)结构的定义如下∶ 
Public Type RECT 
Left As Long '矩形左上角的X坐标 
Top As Long '矩形左上角的Y坐标 
Right As Long '矩形右下角的X坐标 
Bottom As Long '矩形右下角的Y坐标 
End Type 
这些内容同样可以从API文本游览器中拷贝过来。这些结构中的变量名可随意改动,而不会影响结构本身。也就是说,这些成员变量都是虚拟的。如,POINTAPI结构可改为如下∶ 
Public Type POINTAPI 
MyX As Long '点在X坐标(横坐标)上的坐标值 
MyY As Long '点在Y坐标(纵坐标)上的坐标值 
End Type 
不过,一般来讲,是没有这种必要的。结构本身是一种数据类型,因此,使用时必须声明具体变量为该结构型,才能在程序中真正使用到该结构。结构的声明方法和其他数据的声明方法一样,如,以下语句把变MyPoint声明为POINTAPI结构类型∶ 
MyPoint As POINTAPI 
引用结构中的成员变量也十分简单,在结构名后面加上一个".",然后紧接着写要引用的成员变量即可。这很象VB中的引用一个对象的某个属性。如,假如我们把上面已经声明的MyPoint结构中的X变量的值赋给变量Temp& 
则代码如下∶ 
Temp&=MyPoint.X 
但,特别注意的是,你千万不要认为上例中的MyPoint是一个值。它不是值,而是地址( 
指针)。值和地址是完全不同的概念。结构要求按引用传递给WINDOWS函数,即所有API 
函数中,结构都是按ByRef传递的(在Declare语句 中ByRef是默认型)。对于结构的传递,你不要试图采用ByVal,你将一无所获。由于结构名实际上就是指向这个结构的指针(这个结构的首地址),所以,你也就传送特定的结构名就可以了(参见小结,我用红色字体来突出了这种传递方式)。 
 
 
  
 作者: 61.142.212.*  2005-10-28 20:43   回复此发言    
 
--------------------------------------------------------------------------------
 
8 VB编程基础课  
 
由于结构传送的是指针,所以函数将直接对结构进行读写操作。这种特性很适合于把函数执行的结果装载在结构之中。  
小 结 [返回] 
  
以下的程序是为了总结本课中学到的内容而给出的。启动VB,新建一个项目,添加一个命令按钮,并把下面的代码拷贝到代码段中,运行它。  
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long 
Private Type POINTAPI '定义点(Point)结构 
X As Long '点在X坐标(横坐标)上的坐标值 
Y As Long '点在Y坐标(纵坐标)上的坐标值 
End Type 
Sub PrintCursorPos( ) 
Dim dl AS Long 
Dim MyPoint As POINTAPI 
dl&= GetCursorPos(MyPoint) '调用函数,获取屏幕鼠标坐标 
Debug.Print "X=" & Str(MyPoint.X) & " and " & "Y=" & Str(MyPoint.Y) 
End Sub 
Private Sub Command1_Click() 
PrintCursorPos 
End Sub 
输出结果为(每次运行都可能得到不同的结果,这得由函数调用时鼠标指针在屏幕中所处的位置而决定)∶ 
X= 240 and Y= 151 
程序中,GetCursorPos函数用来获取鼠标指针在屏幕上的位置。 
以上例子中,你可以发现,以参数传递的MyPpint结构的内容在函数调用后发生了实质性变化。这是由于结构是按ByRef传递的原因。  
一些API函数集 [返回] 
  
Windows API 
1.控件与消息函数  
AdjustWindowRect 给定一种窗口样式,计算获得目标客户区矩形所需的窗口大小  
AnyPopup 判断屏幕上是否存在任何弹出式窗口  
ArrangeIconicWindows 排列一个父窗口的最小化子窗口  
AttachThreadInput 连接线程输入函数  
BeginDeferWindowPos 启动构建一系列新窗口位置的过程  
BringWindowToTop 将指定的窗口带至窗口列表顶部  
CascadeWindows 以层叠方式排列窗口  
ChildWindowFromPoint 返回父窗口中包含了指定点的第一个子窗口的句柄  
ClientToScreen 判断窗口内以客户区坐标表示的一个点的屏幕坐标  
CloseWindow 最小化指定的窗口  
CopyRect 矩形内容复制  
DeferWindowPos 该函数为特定的窗口指定一个新窗口位置  
DestroyWindow 清除指定的窗口以及它的所有子窗口  
DrawAnimatedRects 描绘一系列动态矩形  
EnableWindow 指定的窗口里允许或禁止所有鼠标及键盘输入  
EndDeferWindowPos 同时更新DeferWindowPos调用时指定的所有窗口的位置及状态 
EnumChildWindows 为指定的父窗口枚举子窗口  
EnumThreadWindows 枚举与指定任务相关的窗口  
EnumWindows 枚举窗口列表中的所有父窗口  
EqualRect 判断两个矩形结构是否相同  
FindWindow 寻找窗口列表中第一个符合指定条件的顶级窗口  
FindWindowEx 在窗口列表中寻找与指定条件相符的第一个子窗口  
FlashWindow 闪烁显示指定窗口  
GetActiveWindow 获得活动窗口的句柄  
GetCapture 获得一个窗口的句柄,这个窗口位于当前输入线程,且拥有鼠标捕获(鼠标活动由它接收)  
GetClassInfo 取得WNDCLASS结构(或WNDCLASSEX结构)的一个副本,结构中包含了与指定类有关的信息  
GetClassLong 取得窗口类的一个Long变量条目  
GetClassName 为指定的窗口取得类名  
GetClassWord 为窗口类取得一个整数变量  
GetClientRect 返回指定窗口客户区矩形的大小  
GetDesktopWindow 获得代表整个屏幕的一个窗口(桌面窗口)句柄  
GetFocus 获得拥有输入焦点的窗口的句柄 
GetForegroundWindow 获得前台窗口的句柄  
GetLastActivePopup 获得在一个给定父窗口中最近激活过的弹出式窗口的句柄  
GetLastError 针对之前调用的api函数,用这个函数取得扩展错误信息  
GetParent 判断指定窗口的父窗口  
GetTopWindow 搜索内部窗口列表,寻找隶属于指定窗口的头一个窗口的句柄  
GetUpdateRect 获得一个矩形,它描叙了指定窗口中需要更新的那一部分  
GetWindow 获得一个窗口的句柄,该窗口与某源窗口有特定的关系  
 
 
  
 作者: 61.142.212.*  2005-10-28 20:43   回复此发言    
 
--------------------------------------------------------------------------------
 
9 VB编程基础课  
 GetWindowContextHelpId 取得与窗口关联在一起的帮助场景ID  
GetWindowLong 从指定窗口的结构中取得信息  
GetWindowPlacement 获得指定窗口的状态及位置信息  
GetWindowRect 获得整个窗口的范围矩形,窗口的边框、标题栏、滚动条及菜单等都在这个矩形内  
GetWindowText 取得一个窗体的标题(caption)文字,或者一个控件的内容  
GetWindowTextLength 调查窗口标题文字或控件内容的长短  
GetWindowWord 获得指定窗口结构的信息  
InflateRect 增大或减小一个矩形的大小  
IntersectRect 这个函数在lpDestRect里载入一个矩形,它是lpSrc1Rect与lpSrc2Rect两个矩形的交集 
InvalidateRect 屏蔽一个窗口客户区的全部或部分区域  
IsChild 判断一个窗口是否为另一窗口的子或隶属窗口  
IsIconic 判断窗口是否已最小化  
IsRectEmpty 判断一个矩形是否为空  
IsWindow 判断一个窗口句柄是否有效  
IsWindowEnabled 判断窗口是否处于活动状态  
IsWindowUnicode 判断一个窗口是否为Unicode窗口。这意味着窗口为所有基于文本的消息都接收Unicode文字  
IsWindowVisible 判断窗口是否可见  
IsZoomed 判断窗口是否最大化  
LockWindowUpdate 锁定指定窗口,禁止它更新  
MapWindowPoints 将一个窗口客户区坐标的点转换到另一窗口的客户区坐标系统  
MoveWindow 改变指定窗口的位置和大小  
OffsetRect 通过应用一个指定的偏移,从而让矩形移动起来  
OpenIcon 恢复一个最小化的程序,并将其激活  
PtInRect 判断指定的点是否位于矩形内部  
RedrawWindow 重画全部或部分窗口 
ReleaseCapture 为当前的应用程序释放鼠标捕获  
ScreenToClient 判断屏幕上一个指定点的客户区坐标  
ScrollWindow 滚动窗口客户区的全部或一部分  
ScrollWindowEx 根据附加的选项,滚动窗口客户区的全部或部分  
SetActiveWindow 激活指定的窗口  
SetCapture 将鼠标捕获设置到指定的窗口  
SetClassLong 为窗口类设置一个Long变量条目  
SetClassWord 为窗口类设置一个条目  
SetFocusAPI 将输入焦点设到指定的窗口。如有必要,会激活窗口  
SetForegroundWindow 将窗口设为系统的前台窗口  
SetParent 指定一个窗口的新父  
SetRect 设置指定矩形的内容  
SetRectEmpty 将矩形设为一个空矩形  
SetWindowContextHelpId 为指定的窗口设置帮助场景(上下文)ID  
SetWindowLong 在窗口结构中为指定的窗口设置信息  
SetWindowPlacement 设置窗口状态和位置信息 
SetWindowPos 为窗口指定一个新位置和状态  
SetWindowText 设置窗口的标题文字或控件的内容  
SetWindowWord 在窗口结构中为指定的窗口设置信息  
ShowOwnedPopups 显示或隐藏由指定窗口所有的全部弹出式窗口  
ShowWindow 控制窗口的可见性  
ShowWindowAsync 与ShowWindow相似  
SubtractRect 装载矩形lprcDst,它是在矩形lprcSrc1中减去lprcSrc2得到的结果  
TileWindows 以平铺顺序排列窗口  
UnionRect 装载一个lpDestRect目标矩形,它是lpSrc1Rect和lpSrc2Rect联合起来的结果  
UpdateWindow 强制立即更新窗口  
ValidateRect 校验窗口的全部或部分客户区  
WindowFromPoint 返回包含了指定点的窗口的句柄。忽略屏蔽、隐藏以及透明窗口 
2.硬件与系统函数 
ActivateKeyboardLayout 激活一个新的键盘布局。键盘布局定义了按键在一种物理性键盘上的位置与含义  
Beep 用于生成简单的声音  
CharToOem 将一个字串从ANSI字符集转换到OEM字符集  
ClipCursor 将指针限制到指定区域  
ConvertDefaultLocale 将一个特殊的地方标识符转换成真实的地方ID  
CreateCaret 根据指定的信息创建一个插入符(光标),并将它选定为指定窗口的默认插入符  
DestroyCaret 清除(破坏)一个插入符  
EnumCalendarInfo 枚举在指定“地方”环境中可用的日历信息  
 
 
  
 作者: 61.142.212.*  2005-10-28 20:43   回复此发言    
 
--------------------------------------------------------------------------------
 
10 VB编程基础课  
 EnumDateFormats 列举指定的“当地”设置中可用的长、短日期格式  
EnumSystemCodePages 枚举系统中已安装或支持的代码页  
EnumSystemLocales 枚举系统已经安装或提供支持的“地方”设置  
EnumTimeFormats 枚举一个指定的地方适用的时间格式  
ExitWindowsEx 退出windows,并用特定的选项重新启动  
ExpandEnvironmentStrings 扩充环境字串  
FreeEnvironmentStrings 翻译指定的环境字串块  
GetACP 判断目前正在生效的ANSI代码页 
GetAsyncKeyState 判断函数调用时指定虚拟键的状态  
GetCaretBlinkTime 判断插入符光标的闪烁频率  
GetCaretPos 判断插入符的当前位置  
GetClipCursor 取得一个矩形,用于描述目前为鼠标指针规定的剪切区域  
GetCommandLine 获得指向当前命令行缓冲区的一个指针  
GetComputerName 取得这台计算机的名称  
GetCPInfo 取得与指定代码页有关的信息  
GetCurrencyFormat 针对指定的“地方”设置,根据货币格式格式化一个数字  
GetCursor 获取目前选择的鼠标指针的句柄  
GetCursorPos 获取鼠标指针的当前位置  
GetDateFormat 针对指定的“当地”格式,对一个系统日期进行格式化  
GetDoubleClickTime 判断连续两次鼠标单击之间会被处理成双击事件的间隔时间  
GetEnvironmentStrings 为包含了当前环境字串设置的一个内存块分配和返回一个句柄  
GetEnvironmentVariable 取得一个环境变量的值  
GetInputState 判断是否存在任何待决(等待处理)的鼠标或键盘事件  
GetKBCodePage 由GetOEMCP取代,两者功能完全相同 
GetKeyboardLayout 取得一个句柄,描述指定应用程序的键盘布局  
GetKeyboardLayoutList 获得系统适用的所有键盘布局的一个列表  
GetKeyboardLayoutName 取得当前活动键盘布局的名称  
GetKeyboardState 取得键盘上每个虚拟键当前的状态  
GetKeyboardType 了解与正在使用的键盘有关的信息  
GetKeyNameText 在给出扫描码的前提下,判断键名  
GetKeyState 针对已处理过的按键,在最近一次输入信息时,判断指定虚拟键的状态  
GetLastError 针对之前调用的api函数,用这个函数取得扩展错误信息  
GetLocaleInfo 取得与指定“地方”有关的信息  
GetLocalTime 取得本地日期和时间  
GetNumberFormat 针对指定的“地方”,按特定的格式格式化一个数字  
GetOEMCP 判断在OEM和ANSI字符集间转换的windows代码页  
GetQueueStatus 判断应用程序消息队列中待决(等待处理)的消息类型  
GetSysColor 判断指定windows显示对象的颜色  
GetSystemDefaultLangID 取得系统的默认语言ID  
GetSystemDefaultLCID 取得当前的默认系统“地方” 
GetSystemInfo 取得与底层硬件平台有关的信息  
GetSystemMetrics 返回与windows环境有关的信息  
GetSystemPowerStatus 获得与当前系统电源状态有关的信息  
GetSystemTime 取得当前系统时间,这个时间采用的是“协同世界时间”(即UTC,也叫做GMT)格式  
GetSystemTimeAdjustment 使内部系统时钟与一个外部的时钟信号源同步  
GetThreadLocale 取得当前线程的地方ID  
GetTickCount 用于获取自windows启动以来经历的时间长度(毫秒)  
GetTimeFormat 针对当前指定的“地方”,按特定的格式格式化一个系统时间  
GetTimeZoneInformation 取得与系统时区设置有关的信息  
GetUserDefaultLangID 为当前用户取得默认语言ID  
GetUserDefaultLCID 取得当前用户的默认“地方”设置  
GetUserName 取得当前用户的名字  
GetVersion 判断当前运行的Windows和DOS版本  
GetVersionEx 取得与平台和操作系统有关的版本信息  
HideCaret 在指定的窗口隐藏插入符(光标)  
IsValidCodePage 判断一个代码页是否有效 
IsValidLocale 判断地方标识符是否有效  
keybd_event 这个函数模拟了键盘行动  
LoadKeyboardLayout 载入一个键盘布局  
 
 
  
 作者: 61.142.212.*  2005-10-28 20:43   回复此发言    
 
--------------------------------------------------------------------------------
 
11 VB编程基础课  
 MapVirtualKey 根据指定的映射类型,执行不同的扫描码和字符转换  
MapVirtualKeyEx 根据指定的映射类型,执行不同的扫描码和字符转换  
MessageBeep 播放一个系统声音。系统声音的分配方案是在控制面板里决定的  
mouse_event 模拟一次鼠标事件  
OemKeyScan 判断OEM字符集中的一个ASCII字符的扫描码和Shift键状态  
OemToChar 将OEM字符集的一个字串转换到ANSI字符集  
SetCaretBlinkTime 指定插入符(光标)的闪烁频率  
SetCaretPos 指定插入符的位置  
SetComputerName 设置新的计算机名  
SetCursor 将指定的鼠标指针设为当前指针  
SetCursorPos 设置指针的位置  
SetDoubleClickTime 设置连续两次鼠标单击之间能使系统认为是双击事件的间隔时间  
SetEnvironmentVariable 将一个环境变量设为指定的值 
SetKeyboardState 设置每个虚拟键当前在键盘上的状态  
SetLocaleInfo 改变用户“地方”设置信息  
SetLocalTime 设置当前地方时间  
SetSysColors 设置指定窗口显示对象的颜色  
SetSystemCursor 改变任何一个标准系统指针  
SetSystemTime 设置当前系统时间  
SetSystemTimeAdjustment 定时添加一个校准值使内部系统时钟与一个外部的时钟信号源同步  
SetThreadLocale 为当前线程设置地方  
SetTimeZoneInformation 设置系统时区信息  
ShowCaret 在指定的窗口里显示插入符(光标)  
ShowCursor 控制鼠标指针的可视性  
SwapMouseButton 决定是否互换鼠标左右键的功能  
SystemParametersInfo 获取和设置数量众多的windows系统参数  
SystemTimeToTzSpecificLocalTime 将系统时间转换成地方时间  
ToAscii 根据当前的扫描码和键盘信息,将一个虚拟键转换成ASCII字符  
ToUnicode 根据当前的扫描码和键盘信息,将一个虚拟键转换成Unicode字符 
UnloadKeyboardLayout 卸载指定的键盘布局  
VkKeyScan 针对Windows字符集中一个ASCII字符,判断虚拟键码和Shift键的状态  
完 
3.菜单函数 
AppendMenu 在指定的菜单里添加一个菜单项  
CheckMenuItem 复选或撤消复选指定的菜单条目  
CheckMenuRadioItem 指定一个菜单条目被复选成“单选”项目  
CreateMenu 创建新菜单  
CreatePopupMenu 创建一个空的弹出式菜单  
DeleteMenu 删除指定的菜单条目  
DestroyMenu 删除指定的菜单  
DrawMenuBar 为指定的窗口重画菜单  
EnableMenuItem 允许或禁止指定的菜单条目  
GetMenu 取得窗口中一个菜单的句柄  
GetMenuCheckMarkDimensions 返回一个菜单复选符的大小  
GetMenuContextHelpId 取得一个菜单的帮助场景ID  
GetMenuDefaultItem 判断菜单中的哪个条目是默认条目  
GetMenuItemCount 返回菜单中条目(菜单项)的数量  
GetMenuItemID 返回位于菜单中指定位置处的条目的菜单ID  
GetMenuItemInfo 取得(接收)与一个菜单条目有关的特定信息 
GetMenuItemRect 在一个矩形中装载指定菜单条目的屏幕坐标信息  
GetMenuState 取得与指定菜单条目状态有关的信息  
GetMenuString 取得指定菜单条目的字串  
GetSubMenu 取得一个弹出式菜单的句柄,它位于菜单中指定的位置  
GetSystemMenu 取得指定窗口的系统菜单的句柄  
HiliteMenuItem 控制顶级菜单条目的加亮显示状态  
InsertMenu 在菜单的指定位置处插入一个菜单条目,并根据需要将其他条目向下移动  
InsertMenuItem 插入一个新菜单条目  
IsMenu 判断指定的句柄是否为一个菜单的句柄  
LoadMenu 从指定的模块或应用程序实例中载入一个菜单  
LoadMenuIndirect 载入一个菜单  
MenuItemFromPoint 判断哪个菜单条目包含了屏幕上一个指定的点  
ModifyMenu 改变菜单条目  
RemoveMenu 删除指定的菜单条目  
SetMenu 设置窗口菜单  
SetMenuContextHelpId 设置一个菜单的帮助场景ID 
SetMenuDefaultItem 将一个菜单条目设为默认条目  
 
 
  
 作者: 61.142.212.*  2005-10-28 20:43   回复此发言    
 
--------------------------------------------------------------------------------
 
12 VB编程基础课  
 SetMenuItemBitmaps 设置一幅特定位图,令其在指定的菜单条目中使用,代替标准的复选符号(√)  
SetMenuItemInfo 为一个菜单条目设置指定的信息  
TrackPopupMenu 在屏幕的任意地方显示一个弹出式菜单  
TrackPopupMenuEx 与TrackPopupMenu相似,只是它提供了额外的功能  
完 
以下是几个关于菜单函数的类型定义  
MENUITEMINFO 这个结构包含了菜单条目的信息  
TPMPARAMS 这个结构用于TrackPopupMenuEx函数以支持额外的功能 
4.绘图函数 
AbortPath 抛弃选入指定设备场景中的所有路径。也取消目前正在进行的任何路径的创建工作  
AngleArc 用一个连接弧画一条线  
Arc 画一个圆弧  
BeginPath 启动一个路径分支  
CancelDC 取消另一个线程里的长时间绘图操作  
Chord 画一个弦  
CloseEnhMetaFile 关闭指定的增强型图元文件设备场景,并将新建的图元文件返回一个句柄  
CloseFigure 描绘到一个路径时,关闭当前打开的图形  
CloseMetaFile 关闭指定的图元文件设备场景,并向新建的图元文件返回一个句柄  
CopyEnhMetaFile 制作指定增强型图元文件的一个副本(拷贝)  
CopyMetaFile 制作指定(标准)图元文件的一个副本  
CreateBrushIndirect 在一个LOGBRUSH数据结构的基础上创建一个刷子  
CreateDIBPatternBrush 用一幅与设备无关的位图创建一个刷子,以便指定刷子样式(图案)  
CreateEnhMetaFile 创建一个增强型的图元文件设备场景  
CreateHatchBrush 创建带有阴影图案的一个刷子  
CreateMetaFile 创建一个图元文件设备场景 
CreatePatternBrush 用指定了刷子图案的一幅位图创建一个刷子  
CreatePen 用指定的样式、宽度和颜色创建一个画笔  
CreatePenIndirect 根据指定的LOGPEN结构创建一个画笔  
CreateSolidBrush 用纯色创建一个刷子  
DeleteEnhMetaFile 删除指定的增强型图元文件  
DeleteMetaFile 删除指定的图元文件  
DeleteObject 删除GDI对象,对象使用的所有系统资源都会被释放  
DrawEdge 用指定的样式描绘一个矩形的边框  
DrawEscape 换码(Escape)函数将数据直接发至显示设备驱动程序  
DrawFocusRect 画一个焦点矩形  
DrawFrameControl 描绘一个标准控件  
DrawState 为一幅图象或绘图操作应用各式各样的效果  
Ellipse 描绘一个椭圆,由指定的矩形围绕  
EndPath 停止定义一个路径  
EnumEnhMetaFile 针对一个增强型图元文件,列举其中单独的图元文件记录  
EnumMetaFile 为一个标准的windows图元文件枚举单独的图元文件记录 
EnumObjects 枚举可随同指定设备场景使用的画笔和刷子  
ExtCreatePen 创建一个扩展画笔(装饰或几何)  
ExtFloodFill 在指定的设备场景里,用当前选择的刷子填充一个区域  
FillPath 关闭路径中任何打开的图形,并用当前刷子填充  
FillRect 用指定的刷子填充一个矩形  
FlattenPath 将一个路径中的所有曲线都转换成线段  
FloodFill 用当前选定的刷子在指定的设备场景中填充一个区域  
FrameRect 用指定的刷子围绕一个矩形画一个边框  
GdiComment 为指定的增强型图元文件设备场景添加一条注释信息  
GdiFlush 执行任何未决的绘图操作  
GdiGetBatchLimit 判断有多少个GDI绘图命令位于队列中  
GdiSetBatchLimit 指定有多少个GDI绘图命令能够进入队列  
GetArcDirection 画圆弧的时候,判断当前采用的绘图方向  
GetBkColor 取得指定设备场景当前的背景颜色  
GetBkMode 针对指定的设备场景,取得当前的背景填充模式  
GetBrushOrgEx 判断指定设备场景中当前选定刷子起点 
GetCurrentObject 获得指定类型的当前选定对象  
GetCurrentPositionEx 在指定的设备场景中取得当前的画笔位置  
GetEnhMetaFile 取得磁盘文件中包含的一个增强型图元文件的图元文件句柄  
GetEnhMetaFileBits 将指定的增强型图元文件复制到一个内存缓冲区里  
GetEnhMetaFileDescription 返回对一个增强型图元文件的说明  
GetEnhMetaFileHeader 取得增强型图元文件的图元文件头  
GetEnhMetaFilePaletteEntries 取得增强型图元文件的全部或部分调色板  
GetMetaFile 取得包含在一个磁盘文件中的图元文件的图元文件句柄  
GetMetaFileBitsEx 将指定的图元文件复制到一个内存缓冲区  
GetMiterLimit 取得设备场景的斜率限制(Miter)设置  
GetNearestColor 根据设备的显示能力,取得与指定颜色最接近的一种纯色  
GetObjectAPI 取得对指定对象进行说明的一个结构  
GetObjectType 判断由指定句柄引用的GDI对象的类型  
GetPath 取得对当前路径进行定义的一系列数据  
GetPixel 在指定的设备场景中取得一个像素的RGB值  
GetPolyFillMode 针对指定的设备场景,获得多边形填充模式 
GetROP2 针对指定的设备场景,取得当前的绘图模式  
GetStockObject 取得一个固有对象(Stock)  
GetSysColorBrush 为任何一种标准系统颜色取得一个刷子  
GetWinMetaFileBits 通过在一个缓冲区中填充用于标准图元文件的数据,将一个增强型图元文件转换成标准windows图元文件  
InvertRect 通过反转每个像素的值,从而反转一个设备场景中指定的矩形  
LineDDA 枚举指定线段中的所有点  
LineTo 用当前画笔画一条线,从当前位置连到一个指定的点  
 
  
 作者: 61.142.212.*  2005-10-28 20:43   回复此发言    
 
--------------------------------------------------------------------------------
 
13 怎样关闭一个正在运行的程序  
 怎样关闭一个正在运行的程序  
〖ALT键+鼠标右键开始╱暂停;鼠标左键控制速度〗 
启动自动滚屏功能  
你可以使用API函数FindWindow和PostMessage去寻找指定的窗口,并关闭它。下面的例子教给你怎样找到并关掉一个Caption为“Caluclator”的程序。 
Dim winHwnd As Long 
Dim RetVal As Long 
winHwnd = FindWindow(vbNullString, "Calculator") 
Debug.Print winHwnd 
If winHwnd <> 0 Then 
RetVal = PostMessage(winHwnd, WM_CLOSE, 0&, 0&) 
If RetVal = 0 Then 
MsgBox "置入消息错误!" 
End If 
Else 
MsgBox "Calculator没有打开!" 
End If 
为了让以上的代码工作,你必须在模块文件中什么以下API函数: 
Declare Function FindWindow Lib "user32" Alias _ 
"FindWindowA" (ByVal lpClassName As String, _ 
ByVal lpWindowName As String) As Long  
Declare Function PostMessage Lib "user32" Alias _ 
"PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _ 
ByVal wParam As Long, lParam As Any) As Long  
Public Const WM_CLOSE = &H10  
 
  
 作者: 61.142.212.*  2005-10-28 20:45   回复此发言    
 
--------------------------------------------------------------------------------
 
14 用API函数打开颜色对话框。  
 Option Explicit 
Declare Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As ChooseColor) As Long 
Type ChooseColor 
 lStructSize As Long 
 hwndOwner As Long 
 hInstance As Long 
 rgbResult As Long 
 lpCustColors As String 
 flags As Long 
 lCustData As Long 
 lpfnHook As Long 
 lpTemplateName As String 
End Type 
-------------- 
Option Explicit 
Declare Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As ChooseColor) As Long 
Type ChooseColor 
 lStructSize As Long 
 hwndOwner As Long 
 hInstance As Long 
 rgbResult As Long 
 lpCustColors As String 
 flags As Long 
 lCustData As Long 
 lpfnHook As Long 
 lpTemplateName As String 
End Type 
Option Explicit 
Dim rtn As String 
 
Private Sub Cancel_Click() 
Unload Me 'exit the program 
End Sub 
Private Sub Command2_Click() 
Dim cc As ChooseColor 
cc.lStructSize = Len(cc) 
cc.hwndOwner = Me.hWnd 
cc.hInstance = App.hInstance 
cc.flags = 0 
cc.lpCustColors = String$(16 * 4, 0) 
rtn = ChooseColor(cc) 
If rtn >= 1 Then 
 Colourpreview.BackColor = cc.rgbResult 
 Colour.Text = "Custom Colour is: " & cc.rgbResult 
Else 
 Colour.Text = "Cancel Was Pressed" 
End If 
End Sub 
Private Sub Form_Load() 
Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2 'centre the form on the screen 
'This project was downloaded from 
' 
'http://www.brianharper.demon.co.uk/ 
' 
'Please use this project and all of its source code however you want. 
' 
'UNZIPPING 
'To unzip the project files you will need a 32Bit unzipper program that 
'can handle long file names. If you have a latest copy of Winzip installed 
'on your system then you may use that. If you however dont have a copy, 
'then visit my web site, go into the files section and from there you can 
'click on the Winzip link to goto their site and download a copy of the 
'program. By doing this you will now beable to unzip the project files 
'retaining their proper long file names. 
'Once upzipped, load up your copy of Visual Basic and goto 
'File/Open Project. Locate the project files to where ever you unzipped 
'them, then click Open. The project files will be loaded and are now ready 
'for use. 
' 
'THE PROJECT 
'Do you ever get sick and tired of having to attach many different OCX files 
'with your finished programs, that can be sometimes about half a megabyte in 
'size and can almost triple the size of distribution of your program. Instead 
'of using Visual Basic's OCX for the Custom Colour Dialog, you can call the 
'default Windows 95 one with only one API call to the system. This can be very 
'handy indead and can help a lot if your distribution size of your program must 
'be kept to a minimum. 
' 
'NOTES 
'I have only provided the necessary project files with the zip. This keeps 
'the size of the zip files down to a minimum and enables me to upload more 
'prjects files to my site. 
' 
'I hope you find the project usful in what ever you are programming. I 
'have tried to write out a small explanation of what each line of code 
'does in the project, although most of it is pretty simple to understand. 
' 
'If you find any bugs in the code then please dont hesitate to Email me and 
'I will get back to you as soon as possible. If you however need help on a 
'different matter concerning Visual Basic then please please Email me as 
'I like to here from people and here what they are programming. 
' 
'My Email address is: 
'Brian@brianharper.demon.co.uk 
' 
'My web site is: 
'http://www.brianharper.demon.co.uk/ 
' 
'Please visit my web site and find many other useful projects like this. 
' 
End Sub  
 
  
 作者: 61.142.212.*  2005-10-28 20:57   回复此发言    
 
--------------------------------------------------------------------------------
 
15 鼠标控制演示。提供了一个鼠标控制的类,包括移动、限制、隐藏等功  
 Option Explicit 
DefLng A-Z 
Dim Cursor As cCursor 
Private Sub cmdConfine_Click() 
Static Confined As Boolean 
If Not Confined Then 
 Cursor.ClipTo cmdConfine 
 Confined = True 
Else 
 Cursor.ClipTo Screen 
 Confined = False 
End If 
End Sub 
Private Sub cmdSnap_Click() 
Cursor.SnapTo cmdVisible 
End Sub 
Private Sub cmdVisible_Click() 
Cursor.Visible = Not Cursor.Visible 
End Sub 
Private Sub Form_Click() 
Static Clipped As Boolean 
If Not Clipped Then 
 Cursor.ClipTo Me 
Else 
 Cursor.ClipTo Screen 
End If 
Clipped = Not Clipped 
End Sub 
Private Sub Form_Load() 
Set Cursor = New cCursor 
End Sub 
Private Sub txtX_KeyPress(KeyAscii As Integer) 
If KeyAscii = 13 Then 
 KeyAscii = 0 
 Cursor.X = Val(txtX) 
End If 
End Sub 
Private Sub txtY_KeyPress(KeyAscii As Integer) 
If KeyAscii = 13 Then 
 KeyAscii = 0 
 Cursor.Y = Val(txtY) 
End If 
End Sub 
----------------- 
'===============cCursor.cls=============== 
'Purpose: To provide quick and easy access 
' to cursor functions. 
' 
'Functions/Subs/Properties: 
' -- X (Get/Let): Sets cursor X position 
' -- Y (Get/Let): Sets cursor Y position 
' -- SnapTo: Puts a cursor in the center 
' of a control. 
' -- ClipTo: Restricts the cursor to any 
' square area of movement. 
'========================================= 
Option Explicit 
DefLng A-Z 
Private Type POINTAPI 
 X As Long 
 Y As Long 
End Type 
Private Type RECT 
 Left As Long 
 Top As Long 
 Right As Long 
 Bottom As Long 
End Type 
Private CurVisible As Boolean 
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long 
Private Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long 
Private Declare Function ClientToScreen Lib "user32" (ByVal hWnd As Long, lpPoint As POINTAPI) As Long 
Private Declare Function ClipCursor Lib "user32" (lpRect As RECT) As Long 
Private Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long 
Public Property Get X() As Long 
Dim tmpPoint As POINTAPI 
Call GetCursorPos(tmpPoint) 
X = tmpPoint.X 
End Property 
Public Property Let X(ByVal vNewValue As Long) 
Call SetCursorPos(vNewValue, Y) 
End Property 
Public Property Get Y() As Long 
Dim tmpPoint As POINTAPI 
Call GetCursorPos(tmpPoint) 
Y = tmpPoint.Y 
End Property 
Public Property Let Y(ByVal vNewValue As Long) 
Call SetCursorPos(X, vNewValue) 
End Property 
Public Sub SnapTo(ctl As Control) 
'Snaps the cursor to the center of 
'a given control. 
Dim pnt As POINTAPI 
Dim xx As Long 
Dim yy As Long 
pnt.X = pnt.Y = 0 
'Get Left-Top corner of control 
Call ClientToScreen(ctl.hWnd, pnt) 
xx = pnt.X + (ctl.Width \ 2) 
yy = pnt.Y + (ctl.Height \ 2) 
'xx = pnt.X + ctl.Width / (2 * (Screen.ActiveForm.Left + ctl.Left) / pnt.X) 
'yy = pnt.Y + ctl.Height / (2 * (Screen.ActiveForm.Top + ctl.Top) / pnt.Y) 
Call SetCursorPos(xx, yy) 
End Sub 
Public Sub ClipTo(ToCtl As Object) 
On Error Resume Next 
Dim tmpRect As RECT 
Dim pt As POINTAPI 
With ToCtl 
 If TypeOf ToCtl Is Form Then 
 tmpRect.Left = (.Left \ Screen.TwipsPerPixelX) 
 tmpRect.Top = (.Top \ Screen.TwipsPerPixelY) 
 tmpRect.Right = (.Left + .Width) \ Screen.TwipsPerPixelX 
 tmpRect.Bottom = (.Top + .Height) \ Screen.TwipsPerPixelY 
 ElseIf TypeOf ToCtl Is Screen Then 
 tmpRect.Left = 0 
 tmpRect.Top = 0 
 tmpRect.Right = (.Width \ Screen.TwipsPerPixelX) 
 tmpRect.Bottom = (.Height \ Screen.TwipsPerPixelY) 
 Else 
 pt.X = 0 
 pt.Y = 0 
 Call ClientToScreen(.hWnd, pt) 
 tmpRect.Left = pt.X 
 tmpRect.Top = pt.Y 
 pt.X = .Width 
 pt.Y = .Height 
 Call ClientToScreen(.hWnd, pt) 
 tmpRect.Bottom = pt.Y 
 tmpRect.Right = pt.X 
 End If 
  
 Call ClipCursor(tmpRect) 
End With 
End Sub 
Private Sub Class_Initialize() 
CurVisible = True 
End Sub 
 
Public Property Get Visible() As Boolean 
Visible = CurVisible 
End Property 
Public Property Let Visible(ByVal vNewValue As Boolean) 
CurVisible = vNewValue 
Call ShowCursor(CurVisible) 
End Property  
 
  
 作者: 61.142.212.*  2005-10-28 21:01   回复此发言    
 
--------------------------------------------------------------------------------
 
16 读取注册表的例子,利用了API可读注册表中所有的项目。  
 Option Explicit 
Private Sub cmdDone_Click() 
 End 
End Sub 
Private Sub cmdQuery_Click() 
'* Demonstration of using sdaGetRegEntry to query 
' the system registry 
' Stu Alderman -- 2/30/96 
 Dim lngType As Long, varRetString As Variant 
 Dim lngI As Long, intChar As Integer 
 varRetString = sdaGetRegEntry(cboStartKey, _ 
 txtRegistrationPath, txtRegistrationParameter, _ 
 lngType) 
  
 txtResult = varRetString 
 txtDataType = lngType 
 txtDataLength = Len(varRetString) 
  
 txtHex = "" 
 If Len(varRetString) Then 
 For lngI = 1 To Len(varRetString) 
 intChar = Asc(Mid(varRetString, lngI, 1)) 
 If intChar > 15 Then 
 txtHex = txtHex & Hex(intChar) & " " 
 Else 
 txtHex = txtHex & "0" & Hex(intChar) & " " 
 End If 
 Next lngI 
 End If 
End Sub 
Private Sub Form_Load() 
 cboStartKey.AddItem "HKEY_CLASSES_ROOT" 
 cboStartKey.AddItem "HKEY_CURRENT_CONFIG" 
 cboStartKey.AddItem "HKEY_CURRENT_USER" 
 cboStartKey.AddItem "HKEY_DYN_DATA" 
 cboStartKey.AddItem "HKEY_LOCAL_MACHINE" 
 cboStartKey.AddItem "HKEY_PERFORMANCE_DATA" 
 cboStartKey.AddItem "HKEY_USERS" 
End Sub 
---------------- 
Option Explicit 
Public Const READ_CONTROL = &H20000 
Public Const STANDARD_RIGHTS_READ = (READ_CONTROL) 
Public Const STANDARD_RIGHTS_WRITE = (READ_CONTROL) 
Public Const KEY_QUERY_VALUE = &H1 
Public Const KEY_SET_VALUE = &H2 
Public Const KEY_CREATE_SUB_KEY = &H4 
Public Const KEY_ENUMERATE_SUB_KEYS = &H8 
Public Const KEY_NOTIFY = &H10 
Public Const KEY_CREATE_LINK = &H20 
Public Const SYNCHRONIZE = &H100000 
Public Const STANDARD_RIGHTS_ALL = &H1F0000 
Public Const KEY_READ = ((STANDARD_RIGHTS_READ Or _ 
 KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) _ 
 And (Not SYNCHRONIZE)) 
Public Const KEY_WRITE = ((STANDARD_RIGHTS_WRITE Or _ 
 KEY_SET_VALUE Or KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE)) 
Public Const KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or _ 
 KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY _ 
 Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or KEY_CREATE_LINK) _ 
 And (Not SYNCHRONIZE)) 
Public Const KEY_EXECUTE = ((KEY_READ) And (Not SYNCHRONIZE)) 
Public Const ERROR_SUCCESS = 0& 
Declare Function RegOpenKeyEx Lib "advapi32.dll" _ 
 Alias "RegOpenKeyExA" (ByVal hKey As Long, _ 
 ByVal lpSubKey As String, ByVal ulOptions As Long, _ 
 ByVal samDesired As Long, phkResult As Long) As Long 
Declare Function RegQueryValueEx Lib "advapi32.dll" _ 
 Alias "RegQueryValueExA" (ByVal hKey As Long, _ 
 ByVal lpValueName As String, ByVal lpReserved As Long, _ 
 lpType As Long, lpData As Any, lpcbData As Long) As Long 
Declare Function RegCloseKey Lib "advapi32.dll" _ 
 (ByVal hKey As Long) As Long 
  
Function sdaGetRegEntry(strKey As String, _ 
 strSubKeys As String, strValName As String, _ 
 lngType As Long) As String 
'* Demonstration of win32 API's to query 
' the system registry 
' Stu Alderman -- 2/30/96 
On Error GoTo sdaGetRegEntry_Err 
 Dim lngResult As Long, lngKey As Long 
 Dim lngHandle As Long, lngcbData As Long 
 Dim strRet As String 
 Select Case strKey 
 Case "HKEY_CLASSES_ROOT": lngKey = &H80000000 
 Case "HKEY_CURRENT_CONFIG": lngKey = &H80000005 
 Case "HKEY_CURRENT_USER": lngKey = &H80000001 
 Case "HKEY_DYN_DATA": lngKey = &H80000006 
 Case "HKEY_LOCAL_MACHINE": lngKey = &H80000002 
 Case "HKEY_PERFORMANCE_DATA": lngKey = &H80000004 
 Case "HKEY_USERS": lngKey = &H80000003 
 Case Else: Exit Function 
 End Select 
  
 If Not ERROR_SUCCESS = RegOpenKeyEx(lngKey, _ 
 strSubKeys, 0&, KEY_READ, _ 
 lngHandle) Then Exit Function 
  
 lngResult = RegQueryValueEx(lngHandle, strValName, _ 
 0&, lngType, ByVal strRet, lngcbData) 
 strRet = Space(lngcbData) 
 lngResult = RegQueryValueEx(lngHandle, strValName, _ 
 0&, lngType, ByVal strRet, lngcbData) 
  
 If Not ERROR_SUCCESS = RegCloseKey(lngHandle) Then _ 
 lngType = -1& 
  
 sdaGetRegEntry = strRet 
  
sdaGetRegEntry_Exit: 
 On Error GoTo 0 
 Exit Function 
sdaGetRegEntry_Err: 
 lngType = -1& 
 MsgBox Err & "> " & Error$, 16, _ 
 "GenUtils/sdaGetRegEntry" 
 Resume sdaGetRegEntry_Exit 
End Function  
 
  
 作者: 61.142.212.*  2005-10-28 21:03   回复此发言    
 
--------------------------------------------------------------------------------
 
17 查找/替换  
 Option Explicit 
'Find/Replace Type Structure 
Private Type FINDREPLACE 
 lStructSize As Long 'size of this struct 0x20 
 hwndOwner As Long 'handle to owner's window 
 hInstance As Long 'instance handle of.EXE that contains cust. dlg. template 
 flags As Long 'one or more of the FR_?? 
 lpstrFindWhat As String 'ptr.to search string 
 lpstrReplaceWith As String 'ptr.to replace string 
 wFindWhatLen As Integer 'size of find buffer 
 wReplaceWithLen As Integer 'size of replace buffer 
 lCustData As Long 'data passed to hook fn. 
 lpfnHook As Long 'ptr.to hook fn. or NULL 
 lpTemplateName As String 'custom template name 
End Type 
'Common Dialog DLL Calls 
Private Declare Function FindText Lib "comdlg32.dll" Alias "FindTextA" _ 
(pFindreplace As FINDREPLACE) As Long 
Private Declare Function ReplaceText Lib "comdlg32.dll" Alias "ReplaceTextA" _ 
(pFindreplace As FINDREPLACE) As Long 
'Delcaration of the type structure 
Dim frText As FINDREPLACE 
Private Sub cmdFind_Click() 
 'Call the find text function 
 FindText frText 
End Sub 
Private Sub cmdReplace_Click() 
 'Call the replace text function 
 ReplaceText frText 
End Sub 
Private Sub Form_Load() 
 'Set the Find/Replace Type properties 
 With frText 
 .lpstrReplaceWith = "Replace Text" 
 .lpstrFindWhat = "Find Text" 
 .wFindWhatLen = 9 
 .wReplaceWithLen = 12 
 .hInstance = App.hInstance 
 .hwndOwner = Me.hWnd 
 .lStructSize = LenB(frText) 
 End With 
End Sub  
 
  
 作者: 61.142.212.*  2005-10-28 21:04   回复此发言    
 
--------------------------------------------------------------------------------
 
18 在任务栏中隐藏。  
 Private Sub Form_Load() 
Dim OwnerhWnd As Integer 
 Dim ret As Integer 
 ' Make sure the form is invisible: 
 Form1.Visible = False 
 ' Set interval for timer for 5 seconds, and make sure it is enabled: 
 Timer1.Interval = 5000 
 Timer1.Enabled = True 
 ' Grab the background or owner window: 
 OwnerhWnd = GetWindow(Me.hwnd, GW_OWNER) 
 ' Hide from task list: 
 ret = ShowWindow(OwnerhWnd, SW_HIDE) 
End Sub 
Private Sub timer1_Timer() 
Dim ret As Integer 
 ' Display a message box: 
 ret = MsgBox("Visible by Alt+Tab. Cancel to Quit", 1, "Invisible Form") 
 ' If cancel clicked, end the program: 
 If ret = 2 Then 
 Timer1.Enabled = False 
 Unload Me 
 End 
 End If 
End Sub 
--------------- 
' Enter each of the following Declare statements as one, single line: 
  
 #If Win16 Then 
 Declare Function ShowWindow Lib "User" (ByVal hwnd As Integer, ByVal nCmdShow As Integer) As Integer 
 Declare Function GetWindow Lib "User" (ByVal hwnd As Integer, ByVal wCmd As Integer) As Integer 
 #Else 
 Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long 
 Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long 
 #End If 
 Const SW_HIDE = 0 
 Const GW_OWNER = 4  
 
  
 作者: 61.142.212.*  2005-10-28 21:05   回复此发言    
 
--------------------------------------------------------------------------------
 
19 系统托盘System Tray。  
 Option Explicit 
Private Const SW_SHOW = 1 
Private Declare Function ShellExecute Lib _ 
"shell32.dll" Alias "ShellExecuteA" _ 
(ByVal hwnd As Long, _ 
ByVal lpOperation As String, _ 
ByVal lpFile As String, _ 
ByVal lpParameters As String, _ 
ByVal lpDirectory As String, _ 
ByVal nShowCmd As Long) As Long 
Public Sub Navigate(frm As Form, ByVal WebPageURL As String) 
Dim hBrowse As Long 
hBrowse = ShellExecute(frm.hwnd, "open", WebPageURL, "", "", SW_SHOW) 
End Sub 
Private Sub cmdOK_Click() 
Unload Me 
End Sub 
Private Sub lbl_Click(Index As Integer) 
If Index = 2 Then 'mailto link 
 Navigate Me, "mailto:psyborg@cyberhighway.com" 
ElseIf Index = 5 Then 
 Navigate Me, "http://www.cyberhighway.com/~psy/" 
End If 
End Sub 
---------------- 
Option Explicit 
Private Sub Form_Load() 
'Add the icon to the system tray... 
With nfIconData 
 .hwnd = Me.hwnd 
 .uID = Me.Icon 
 .uFlags = NIF_ICON Or NIF_MESSAGE Or NIF_TIP 
 .uCallbackMessage = WM_MOUSEMOVE 
 .hIcon = Me.Icon.Handle 
 .szTip = "System Tray Example" & Chr$(0) 
 .cbSize = Len(nfIconData) 
End With 
Call Shell_NotifyIcon(NIM_ADD, nfIconData) 
End Sub 
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 
If frmAbout.Visible And X = 7740 Then frmAbout.Hide 
Select Case X 
Case 7680 'MouseMove 
Case 7695 'LeftMouseDown 
 frmAbout.Show 
Case 7710 'LeftMouseUp 
Case 7725 'LeftDblClick 
Case 7740 'RightMouseDown 
 PopupMenu mnuPopup, 0, , , mnuClose 
Case 7755 'RightMouseUp 
Case 7770 'RightDblClick 
End Select 
End Sub 
Private Sub Form_Unload(Cancel As Integer) 
Call Shell_NotifyIcon(NIM_DELETE, nfIconData) 
End 
End Sub 
Private Sub mnuAbout_Click() 
frmAbout.Show 
End Sub 
Private Sub mnuClose_Click() 
Unload Me 
End Sub 
--------------- 
Option Explicit 
'Author: 
' Ben Baird <psyborg@cyberhighway.com> 
' Copyright © 1997, Ben Baird 
' 
'Purpose: 
' Demonstrates setting an icon in the taskbar's 
' system tray without the overhead of subclassing 
' to receive events. 
Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long 
Public Const WM_MOUSEMOVE = &H200 
Public Const NIF_ICON = &H2 
Public Const NIF_MESSAGE = &H1 
Public Const NIF_TIP = &H4 
Public Const NIM_ADD = &H0 
Public Const NIM_DELETE = &H2 
Public Const MAX_TOOLTIP As Integer = 64 
Type NOTIFYICONDATA 
 cbSize As Long 
 hwnd As Long 
 uID As Long 
 uFlags As Long 
 uCallbackMessage As Long 
 hIcon As Long 
 szTip As String * MAX_TOOLTIP 
End Type 
Public nfIconData As NOTIFYICONDATA  
 
  
 作者: 61.142.212.*  2005-10-28 21:08   回复此发言    
 
--------------------------------------------------------------------------------
 
20 用CommonDialog公共对话框选取多个文件。  
 Option Explicit 
Private Sub Command1_Click() 
  
 Dim DlgInfo As DlgFileInfo 
 Dim I As Integer 
  
 On Error GoTo ErrHandle 
  
 '清除List1中的项 
 List1.Clear 
  
 '选择文件 
 With CommonDialog1 
 .CancelError = True 
 .MaxFileSize = 32767 '被打开的文件名尺寸设置为最大,即32K 
 .Flags = cdlOFNHideReadOnly Or cdlOFNAllowMultiselect Or cdlOFNExplorer Or cdlOFNNoDereferenceLinks 
 .DialogTitle = "选择文件" 
 .Filter = "所有类型的文件(*.*)|*.*" 
 .ShowOpen 
 DlgInfo = GetDlgSelectFileInfo(.FileName) 
 .FileName = "" '在打开了*.pif文件后须将Filename属性置空, 
 '否则当选取多个*.pif文件后,当前路径会改变 
 End With 
  
 For I = 1 To DlgInfo.iCount 
 List1.AddItem DlgInfo.sPath & DlgInfo.sFile(I) 
 Next I 
  
 Exit Sub 
ErrHandle: 
 ' 按了“取消”按钮 
End Sub 
Private Sub Command2_Click() 
 End 
End Sub 
------------- 
Option Explicit 
'包含函数: GetDlgSelectFileInfo 
'函数功能: 获取从CommonDialog中选取的文件信息 
'自定义类型,用于DlgSelectFileInfo函数 
Type DlgFileInfo 
 iCount As Long 
 sPath As String 
 sFile() As String 
End Type 
'功能: 返回CommonDialog所选择的文件数量和文件名 
'参数说明: strFileName是CommonDialog.Filename 
'函数类型: DlgFileInfo。这是一个自定义类型,声明如下: 
' Type DlgFileInfo 
' iCount As Long 
' sPath As String 
' sFile() As String 
' End Type 
' 其中,iCount为选择文件的数量,sPath为所选文件的路径,sFile()为所选择的文件名 
'注意事项: 在CommonDialog.ShowOpen后立即使用,以免当前路径被更改 
' 在打开了*.pif文件后须将Filename属性置空,否则当选取多个*.pif文件后,当前路径会改变会 
' 在CommonDialong.Flags属性中使用cdlOFNNoDereferenceLinks风格,就可以正确的返回*.pif文件的文件名了 
Public Function GetDlgSelectFileInfo(strFilename As String) As DlgFileInfo 
  
 '思路: 用CommonDialog控件选择文件后,其Filename属性值如下: 
 ' 1、如果选择的是"C:\Test.txt", Filename="C:\Test.txt", CurDir()="C:\" 
 ' 2、如果选择的是"C:\1\Test.txt",Filename="C:\1\Test.txt", CurDir()="C:\1" 
 ' 3、如果选择的是"C:\1.txt"和"C:\2.txt",则: 
 ' Filename="C:\1 1.txt 2.txt", CurDir()="C:\1" 
 ' 因此先将路径分离开,再利用多文件之间插入的Chr$(0)字符分解各个文件名即可。 
  
 Dim sPath, tmpStr As String 
 Dim sFile() As String 
 Dim iCount As Integer 
 Dim I As Integer 
  
 On Error GoTo ErrHandle 
  
 sPath = CurDir() '获得当前的路径,因为在CommonDialog中改变路径时会改变当前的Path 
 tmpStr = Right$(strFilename, Len(strFilename) - Len(sPath)) '将文件名分离出来 
  
 If Left$(tmpStr, 1) = Chr$(0) Then 
 '选择了多个文件(表现为第一个字符为空格) 
 For I = 1 To Len(tmpStr) 
 If Mid$(tmpStr, I, 1) = Chr$(0) Then 
 iCount = iCount + 1 
 ReDim Preserve sFile(iCount) 
 Else 
 sFile(iCount) = sFile(iCount) & Mid$(tmpStr, I, 1) 
 End If 
 Next I 
 Else 
 '只选择了一个文件(注意:根目录下的文件名除去路径后没有"\") 
 iCount = 1 
 ReDim Preserve sFile(iCount) 
 If Left$(tmpStr, 1) = "\" Then tmpStr = Right$(tmpStr, Len(tmpStr) - 1) 
 sFile(iCount) = tmpStr 
 End If 
  
 GetDlgSelectFileInfo.iCount = iCount 
 ReDim GetDlgSelectFileInfo.sFile(iCount) 
  
 If Right$(sPath, 1) <> "\" Then sPath = sPath & "\" 
 GetDlgSelectFileInfo.sPath = sPath 
  
 For I = 1 To iCount 
 GetDlgSelectFileInfo.sFile(I) = sFile(I) 
 Next I 
  
 Exit Function 
ErrHandle: 
 MsgBox "GetDlgSelectFileInfo函数执行错误!", vbOKOnly + vbCritical, "自定义函数错误" 
End Function  
 
  
 作者: 61.142.212.*  2005-10-28 21:13   回复此发言    
 
--------------------------------------------------------------------------------
 
21 图标提取器(可提取DLL和EXE文件里的ICON)。  
 Private Sub Command1_Click() 
 Dim l1 As Long 
  
 IconPosX = 0: IconPosY = 0 
 l1 = IconMoudle 
 If l1 Then 
 Me.Picture1.Cls 
 Me.Picture2.Cls 
 For i = 0 To IconMax 
 IconCounter(i) = 0 
 Next i 
 IconMax = 0 
 If EnumResourceNames(l1, RT_ICON, AddressOf EnumResProc, 3&) Then 
 End If 
 End If 
End Sub 
Private Sub COpen_Click() 
 If FreeLibrary(IconMoudle) Then 
 End If 
 IconMoudle = 0 
 CommonDialog1.ShowOpen 
  
 Form1.Picture1.Cls 
 Form1.Picture2.Cls 
 lCount = ExtractIcon(App.hInstance, CommonDialog1.FileName, -1) 
 If lCount > 0 Then 
 IconMoudle = LoadLibraryEx(CommonDialog1.FileName, 0&, 2&) 
 Else 
 If CommonDialog1.FileName <> "" Then 
 X1 = MsgBox("这个文件没有包含图标资源") 
 End If 
 End If 
 Command1_Click 
End Sub 
Private Sub Form_Click() 
 Dim l As Long 
 Dim LG1 As Long 
 Dim xt As myType 
 Dim lTemp As Long 
 Dim apIcon As ICONINFO 
  
 LG1 = OleGetIconOfFile("c:\windows\system\ole32.dll", 0&) 
 Debug.Print LG1, GlobalSize(LG1) 
 Call CopyMemory(xt.astr(0), LG1, Len(xt)) 
 lTemp = CreateIconFromResource(xt.astr(0), 1000, 1, &H30000) 
 Debug.Print lTemp 
 If GetIconInfo(lTemp, apIcon) Then 
 Debug.Print lTemp 
 lTemp = CreateIconIndirect(apIcon) 
 End If 
 Form1.Picture1.Cls 
 If DrawIcon(Form1.Picture1.hdc, 0&, 0&, lTemp) Then 
 End If 
End Sub 
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) 
 Dim l As Long 
 Dim l1 As Long 
  
 If Button = vbKeyRButton Then 
 l = (X \ Screen.TwipsPerPixelX) \ 32 
 l1 = (Y \ Screen.TwipsPerPixelY) \ 32 
 lIconCount = l1 * MaxOneLine + l 
 If lIconCount < IconMax Then 
 PopupMenu Form2.m_Main 
 End If 
 End If 
End Sub 
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) 
 If FreeLibrary(IconMoudle) Then 
 End If 
 End 
End Sub 
Private Sub Picture2_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) 
 Dim l As Long 
 Dim l1 As Long 
  
 If Button = vbKeyRButton Then 
 l = (X \ Screen.TwipsPerPixelX) \ 32 
 l1 = (Y \ Screen.TwipsPerPixelY) \ 32 
 lIconCount = l1 * MaxOneLine + l 
 If lIconCount < IconMax Then 
 PopupMenu Form2.m_Main 
 End If 
 End If 
End Sub 
Private Sub Picture2_Paint() 
 Command1_Click 
End Sub 
Private Sub VScroll1_Change() 
 Picture2.Top = 0 - (VScroll1.Value * 32 * Screen.TwipsPerPixelY) 
 VScroll1.Top = 0 + VScroll1.Value * 32 * Screen.TwipsPerPixelY 
 Command1_Click 
End Sub 
----------- 
Private Sub m_Save_Click() 
 'Debug.Print IconCounter(lIconCount) 
 If ExtIconFromMoudle(IconMoudle, IconCounter(lIconCount)) Then 
 Form1.Left = Form1.Left 
 End If 
End Sub 
------------- 
Type myType 
 astr(755) As Byte 
End Type 
Type ICONINFO 
 fIcon As Long 
 xHotspot As Long 
 yHotspot As Long 
 hbmMask As Long 
 hbmColor As Long 
End Type 
Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As Long, ByVal lpszExeFileName As String, ByVal nIconIndex As Long) As Long 
Declare Function ExtractIconEx Lib "shell32.dll" Alias "ExtractIconExA" (ByVal lpszFile As String, ByVal nIconIndex As Long, phiconLarge As Any, phiconSmall As Any, ByVal nIcons As Long) As Long 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:15   回复此发言    
 
--------------------------------------------------------------------------------
 
22 图标提取器(可提取DLL和EXE文件里的ICON)。  
 
Declare Function DrawIcon Lib "user32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal hIcon As Long) As Long 
Declare Function LoadLibraryEx Lib "kernel32" Alias "LoadLibraryExA" (ByVal lpLibFileName As String, ByVal hFile As Long, ByVal dwFlags As Long) As Long 
Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long 
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long 
Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long 
Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Any) As Long 
Declare Function GetLastError Lib "kernel32" () As Long 
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long 
Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long 
Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long 
Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long 
Declare Function GetIconInfo Lib "user32" (ByVal hIcon As Long, piconinfo As ICONINFO) As Long 
Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long 
Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long 
Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long 
Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long 
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, ByVal lpvSource As Any, ByVal cbCopy As Long) 
Declare Function EnumResourceNames Lib "kernel32" Alias "EnumResourceNamesA" (ByVal hModule As Long, ByVal lpType As Any, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long 
Declare Function FindResource Lib "kernel32" Alias "FindResourceA" (ByVal hInstance As Long, ByVal lpName As Any, ByVal lpType As Any) As Long 
Declare Function LoadResource Lib "kernel32" (ByVal hInstance As Long, ByVal hResInfo As Long) As Long 
Declare Function FreeResource Lib "kernel32" (ByVal hResData As Long) As Long 
Declare Function SizeofResource Lib "kernel32" (ByVal hInstance As Long, ByVal hResInfo As Long) As Long 
Declare Function LockResource Lib "kernel32" (ByVal hResData As Long) As Long 
Declare Function LoadIcon Lib "user32" Alias "LoadIconA" (ByVal hInstance As Long, ByVal lpIconName As Any) As Long 
Declare Function CreateIconFromResource Lib "user32" _ 
 (presbits As Byte, ByVal dwResSize As _ 
 Long, ByVal fIcon As Long, ByVal dwVer _ 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:15   回复此发言    
 
--------------------------------------------------------------------------------
 
23 图标提取器(可提取DLL和EXE文件里的ICON)。  
  As Long) As Long 
Declare Function CreateIconIndirect Lib "user32" (piconinfo As ICONINFO) As Long 
Declare Function CoLoadLibrary Lib "ole32.dll" _ 
 (lpszLibName As String, ByVal bAutoFree _ 
 As Long) As Long 
Declare Sub CoFreeLibrary Lib "ole32.dll" (ByVal hInst As Long) 
Declare Function OleGetIconOfFile Lib "ole32.dll" _ 
 (lpszPath As String, ByVal fUseFileAsLabel As Long) _ 
 As Long 
Declare Function GlobalSize Lib "kernel32" (ByVal hMem As _ 
 Long) As Long 
  
  
Public Const GMEM_MOVEABLE = &H2 
Public Const GMEM_ZEROINIT = &H40 
Public Const GENERIC_READ = &H80000000 
Public Const GENERIC_WRITE = &H40000000 
Public Const FILE_ATTRIBUTE_NORMAL = &H80 
Public Const CREATE_ALWAYS = 2 
Public Const CREATE_NEW = 1 
Public Const SRCCOPY = &HCC0020 
Public Const OPEN_EXISTING = 3 
Public Const OPEN_ALWAYS = 4 
Public Const WM_SETICON = &H80 
Public Const RT_ICON = 3& 
Global lNum As Long 
Global lCount As Long 
Global astr As String 
Global X1 As Long 
Global IconPosX As Long 
Global IconPosY As Long 
Global m_Memory As Long 
Global IconCounter(200) As Integer 
Global IconMax As Integer 
Global IconMoudle As Long 
Global MaxOneLine As Long 
Global lIconCount As Long 
Function ExtIconFromMoudle(ByVal hMoudle As Long, ByVal lName As Long) As Boolean 
 Dim lRes As Long 
 Dim lGlobal As Long 
 Dim LG1 As Long 
 Dim xt As myType 
 Dim lTemp As Long 
 Dim lSize As Long 
 Dim apIcon As ICONINFO 
 Dim astr As String 
 Dim lFile As Long 
 Dim ab As Byte 
  
 lRes = FindResource(hMoudle, lName, 3&) 
 lSize = SizeofResource(hMoudle, lRes) 
 lGlobal = LoadResource(hMoudle, lRes) 
 LG1 = LockResource(lGlobal) 
 Call CopyMemory(xt.astr(0), LG1, Len(xt)) 
 lTemp = CreateIconFromResource(xt.astr(0), lSize, 1, &H30000) 
 If GetIconInfo(lTemp, apIcon) Then 
 lTemp = CreateIconIndirect(apIcon) 
 End If 
 Form1.Picture1.Cls 
 If DrawIcon(Form1.Picture1.hdc, 0&, 0&, lTemp) Then 
 Form1.CommonDialog2.ShowSave 
 If Form1.CommonDialog2.FileName = "" Then 
 Exit Function 
 End If 
 astr = Form1.CommonDialog2.FileName 
 lFile = FreeFile 
 Open astr For Binary As lFile 
 ab = 0 
 Put lFile, , ab 
 ab = 0 
 Put lFile, , ab 
 ab = 1 
 Put lFile, , ab 
 ab = 0 
 Put lFile, , ab 
 ab = 1 
 Put lFile, , ab 
 ab = 0 
 Put lFile, , ab 
 If lSize >= 744 Then 
 ab = 32 
 Put lFile, , ab 
 Put lFile, , ab 
 Else 
 ab = 16 
 Put lFile, , ab 
 Put lFile, , ab 
 End If 
 ab = 16 
 Put lFile, , ab 
 ab = 0 
 Put lFile, , ab 
 ab = 0 
 Put lFile, , ab 
 ab = 0 
 Put lFile, , ab 
 ab = 0 
 Put lFile, , ab 
 ab = 0 
 Put lFile, , ab 
 ab = lSize And 255 
 Put lFile, , ab 
 ab = lSize \ 256 
 Put lFile, , ab 
 ab = 0 
 Put lFile, , ab 
 ab = 0 
 Put lFile, , ab 
 ab = 22 
 Put lFile, , ab 
 ab = 0 
 Put lFile, , ab 
 ab = 0 
 Put lFile, , ab 
 ab = 0 
 Put lFile, , ab 
 For i = 0 To lSize - 1 
 Put lFile, , xt.astr(i) 
 Next i 
 Close lFile 
 End If 
End Function 
Function EnumResProc(ByVal hMoudle As Long, _ 
 ByVal lpszType As Long, ByVal lpszName _ 
 As Long, ByVal lParam As Long) As Long 
 Dim lRes As Long 
 Dim lGlobal As Long 
 Dim LG1 As Long 
 Dim xt As myType 
 Dim lTemp As Long 
 Dim lSize As Long 
 Dim apIcon As ICONINFO 
  
 IconCounter(IconMax) = lpszName 
 IconMax = IconMax + 1 
 lRes = FindResource(hMoudle, lpszName, lpszType) 
  
 lSize = SizeofResource(hMoudle, lRes) 
 lGlobal = LoadResource(hMoudle, lRes) 
 LG1 = LockResource(lGlobal) 
 If FreeResource(lGlobal) Then 
 End If 
 Call CopyMemory(xt.astr(0), LG1, Len(xt)) 
  
 lTemp = CreateIconFromResource(xt.astr(0), lSize, 1, &H30000) 
  
 If GetIconInfo(lTemp, apIcon) Then 
 lTemp = CreateIconIndirect(apIcon) 
 End If 
 If DrawIcon(Form1.Picture2.hdc, IconPosX, IconPosY, lTemp) Then 
 If (IconPosX + 96) * Screen.TwipsPerPixelX > Form1.Picture2.ScaleWidth Then 
 IconPosX = 0 
 IconPosY = IconPosY + 32 
 If IconPosY > Form1.Picture2.ScaleHeight \ Screen.TwipsPerPixelY Then 
 Form1.Picture2.Height = Form1.Picture2.Height + (32 * Screen.TwipsPerPixelY) 
 Form1.VScroll1.Max = Form1.VScroll1 + 1 
 End If 
 If MaxOneLine = 0 Then 
 MaxOneLine = IconMax 
 End If 
 Else 
 IconPosX = IconPosX + 32 
 End If 
 End If 
 EnumResProc = True 
End Function  
 
  
 作者: 61.142.212.*  2005-10-28 21:15   回复此发言    
 
--------------------------------------------------------------------------------
 
24 使用调用外部程序函数实现API函数高级功能。  
 Private Sub Command1_Click() 
Shell "rundll.exe user.exe,exitwindows", vbHide '关闭 
End Sub 
Private Sub Command2_Click() 
Shell "rundll.exe user.exe,exitwindowsexec", vbHide '重新启动 
End Sub 
Private Sub Command3_Click() 
Dim FiletoOpen$ 
FiletoOpen = "system.ini" 
Shell "Start.exe " & FiletoOpen, vbHide 
End Sub 
Private Sub Command4_Click() 
Dim PathtoOpen$ 
PathtoOpen = "c:\my documents" 
Shell "explorer.exe " & PathtoOpen, vbNormalFocus 
End Sub 
Private Sub Command5_Click() 
If Dir$("c:\mydos", vbDirectory) = "" Then MkDir "c:\mydos" 
 Shell "xcopy.exe c:\windows\command\*.* c:\mydos/s/e", vbHide 
 Shell "explorer.exe " & "c:\mydos", vbNormalFocus 
End Sub 
Private Sub Command6_Click() 
Open "c:\test.bat" For Output As #1 '建立批处理文件 
Print #1, "copy/?>c:\copyhelp.txt" 
Print #1, "@exit" 
'auto exit when finished :batch file 
Close #1 
Shell "c:\test.bat", vbHide 
Shell "start.exe c:\copyhelp.txt", vbHide 
End Sub 
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 
Label7.ForeColor = vbBlack 
Label8.ForeColor = vbBlack 
End Sub 
Private Sub Label7_Click() 
Shell "start.exe mailto:nwdonkey@371.net", vbHide 
End Sub 
Private Sub Label7_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 
Label7.ForeColor = vbRed 
End Sub 
Private Sub Label8_Click() 
Shell "start.exe http://nwdonkey.uhome.net", vbHide 
End Sub 
Private Sub Label8_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 
Label8.ForeColor = vbRed 
End Sub  
 
  
 作者: 61.142.212.*  2005-10-28 21:16   回复此发言    
 
--------------------------------------------------------------------------------
 
25 拖动没有标题栏的窗体。  
 Option Explicit 
Const HTCAPTION = 2 
Const WM_NCLBUTTONDOWN = &HA1 
Private Declare Function ReleaseCapture Lib "user32" () As Long 
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long 
Private Sub Form_Load() 
 MsgBox "拖动没有标题栏的窗体" 
End Sub 
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) 
 If Button = 1 Then 
 Dim ReturnVal As Long 
 X = ReleaseCapture() 
 ReturnVal = SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0) 
 End If 
End Sub  
 
  
 作者: 61.142.212.*  2005-10-28 21:17   回复此发言    
 
--------------------------------------------------------------------------------
 
26 自动完成字符串填写功能(像IE的地址栏自动完成地址输入)。  
 Option Explicit 
'Windows declarations 
Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize 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 
Private Const CB_FINDSTRING = &H14C 
Private Const CB_ERR = (-1) 
'Declarations for alternate code (see comments below) 
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 
Private Const CB_SETCURSEL = &H14E 
'Private flag 
Private m_bEditFromCode As Boolean 
Private Sub Form_Load() 
 Dim sSysDir As String, sFile As String 
 'Get files from system directory for test list 
 Screen.MousePointer = vbHourglass 
 sSysDir = Space$(256) 
 GetSystemDirectory sSysDir, Len(sSysDir) 
 sSysDir = Left$(sSysDir, InStr(sSysDir, Chr$(0)) - 1) 
 If Right$(sSysDir, 1) <> "\" Then 
 sSysDir = sSysDir & "\" 
 End If 
 sFile = Dir$(sSysDir & "*.*") 
 Do While Len(sFile) 
 Combo1.AddItem sFile 
 sFile = Dir$ 
 Loop 
 Screen.MousePointer = vbDefault 
End Sub 
'Certain keystrokes must be handled differently by the Change 
'event, so set m_bEditFromCode flag if such a key is detected 
Private Sub Combo1_KeyDown(KeyCode As Integer, Shift As Integer) 
 Select Case KeyCode 
 Case vbKeyDelete 
 m_bEditFromCode = True 
 Case vbKeyBack 
 m_bEditFromCode = True 
 End Select 
End Sub 
Private Sub Combo1_Change() 
 Dim i As Long, j As Long 
 Dim strPartial As String, strTotal As String 
 'Prevent processing as a result of changes from code 
 If m_bEditFromCode Then 
 m_bEditFromCode = False 
 Exit Sub 
 End If 
 With Combo1 
 'Lookup list item matching text so far 
 strPartial = .Text 
 i = SendMessage(.hwnd, CB_FINDSTRING, -1, ByVal strPartial) 
 'If match found, append unmatched characters 
 If i <> CB_ERR Then 
 'Get full text of matching list item 
 strTotal = .List(i) 
 'Compute number of unmatched characters 
 j = Len(strTotal) - Len(strPartial) 
 ' 
 If j <> 0 Then 
 'Append unmatched characters to string 
 m_bEditFromCode = True 
 .SelText = Right$(strTotal, j) 
 'Select unmatched characters 
 .SelStart = Len(strPartial) 
 .SelLength = j 
 Else 
 '*** Text box string exactly matches list item *** 
 'Note: The ListIndex is still -1. If you want to 
 'force the ListIndex to the matching item in the 
 'list, uncomment the following line. Note that 
 'PostMessage is required because Windows sets the 
 'ListIndex back to -1 once the Change event returns. 
 'Also note that the following line causes Windows to 
 'select the entire text, which interferes if the 
 'user wants to type additional characters. 
' PostMessage Combo1.hwnd, CB_SETCURSEL, i, 0 
 End If 
 End If 
 End With 
End Sub 
Private Sub cmdClose_Click() 
 Unload Me 
End Sub  
 
  
 作者: 61.142.212.*  2005-10-28 21:18   回复此发言    
 
--------------------------------------------------------------------------------
 
27 在任务条Tray右边出现动画图标。  
 Option Explicit 
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 WM_MOUSEMOVE = &H200 
Private Const NIF_MESSAGE = &H1 
Private Const NIF_ICON = &H2 
Private Const NIF_TIP = &H4 
Private Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean 
Dim t As NOTIFYICONDATA 
Private Sub Form_Load() 
 t.cbSize = Len(t) 
 t.hWnd = Picture1(0).hWnd 
 t.uId = 1& 
 t.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE 
 t.ucallbackMessage = WM_MOUSEMOVE 
 t.hIcon = Picture1(0).Picture 
 t.szTip = "Shell_NotifyIcon ..." & Chr$(0) 
 Shell_NotifyIcon NIM_ADD, t 
 Timer1.Enabled = True 
 Me.Hide 
 App.TaskVisible = False 
End Sub 
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) 
 Timer1.Enabled = False 
 t.cbSize = Len(t) 
 t.hWnd = Picture1(0).hWnd 
 t.uId = 1& 
 Shell_NotifyIcon NIM_DELETE, t 
End Sub 
Private Sub Menu_Click(Index As Integer) 
 Unload Me 
End Sub 
Private Sub picture1_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single) 
 If Hex(X) = "1E3C" Then 
 Me.PopupMenu xx 
 End If 
End Sub 
Private Sub timer1_Timer() 
 Static i As Long, img As Long 
 t.cbSize = Len(t) 
 t.hWnd = Picture1(0).hWnd 
 t.uId = 1& 
 t.uFlags = NIF_ICON 
 t.hIcon = Picture1(i).Picture 
 Shell_NotifyIcon NIM_MODIFY, t 
 Timer1.Enabled = True 
 i = i + 1 
 If i = 2 Then i = 0 
End Sub  
 
  
 作者: 61.142.212.*  2005-10-28 21:20   回复此发言    
 
--------------------------------------------------------------------------------
 
28 支持从文件浏览器里拖入文件。  
 Private Sub Command1_Click() 
  
 ' You can turn the form's / controls ability 
 ' to accept the files by passing the hWnd as 
 ' the first parameter and Ture/False as the 
 ' Second 
  
  
 If Command1.Caption = "&Accept Files" Then 
 ' allow the application to accept files 
 DragAcceptFiles Form1.hWnd, True 
 Command1.Caption = "&Do Not Accept" 
 Else 
 DragAcceptFiles Form1.hWnd, False 
 Command1.Caption = "&Accept Files" 
 End If 
End Sub 
Private Sub Command2_Click() 
 ' Clears the contents of the list box 
 List1.Clear 
End Sub 
Private Sub Command3_Click() 
 ' End the program 
 End 
End Sub 
Private Sub Form_Load() 
 DragAcceptFiles Form1.hWnd, True 
End Sub 
Private Sub Form_Unload(Cancel As Integer) 
 End 
End Sub 
 
-------------- 
' Written, Tested and Debugged by : 
' 
' Joseph J Guadagno 
' 7 East Court 
' Bethpage, NY USA 11714-2210 
' Phone :516-681-7809 
' Fax :516-681-7809 
' Email :TheJammer@msn.com 
' Cserve :75122,2307 
' AOL :JoeJams 
' Prodigy :KJFG12A 
 
' Types Required ---------------------------------- 
Type POINTAPI 
 x As Long 
 y As Long 
End Type 
Type MSG 
 hWnd As Long 
 message As Long 
 wParam As Long 
 lParam As Long 
 time As Long 
 pt As POINTAPI 
End Type 
' End Types Required------------------------------- 
' Declares 
Declare Sub DragAcceptFiles Lib "shell32.dll" (ByVal hWnd As Long, ByVal fAccept As Long) 
Declare Sub DragFinish Lib "shell32.dll" (ByVal hDrop As Long) 
Declare Function DragQueryFile Lib "shell32.dll" Alias "DragQueryFileA" (ByVal hDrop As Long, ByVal UINT As Long, ByVal lpStr As String, ByVal ch As Long) As Long 
Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" (lpMsg As MSG, ByVal hWnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long, ByVal wRemoveMsg As Long) As Long 
' Constants 
Public Const PM_NOREMOVE = &H0 
Public Const PM_NOYIELD = &H2 
Public Const PM_REMOVE = &H1 
Public Const WM_DROPFILES = &H233 
Sub Main() 
 ' In order for this to function properly you should place of of your program 
 ' execution code in the Sub Main(), Make sure you change the project startup 
 ' to sub Main 
  
 Form1.Show 
  
 ' This must be the last line! Nothing gets called after this 
 WatchForFiles 
  
End Sub 
Public Sub WatchForFiles() 
 ' This subrountine watchs for all of your WM_DROPFILES messages 
  
 ' Dim Variables 
 Dim FileDropMessage As MSG ' Msg Type 
 Dim fileDropped As Boolean ' True if Files where dropped 
 Dim hDrop As Long ' Pointer to the dropped file structure 
 Dim filename As String * 128 ' the dropped filename 
 Dim numOfDroppedFiles As Long ' the amount of dropped files 
 Dim curFile As Long ' the current file number 
  
 ' loop to keep checking for files 
 ' NOTE : Do any code you want to execute before this set 
  
 Do 
 ' check for Dropped file messages 
 fileDropped = PeekMessage(FileDropMessage, 0, WM_DROPFILES, WM_DROPFILES, PM_REMOVE Or PM_NOYIELD) 
  
 If fileDropped Then 
  
 ' Get the pointer to the dropped file structure 
 hDrop = FileDropMessage.wParam 
  
 ' Get the toal number of files 
 numOfDroppedFiles = DragQueryFile(hDrop, True, filename, 127) 
 For curFile = 1 To numOfDroppedFiles 
 ' Get the file name 
 ret% = DragQueryFile(hDrop, curFile - 1, filename, 127) 
  
 ' at this pointer you can do what you want with the filename 
 ' the filename will be a full qalified path 
  
 Form1.lblNumDropped = LTrim$(Str$(numOfDroppedFiles)) 
 Form1.List1.AddItem filename 
  
 Next curFile 
  
 ' We are now done with the structure, tell windows to discard it 
  
 DragFinish (hDrop) 
 End If 
  
 ' Be nice and DoEvents 
 DoEvents 
 Loop 
  
End Sub  
 
  
 作者: 61.142.212.*  2005-10-28 21:21   回复此发言    
 
--------------------------------------------------------------------------------
 
29 欢迎Splash窗体。  
 Private Declare Function SetWindowPos Lib "User32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long 
Private Sub Form_Load() 
 Me.WindowState = 0 
 ' 
 '显示在桌面最顶层 
 ' 
 Call Fun_AlwaysOnTop(frmSplash, True) 
  
 frmSplash.Show 
 frmSplash.Refresh 
  
  
 frmWelcome.Show 
  
 frmWelcome.Refresh 
 '****************** 
 '函数:延时2秒运行 
 Fun_SleepTest 2 
 '****************** 
 frmSplash.Hide: Unload frmSplash 
End Sub 
'------------------------------------- 
'函数:显示在桌面最顶层(True是/False否) 
'------------------------------------- 
Private Function Fun_AlwaysOnTop(frmForm As Form, fOnTop As Boolean) 
 Dim lState As Long 
 Const Hwnd_TopMost = -1 
 Const Hwnd_NoTopMost = -2 
 If fOnTop = True Then 
 lState = Hwnd_TopMost 
 Else 
 lState = Hwnd_NoTopMost 
 End If 
 '声明变量 
 Dim iLeft As Integer, iTop As Integer, iWidth As Integer, iHeight As Integer 
 With frmForm 
 iLeft = .Left / Screen.TwipsPerPixelX 
 iTop = .Top / Screen.TwipsPerPixelY 
 iWidth = .Width / Screen.TwipsPerPixelX 
 iHeight = .Height / Screen.TwipsPerPixelY 
 End With 
 Call SetWindowPos(frmForm.hwnd, lState, iLeft, iTop, iWidth, iHeight, 1) 
End Function 
'---------------- 
'函数:延时运行 
'---------------- 
Public Function Fun_SleepTest(X As Integer) 
 Dim StarTime As Single 
 StarTime = Timer 
 Do Until (Timer - StarTime) > X 
' DoEvents$ '转让控制权,以便让操作系统 
 Loop 
End Function 
------------- 
Private Sub Command1_Click() 
 MsgBox "Welcome to VB编程乐园" 
End Sub  
 
  
 作者: 61.142.212.*  2005-10-28 21:22   回复此发言    
 
--------------------------------------------------------------------------------
 
30 针式石英钟例子。  
 Option Explicit 
DefDbl A-Z 
Private Sub Form_Load() 
 Timer1.Interval = 100 
 Width = 4000 
 Height = 4000 
 Left = Screen.Width \ 2 - 2000 
 Top = (Screen.Height - Height) \ 2 
End Sub 
Private Sub Form_Resize() 
Dim I, Angle 
Static flag As Boolean 
If flag = False Then 
 flag = True 
 For I = 0 To 14 
 If I > 0 Then Load Line1(I) 
 Line1(I).Visible = True 
 Line1(I).BorderWidth = 5 
 Line1(I).BorderColor = RGB(200, 100, 60) 
 Next I 
 End If 
 For I = 0 To 14 
 Scale (-1, 1)-(1, -1) 
 Angle = I * 2 * Atn(1) / 3 
 Line1(I).X1 = 0.9 * Cos(Angle) 
 Line1(I).Y1 = 0.9 * Sin(Angle) 
 Line1(I).X2 = Cos(Angle) 
 Line1(I).Y2 = Sin(Angle) 
Next I 
  
End Sub 
Private Sub Timer1_Timer() 
 Const HH = 0 
 Const MH = 13 
 Const SH = 14 
 Dim Angle 
 Static LS 
 If Second(Now) = LS Then Exit Sub 
 LS = Second(Now) 
 Angle = 0.5236 * (15 - (Hour(Now) + Minute(Now) / 60)) 
 Line1(HH).X1 = 0 
 Line1(HH).Y1 = 0 
 Line1(HH).X2 = 0.3 * Cos(Angle) 
 Line1(HH).Y2 = 0.3 * Sin(Angle) 
 Angle = 0.1047 * (75 - (Minute(Now) + Second(Now) / 60)) 
 Line1(MH).X1 = 0 
 Line1(MH).Y1 = 0 
 Line1(MH).X2 = 0.7 * Cos(Angle) 
 Line1(MH).Y2 = 0.7 * Sin(Angle) 
 Angle = 0.5236 * (75 - Second(Now) / 5) 
 Line1(SH).X1 = 0 
 Line1(SH).Y1 = 0 
 Line1(SH).X2 = 0.8 * Cos(Angle) 
 Line1(SH).Y2 = 0.8 * Sin(Angle) 
 Form1.Caption = Str(Now()) 
  
End Sub  
 
  
 作者: 61.142.212.*  2005-10-28 21:23   回复此发言    
 
--------------------------------------------------------------------------------
 
31 看惯了微软那种老气横秋的按纽,这里教你如何改变按纽的前景色。  
 Option Explicit 
Private Sub Form_Load() 
 'Initialize each button color. 
 SetButton Command1.hWnd, vbRed 
 SetButton Command2.hWnd, &H8000& 'Darker green 
 'Assign this one a DT_BOTTOM alignment because 
 'it has a picture. 
 SetButton Command3.hWnd, vbBlue, DT_BOTTOM 
 SetButton Command4.hWnd, &H800000 'Darker brownish-yellow 
End Sub 
Private Sub Form_Unload(Cancel As Integer) 
 'Unhook CommandButtons manually - 
 'Note that this is not really necessary, 
 'but you can do this to remove the 
 'text coloring effect at any time. 
 RemoveButton Command1.hWnd 
 RemoveButton Command2.hWnd 
 RemoveButton Command3.hWnd 
 RemoveButton Command4.hWnd 
End Sub 
---------- 
Option Explicit 
'================================================================== 
' modExtButton.bas 
' From Visual Basic Thunder, www.vbthunder.com 
' 
' This module provides an easy way to change the text color 
' of a VB CommandButton control. To use the code with a 
' CommandButton, you should: 
' 
' - Set the button's Style property to "Graphical" at 
' design time. 
' 
' - Optionally set its BackColor and Picture properties. 
' 
' - Call SetButton in the Form_Load event: 
' SetButton Command1.hWnd, vbBlue 
' (You can do this multiple times during your program's 
' execution, even without calling RemoveButton.) 
' 
' - Call RemoveButton in the Form_Unload event: 
' RemoveButton Command1.hWnd 
' 
'================================================================== 
Private Type RECT 
 Left As Long 
 Top As Long 
 Right As Long 
 Bottom As Long 
End Type 
Private Declare Function GetParent Lib "user32" _ 
 (ByVal hWnd As Long) As Long 
Private Declare Function GetWindowLong Lib "user32" Alias _ 
 "GetWindowLongA" (ByVal hWnd As Long, _ 
 ByVal nIndex As Long) As Long 
Private Declare Function SetWindowLong Lib "user32" Alias _ 
 "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, _ 
 ByVal dwNewLong As Long) As Long 
Private Const GWL_WNDPROC = (-4) 
Private Declare Function GetProp Lib "user32" Alias "GetPropA" _ 
 (ByVal hWnd As Long, ByVal lpString As String) As Long 
Private Declare Function SetProp Lib "user32" Alias "SetPropA" _ 
 (ByVal hWnd As Long, ByVal lpString As String, _ 
 ByVal hData As Long) As Long 
Private Declare Function RemoveProp Lib "user32" Alias _ 
 "RemovePropA" (ByVal hWnd As Long, _ 
 ByVal lpString As String) As Long 
Private 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 
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _ 
 (Destination As Any, Source As Any, ByVal Length As Long) 
'Owner draw constants 
Private Const ODT_BUTTON = 4 
Private Const ODS_SELECTED = &H1 
'Window messages we're using 
Private Const WM_DESTROY = &H2 
Private Const WM_DRAWITEM = &H2B 
Private Type DRAWITEMSTRUCT 
 CtlType As Long 
 CtlID As Long 
 itemID As Long 
 itemAction As Long 
 itemState As Long 
 hwndItem As Long 
 hDC As Long 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:24   回复此发言    
 
--------------------------------------------------------------------------------
 
32 看惯了微软那种老气横秋的按纽,这里教你如何改变按纽的前景色。  
  rcItem As RECT 
 itemData As Long 
End Type 
Private Declare Function GetWindowText Lib "user32" Alias _ 
 "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, _ 
 ByVal cch As Long) As Long 
'Various GDI painting-related functions 
Private Declare Function DrawText Lib "user32" Alias "DrawTextA" _ 
 (ByVal hDC As Long, ByVal lpStr As String, ByVal nCount As Long, _ 
 lpRect As RECT, ByVal wFormat As Long) As Long 
Private Declare Function SetTextColor Lib "gdi32" (ByVal hDC As Long, _ 
 ByVal crColor As Long) As Long 
Private Declare Function SetBkMode Lib "gdi32" (ByVal hDC As Long, _ 
 ByVal nBkMode As Long) As Long 
Private Const TRANSPARENT = 1 
Private Const DT_CENTER = &H1 
Public Enum TextVAligns 
 DT_VCENTER = &H4 
 DT_BOTTOM = &H8 
End Enum 
Private Const DT_SINGLELINE = &H20 
Private Sub DrawButton(ByVal hWnd As Long, ByVal hDC As Long, _ 
rct As RECT, ByVal nState As Long) 
 Dim s As String 
 Dim va As TextVAligns 
 va = GetProp(hWnd, "VBTVAlign") 
 'Prepare DC for drawing 
 SetBkMode hDC, TRANSPARENT 
 SetTextColor hDC, GetProp(hWnd, "VBTForeColor") 
 'Prepare a text buffer 
 s = String$(255, 0) 
 'What should we print on the button? 
 GetWindowText hWnd, s, 255 
 'Trim off nulls 
 s = Left$(s, InStr(s, Chr$(0)) - 1) 
 If va = DT_BOTTOM Then 
 'Adjust specially for VB's CommandButton control 
 rct.Bottom = rct.Bottom - 4 
 End If 
 If (nState And ODS_SELECTED) = ODS_SELECTED Then 
 'Button is in down state - offset 
 'the text 
 rct.Left = rct.Left + 1 
 rct.Right = rct.Right + 1 
 rct.Bottom = rct.Bottom + 1 
 rct.Top = rct.Top + 1 
 End If 
 DrawText hDC, s, Len(s), rct, DT_CENTER Or DT_SINGLELINE _ 
 Or va 
End Sub 
Public Function ExtButtonProc(ByVal hWnd As Long, _ 
ByVal wMsg As Long, ByVal wParam As Long, _ 
ByVal lParam As Long) As Long 
Dim lOldProc As Long 
Dim di As DRAWITEMSTRUCT 
lOldProc = GetProp(hWnd, "ExtBtnProc") 
ExtButtonProc = CallWindowProc(lOldProc, hWnd, wMsg, wParam, lParam) 
If wMsg = WM_DRAWITEM Then 
 CopyMemory di, ByVal lParam, Len(di) 
 If di.CtlType = ODT_BUTTON Then 
 If GetProp(di.hwndItem, "VBTCustom") = 1 Then 
 DrawButton di.hwndItem, di.hDC, di.rcItem, _ 
 di.itemState 
 End If 
 End If 
ElseIf wMsg = WM_DESTROY Then 
 ExtButtonUnSubclass hWnd 
End If 
End Function 
Public Sub ExtButtonSubclass(hWndForm As Long) 
Dim l As Long 
l = GetProp(hWndForm, "ExtBtnProc") 
If l <> 0 Then 
 'Already subclassed 
 Exit Sub 
End If 
SetProp hWndForm, "ExtBtnProc", _ 
 GetWindowLong(hWndForm, GWL_WNDPROC) 
SetWindowLong hWndForm, GWL_WNDPROC, AddressOf ExtButtonProc 
End Sub 
Public Sub ExtButtonUnSubclass(hWndForm As Long) 
Dim l As Long 
l = GetProp(hWndForm, "ExtBtnProc") 
If l = 0 Then 
 'Isn't subclassed 
 Exit Sub 
End If 
SetWindowLong hWndForm, GWL_WNDPROC, l 
RemoveProp hWndForm, "ExtBtnProc" 
End Sub 
Public Sub SetButton(ByVal hWnd As Long, _ 
 ByVal lForeColor As Long, _ 
 Optional ByVal VAlign As TextVAligns = DT_VCENTER) 
Dim hWndParent As Long 
hWndParent = GetParent(hWnd) 
If GetProp(hWndParent, "ExtBtnProc") = 0 Then 
 ExtButtonSubclass hWndParent 
End If 
SetProp hWnd, "VBTCustom", 1 
SetProp hWnd, "VBTForeColor", lForeColor 
SetProp hWnd, "VBTVAlign", VAlign 
End Sub 
Public Sub RemoveButton(ByVal hWnd As Long) 
RemoveProp hWnd, "VBTCustom" 
RemoveProp hWnd, "VBTForeColor" 
RemoveProp hWnd, "VBTVAlign" 
End Sub  
 
  
 作者: 61.142.212.*  2005-10-28 21:24   回复此发言    
 
--------------------------------------------------------------------------------
 
33 调色板应用例子(会把你设定的颜色放到格子里)  
 Option Explicit 
Const DEFAULT_PALETTE As Integer = 15 
Const BLACK_BRUSH As Integer = 4 
Const PC_RESERVED As Integer = &H1& 
Private Type PALETTEENTRY 
 peRed As Byte 
 peGreen As Byte 
 peBlue As Byte 
 peFlags As Byte 
End Type 
Private Type LOGPALETTE 
 palVersion As Integer 
 palNumEntries As Integer 
 palPalEntry(256) As PALETTEENTRY 
End Type 
Private Declare Function GetStockObject Lib "gdi32" (ByVal nIndex As Long) As Long 
Private Declare Function SelectPalette Lib "gdi32" (ByVal hdc As Long, ByVal hPalette As Long, ByVal bForceBackground As Long) As Long 
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long 
Private Declare Function Rectangle Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long 
Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long 
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long 
Private Declare Function GetPaletteEntries Lib "gdi32" (ByVal hPalette As Long, ByVal wStartIndex As Long, ByVal wNumEntries As Long, lpPaletteEntries As PALETTEENTRY) As Long 
Private Declare Function SetPaletteEntries Lib "gdi32" (ByVal hPalette As Long, ByVal wStartIndex As Long, ByVal wNumEntries As Long, lpPaletteEntries As PALETTEENTRY) As Long 
Private Declare Function RealizePalette Lib "gdi32" (ByVal hdc As Long) As Long 
Private Declare Function CreatePalette Lib "gdi32" (lpLogPalette As LOGPALETTE) As Long 
Private Declare Function AnimatePalette Lib "gdi32" (ByVal hPalette As Long, ByVal wStartIndex As Long, ByVal wNumEntries As Long, lpPaletteColors As PALETTEENTRY) As Long 
Dim hSystemPalette As Long 
Dim hCurrentPalette As Long 
Dim Block As Long 
Dim ColorSelected As Integer 
Dim SelectingColor As Boolean 
Private Sub ColorChange(index As Integer) 
'修改颜色设置 
 Dim Dummy As Long 
 Dim NewPaletteEntry As PALETTEENTRY 
  
 If ColorSelected > -1 Then 
 NewPaletteEntry.peRed = Colour(0).Value 
 NewPaletteEntry.peGreen = Colour(1).Value 
 NewPaletteEntry.peBlue = Colour(2).Value 
 NewPaletteEntry.peFlags = PC_RESERVED 
  
 Dummy = AnimatePalette(hCurrentPalette, ColorSelected, 1, NewPaletteEntry) 
  
 '修改Pic2中的颜色 
 Pic2_Paint 
 End If 
End Sub 
Private Sub Colour_GotFocus(index As Integer) 
 SelectingColor = False 
End Sub 
Private Sub Colour_Scroll(index As Integer) 
'颜色滚动条滚动 
 If Not SelectingColor Then 
 Call ColorChange(index) 
 End If 
  
 Label2(index).Caption = Right(Str(Colour(index).Value), 3) 
 ChangeColor index 
End Sub 
Private Sub Colour_Change(index As Integer) 
'颜色滚动条数值变化 
 If Not SelectingColor Then 
 Call ColorChange(index) 
  
 '修改Pic1中的颜色 
 Call PaintSubBlock 
 End If 
  
 Label2(index).Caption = Right(Str(Colour(index).Value), 3) 
 ChangeColor index 
End Sub 
Private Sub Form_Load() 
 Dim LogicalPalette As LOGPALETTE 
 Dim ColorIndex As Integer 
 Dim r As Integer, g As Integer, b As Integer 
 Dim i As Integer, j As Integer 
  
 Block = 16 '每行16块 
 ColorSelected = -1 '未选择颜色 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:25   回复此发言    
 
--------------------------------------------------------------------------------
 
34 调色板应用例子(会把你设定的颜色放到格子里)  
   
 '设置自定义调色板值 
 LogicalPalette.palVersion = &H300 
 LogicalPalette.palNumEntries = 256 
 '设置调色板颜色值 
 For i = 0 To 15 
 For j = 0 To 15 
 LogicalPalette.palPalEntry(i * 16 + j).peRed = i * 17 
 LogicalPalette.palPalEntry(i * 16 + j).peGreen = j * 17 
 LogicalPalette.palPalEntry(i * 16 + j).peBlue = i * j / (i + j + 0.01) * 34 
 LogicalPalette.palPalEntry(i * 16 + j).peFlags = PC_RESERVED 
 Next j, i 
  
 '创建调色板 
 hCurrentPalette = CreatePalette(LogicalPalette) 
 Call Pic1_Paint '绘显示区 
End Sub 
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) 
 Dim Dummy As Integer 
 Dim hSystemPalette As Long 
 Dim hDummyPalette As Long 
  
 hSystemPalette = GetStockObject(DEFAULT_PALETTE) '取得系统缺省调色板 
 hDummyPalette = SelectPalette(Pic1.hdc, hSystemPalette, 0) '恢复缺省调色板 
 hDummyPalette = SelectPalette(Pic2.hdc, hSystemPalette, 0) 
 Dummy = DeleteObject(hCurrentPalette) '删除自定义调色板 
End Sub 
Private Sub Pic1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) 
 Dim BoxHeight As Integer 
 Dim BoxWidth As Integer 
 Dim Row As Integer 
 Dim Column As Integer 
 Dim Dummy As Integer 
 Dim CurrentPaletteEntry As PALETTEENTRY 
  
 '设置选择颜色标志 
 SelectingColor = True 
  
 BoxHeight = Pic1.ScaleHeight \ Block 
 BoxWidth = Pic1.ScaleWidth \ Block 
  
 Row = Y \ BoxHeight 
 Column = X \ BoxWidth 
  
 If Row < Block And Column < Block Then 
 '选择了颜色块 
 ColorSelected = Row * Block + Column 
 Dummy = GetPaletteEntries(hCurrentPalette, ColorSelected, 1, _ 
 CurrentPaletteEntry) 
 Colour(0).Value = CurrentPaletteEntry.peRed 
 Colour(1).Value = CurrentPaletteEntry.peGreen 
 Colour(2).Value = CurrentPaletteEntry.peBlue 
  
 Pic1_Paint '重绘颜色显示 
 Pic2_Paint 
 End If 
End Sub 
Private Sub Pic1_Paint() 
 Dim Row As Integer 
 Dim Column As Integer 
 Dim BoxHeight As Integer 
 Dim BoxWidth As Integer 
 Dim Color As Long 
 Dim ColorIndex As Long 
 Dim hBrush As Long 
 Dim Dummy As Integer 
  
 '应用自定义调色板 
 hSystemPalette = SelectPalette(Pic1.hdc, hCurrentPalette, 0) 
 Dummy = RealizePalette(Pic1.hdc) '确认调色板 
  
 '计算各颜色块大小 
 BoxWidth = Pic1.ScaleWidth \ Block 
 BoxHeight = Pic1.ScaleHeight \ Block 
  
 '绘制各颜色块 
 For ColorIndex = 0 To Block * Block - 1 
 Row = ColorIndex \ Block + 1 '计算行位置(从1开始) 
 Column = ColorIndex Mod Block + 1 '计算列位置 
 hBrush = CreateSolidBrush(&H1000000 Or ColorIndex) '以指定调色板创建画刷 
 Dummy = SelectObject(Pic1.hdc, hBrush) '应用画刷 
 Dummy = Rectangle(Pic1.hdc, (Column - 1) * BoxWidth, (Row - 1) * BoxHeight, _ 
 Column * BoxWidth, Row * BoxHeight) '绘制矩形 
 Dummy = SelectObject(Pic1.hdc, GetStockObject(BLACK_BRUSH)) '恢复缺省画刷 
 Dummy = DeleteObject(hBrush) '删除自创建画刷 
 Next ColorIndex 
  
 '绘制突出显示颜色块 
 PaintSubBlock 
End Sub 
Private Sub PaintSubBlock() 
'该函数用于绘制突出显示颜色块 
'各函数使用同 Pic1_Paint 中 
 Dim Row As Integer 
 Dim Column As Integer 
 Dim BoxHeight As Integer 
 Dim BoxWidth As Integer 
 Dim Color As Long 
 Dim ColorIndex As Long 
 Dim hBrush As Long 
 Dim Dummy As Integer 
  
  
 BoxWidth = Pic1.ScaleWidth \ Block 
 BoxHeight = Pic1.ScaleHeight \ Block 
  
 If ColorSelected > -1 Then 
 '选择了颜色块 
 Row = ColorSelected \ Block + 1 
 Column = ColorSelected Mod Block + 1 
 hBrush = CreateSolidBrush(&H1000000 Or ColorSelected) 
 Dummy = SelectObject(Pic1.hdc, hBrush) 
 Dummy = Rectangle(Pic1.hdc, MaxVal((Column - 1.5) * BoxWidth, 0), _ 
 MaxVal((Row - 1.5) * BoxHeight, 0), MinVal((Column + 0.5), Block) * BoxWidth, _ 
 MinVal((Row + 0.5), Block) * BoxHeight) 
 Dummy = SelectObject(Pic1.hdc, GetStockObject(BLACK_BRUSH)) 
 Dummy = DeleteObject(hBrush) 
 End If 
End Sub 
Private Sub Pic2_Paint() 
'该函数用于绘制颜色显示块(Pic2 控件) 
 Dim hBrush As Long 
 Dim Dummy As Long 
  
 hSystemPalette = SelectPalette(Pic2.hdc, hCurrentPalette, 0) 
 Dummy = RealizePalette(Pic2.hdc) 
 hBrush = CreateSolidBrush(&H1000000 Or ColorSelected) 
 Dummy = SelectObject(Pic2.hdc, hBrush) 
 Dummy = Rectangle(Pic2.hdc, 0, 0, Pic2.ScaleWidth, Pic2.ScaleHeight) 
 Dummy = SelectObject(Pic2.hdc, GetStockObject(BLACK_BRUSH)) 
 Dummy = DeleteObject(hBrush) 
End Sub 
Private Function MaxVal(i1, i2) As Single 
'计算最大值 
 If i1 > i2 Then 
 MaxVal = i1 
 Else 
 MaxVal = i2 
 End If 
End Function 
Private Function MinVal(i1, i2) As Single 
'计算最小值 
 If i1 < i2 Then 
 MinVal = i1 
 Else 
 MinVal = i2 
 End If 
End Function 
Private Sub ChangeColor(index As Integer) 
'修改标签颜色 
 Select Case index 
 Case 0 
 Label2(index).ForeColor = RGB(Colour(index).Value, 0, 0) 
 Case 1 
 Label2(index).ForeColor = RGB(0, Colour(index).Value, 0) 
 Case 2 
 Label2(index).ForeColor = RGB(0, 0, Colour(index).Value) 
 End Select 
End Sub  
 
  
 作者: 61.142.212.*  2005-10-28 21:25   回复此发言    
 
--------------------------------------------------------------------------------
 
35 精彩万花筒(可以生成许多美丽的艺术图案)  
 Public duo As Boolean 
Public icolor As Long 
Private Sub cmddan_Click() 
cdl1.ShowColor 
icolor = cdl1.Color 
duo = False 
End Sub 
Private Sub cmdduo_Click() 
duo = True 
End Sub 
Private Sub cmdexit_Click() 
MsgBox "欢迎再次使用本程序!" & Chr(13) & " 作者:风之影(USTC)", vbInformation + vbOKOnly, "关于" 
End 
End Sub 
Private Sub cmdpaint_Click() 
Const pi = 3.1415926 
Dim temp As Double 
Dim per As Integer 
picpaint.Cls 
a = 95 
ifunction = Int(4 * Rnd) 
cx = 120: cy = 110 
d = 2 * Rnd 
per = Int(Rnd * 5) + 5 
For bt = 0 To pi * (Rnd + 1) Step pi / per 
 bt1 = Cos(bt): bt2 = Sin(bt) 
 For g = 1 To 2 
 For l = -1 To 1 Step 2 
 For z = -90 To 90 Step 5 
 x = z: al = (z + 90) * 2 * pi / 180 
 Select Case ifuncion 
 Case 0 
 y = l * a * Sin(al) * Cos(d * al) 
 Case 1 
 y = l * a * Sin(al) * Sin(d * al) 
 Case 2 
 y = l * a * Cos(al) * Cos(d * al) 
 Case 3 
 y = l * a * Cos(al) * Sin(d * al) 
 End Select 
 If g = 2 Then 
 temp = x: x = y: y = temp 
 End If 
 X1 = x * bt1 - y * bt2 
 Y1 = x * bt2 + y * bt1 
 X2 = cx - X1: Y2 = cy + Y1 
 If z = -90 Then 
 bx = X2: By = Y2 
 picpaint.PSet (bx, By), QBColor(13) 
 ElseIf duo Then 
 Randomize 
 rr = Int(225 * Rnd): gg = Int(225 * Rnd): bb = Int(225 * Rnd) 
 picpaint.Line -(X2, Y2), RGB(rr, gg, bb) 
 Else 
 picpaint.Line -(X2, Y2), icolor 
 End If 
 Next z: Next l: Next g: Next bt 
  
End Sub 
Private Sub cmdsave_Click() 
Dim filename As String 
cdl1.DialogTitle = "保存" 
cdl1.ShowSave 
filename = cdl1.filename 
If filename <> "" Then 
SavePicture picpaint.Image, filename 
End If 
End Sub 
Private Sub Form_Load() 
cdl1.Flags = cdlOFNOverwritePrompt + cdlOFNFileMustExist + cdlOFNCreatePrompt + cdlOFNHideReadOnly 
End Sub  
 
  
 作者: 61.142.212.*  2005-10-28 21:26   回复此发言    
 
--------------------------------------------------------------------------------
 
36 漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
 Private m_cN As cNeoCaption 
Private Sub sub_Skin(fMain As Form, cN As cNeoCaption) 
 cN.ActiveCaptionColor = &HFFFFFF '活动窗体的标题前景色 
 cN.InActiveCaptionColor = &HC0FFC0 '非活动窗体的标题前景色 
 'cN.InActiveCaptionColor = &HC0C0C0 
 cN.ActiveMenuColor = &HC00000 '活动菜单前景色 
 'cN.ActiveMenuColor = &H0 
 cN.ActiveMenuColorOver = &HFF& '激活活动菜单前景色 
 'cN.ActiveMenuColorOver = &H0 
 cN.InActiveMenuColor = &H0 '非活动菜单前景色 
 cN.MenuBackgroundColor = &H8000000F '菜单背景颜色 
 'cN.MenuBackgroundColor = RGB(207, 203, 207) 
 cN.CaptionFont.Name = "宋体" '标题字体 
 cN.CaptionFont.Size = 9 '标题字号 
 cN.MenuFont.Name = "宋体" '菜单字体 
 cN.MenuFont.Size = 9 '菜单字号 
 cN.Attach fMain, fMain.PicCaption.Picture, fMain.PicBorder.Picture, 19, 20, 90, 140, 240, 400 '窗体外观参数 
 fMain.BackColor = &H8000000F '窗体背景 
 'fMain.BackColor = RGB(208, 207, 192) 
 'fMain.BackColor = RGB(207, 203, 207) 
End Sub 
Private Sub Form_Load() 
 Set m_cN = New cNeoCaption 
 Call sub_Skin(Me, m_cN) '更改窗体皮肤 
End Sub 
Private Sub Form_Unload(Cancel As Integer) 
 m_cN.Detach '取消窗体皮肤 
End Sub 
----------- 
Option Explicit 
Public Type POINTAPI 
 x As Long 
 y As Long 
End Type 
Public Type RECT 
 left As Long 
 top As Long 
 right As Long 
 bottom As Long 
End Type 
Public Type Msg 
 hwnd As Long 
 message As Long 
 wParam As Long 
 lParam As Long 
 time As Long 
 pt As POINTAPI 
End Type 
Public Type TPMPARAMS 
 cbSize As Long 
 rcExclude As RECT 
End Type 
Public Const TPM_CENTERALIGN = &H4& 
Public Const TPM_LEFTALIGN = &H0& 
Public Const TPM_LEFTBUTTON = &H0& 
Public Const TPM_RIGHTALIGN = &H8& 
Public Const TPM_RIGHTBUTTON = &H2& 
Public Const TPM_NONOTIFY = &H80& '/* Don't send any notification msgs */ 
Public Const TPM_RETURNCMD = &H100 
Public Const TPM_HORIZONTAL = &H0 '/* Horz alignment matters more */ 
Public Const TPM_VERTICAL = &H40 '/* Vert alignment matters more */ 
 ' Win98/2000 menu animation and menu within menu options: 
Public Const TPM_RECURSE = &H1& 
Public Const TPM_HORPOSANIMATION = &H400& 
Public Const TPM_HORNEGANIMATION = &H800& 
Public Const TPM_VERPOSANIMATION = &H1000& 
Public Const TPM_VERNEGANIMATION = &H2000& 
 ' Win2000 only: 
Public Const TPM_NOANIMATION = &H4000& 
Public Declare Function TrackPopupMenu Lib "user32" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal x As Long, ByVal y As Long, ByVal nReserved As Long, ByVal hwnd As Long, lprc As RECT) As Long 
Public Declare Function TrackPopupMenuByLong Lib "user32" Alias "TrackPopupMenu" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal x As Long, ByVal y As Long, ByVal nReserved As Long, ByVal hwnd As Long, ByVal lprc As Long) As Long 
Public Declare Function TrackPopupMenuEx Lib "user32" (ByVal hMenu As Long, ByVal un As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal hwnd As Long, lpTPMParams As TPMPARAMS) As Long 
' Window MEssages 
Public Const WM_DESTROY = &H2 
Public Const WM_SIZE = &H5 
Public Const WM_SETTEXT = &HC 
Public Const WM_ACTIVATEAPP = &H1C 
Public Const WM_CANCELMODE = &H1F 
Public Const WM_SETCURSOR = &H20 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:32   回复此发言    
 
--------------------------------------------------------------------------------
 
37 漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
 Public Const WM_MEASUREITEM = &H2C 
Public Const WM_DRAWITEM = &H2B 
Public Const WM_STYLECHANGING = &H7C 
Public Const WM_STYLECHANGED = &H7D 
Public Const WM_NCCALCSIZE = &H83 
Public Const WM_NCHITTEST = &H84 
Public Const WM_NCPAINT = &H85 
Public Const WM_NCACTIVATE = &H86 
Public Const WM_NCLBUTTONDOWN = &HA1 
Public Const WM_NCLBUTTONUP = &HA2 
Public Const WM_NCLBUTTONDBLCLK = &HA3 
Public Const WM_KEYDOWN = &H100 
Public Const WM_COMMAND = &H111 
Public Const WM_SYSCOMMAND = &H112 
Public Const WM_INITMENUPOPUP = &H117 
Public Const WM_MENUSELECT = &H11F 
Public Const WM_MENUCHAR = &H120 
Public Const WM_MOUSEMOVE = &H200 
Public Const WM_LBUTTONDOWN = &H201 
Public Const WM_LBUTTONUP = &H202 
Public Const WM_RBUTTONUP = &H205 
Public Const WM_MDIGETACTIVE = &H229 
Public Const WM_ENTERMENULOOP = &H211 
Public Const WM_EXITMENULOOP = &H212 
Public Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long 
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long 
Public Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 
Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 
Public Declare Function GetProp Lib "user32" Alias "GetPropA" (ByVal hwnd As Long, ByVal lpString As String) As Long 
Public Declare Function SetProp Lib "user32" Alias "SetPropA" (ByVal hwnd As Long, ByVal lpString As String, ByVal hData As Long) As Long 
Public Declare Function RemoveProp Lib "user32" Alias "RemovePropA" (ByVal hwnd As Long, ByVal lpString As String) As Long 
Public Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long 
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpFn As Long, ByVal hMod As Long, ByVal dwThreadId As Long) As Long 
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long 
Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 
Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long 
Private Const WH_KEYBOARD As Long = 2 
Private Const WH_MSGFILTER As Long = (-1) 
Private Const MSGF_MENU = 2 
Private Const HC_ACTION = 0 
Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer 
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long) 
' Message filter hook: 
Private m_hMsgHook As Long 
Private m_lMsgHookPtr As Long 
' Keyboard Hook: 
Private m_hKeyHook As Long 
Private m_lKeyHookPtr() As Long 
Private m_lKeyHookCount As Long 
Public Sub AttachKeyboardHook(cN As cNCCalcSize) 
Dim lpFn As Long 
Dim lPtr As Long 
Dim i As Long 
 If m_hKeyHook = 0 Then 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:32   回复此发言    
 
--------------------------------------------------------------------------------
 
38 漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  lpFn = HookAddress(AddressOf KeyboardFilter) 
 m_hKeyHook = SetWindowsHookEx(WH_KEYBOARD, lpFn, 0&, GetCurrentThreadId()) 
 Debug.Assert (m_hKeyHook <> 0) 
 End If 
  
 lPtr = ObjPtr(cN) 
 If GetKeyHookPtrIndex(lPtr) = 0 Then 
 m_lKeyHookCount = m_lKeyHookCount + 1 
 ReDim Preserve m_lKeyHookPtr(1 To m_lKeyHookCount) As Long 
 m_lKeyHookPtr(m_lKeyHookCount) = lPtr 
 End If 
  
End Sub 
Private Function GetKeyHookPtrIndex(ByVal lPtr As Long) As Long 
Dim i As Long 
 For i = 1 To m_lKeyHookCount 
 If m_lKeyHookPtr(i) = lPtr Then 
 GetKeyHookPtrIndex = i 
 Exit For 
 End If 
 Next i 
End Function 
Public Sub DetachKeyboardHook(cN As cNCCalcSize) 
Dim lPtr As Long 
Dim i As Long 
Dim lIdx As Long 
  
 lPtr = ObjPtr(cN) 
 lIdx = GetKeyHookPtrIndex(lPtr) 
  
 If lIdx > 0 Then 
 If m_lKeyHookCount > 1 Then 
 For i = lIdx To m_lKeyHookCount - 1 
 m_lKeyHookPtr(i) = m_lKeyHookPtr(i + 1) 
 Next i 
 m_lKeyHookCount = m_lKeyHookCount - 1 
 ReDim Preserve m_lKeyHookPtr(1 To m_lKeyHookCount) As Long 
 Else 
 m_lKeyHookCount = 0 
 Erase m_lKeyHookPtr 
 End If 
 End If 
  
 If m_lKeyHookCount <= 0 Then 
 If (m_hKeyHook <> 0) Then 
 UnhookWindowsHookEx m_hKeyHook 
 m_hKeyHook = 0 
 End If 
 End If 
  
End Sub 
Private Function GetActiveConsumer(ByRef cM As cNCCalcSize) As Boolean 
Dim i As Long 
 For i = 1 To m_lKeyHookCount 
 If Not m_lKeyHookPtr(i) = 0 Then 
 Set cM = ObjectFromPtr(m_lKeyHookPtr(i)) 
 If cM.WindowActive Then 
 GetActiveConsumer = True 
 Exit Function 
 End If 
 End If 
 Next i 
End Function 
Private Function KeyboardFilter(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 
Dim bKeyUp As Boolean 
Dim bAlt As Boolean, bCtrl As Boolean, bShift As Boolean 
Dim bFKey As Boolean, bEscape As Boolean, bDelete As Boolean 
Dim wMask As KeyCodeConstants 
Dim i As Long 
Dim lPtr As Long 
Dim cM As cNCCalcSize 
On Error GoTo ErrorHandler 
 If nCode = HC_ACTION And m_hKeyHook > 0 Then 
 ' Key up or down: 
 bAlt = ((lParam And &H20000000) = &H20000000) 
 If bAlt And (wParam > 0) And (wParam <> vbKeyMenu) Then 
 bKeyUp = ((lParam And &H80000000) = &H80000000) 
 If Not bKeyUp Then 
 bShift = (GetAsyncKeyState(vbKeyShift) <> 0) 
 bCtrl = (GetAsyncKeyState(vbKeyControl) <> 0) 
 bFKey = ((wParam >= vbKeyF1) And (wParam <= vbKeyF12)) 
 bEscape = (wParam = vbKeyEscape) 
 bDelete = (wParam = vbKeyDelete) 
 If Not (bCtrl Or bFKey Or bEscape Or bDelete) Then 
 If GetActiveConsumer(cM) Then 
 If cM.AltKeyAccelerator(wParam) Then 
 ' Don't pass accelerator on... 
 KeyboardFilter = 1 
 Exit Function 
 End If 
 End If 
 End If 
 End If 
 End If 
 End If 
 KeyboardFilter = CallNextHookEx(m_hKeyHook, nCode, wParam, lParam) 
 Exit Function 
  
ErrorHandler: 
 Debug.Print "Keyboard Hook Error!" 
 Exit Function 
 Resume 0 
End Function 
Public Sub AttachMsgHook(cThis As cToolbarMenu) 
Dim lpFn As Long 
 DetachMsgHook 
 m_lMsgHookPtr = ObjPtr(cThis) 
 lpFn = HookAddress(AddressOf MenuInputFilter) 
 m_hMsgHook = SetWindowsHookEx(WH_MSGFILTER, lpFn, 0&, GetCurrentThreadId()) 
 Debug.Assert (m_hMsgHook <> 0) 
End Sub 
Public Sub DetachMsgHook() 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:32   回复此发言    
 
--------------------------------------------------------------------------------
 
39 漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  If (m_hMsgHook <> 0) Then 
 UnhookWindowsHookEx m_hMsgHook 
 m_hMsgHook = 0 
 End If 
End Sub 
'//////////////// 
'// Menu filter hook just passes to virtual CMenuBar function 
'// 
Private Function MenuInputFilter(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 
Dim cM As cToolbarMenu 
Dim lpMsg As Msg 
 If nCode = MSGF_MENU Then 
 If Not m_lMsgHookPtr = 0 Then 
 Set cM = ObjectFromPtr(m_lMsgHookPtr) 
 CopyMemory lpMsg, ByVal lParam, Len(lpMsg) 
 If (cM.MenuInput(lpMsg)) Then 
 MenuInputFilter = 1 
 Exit Function 
 End If 
 End If 
 End If 
 MenuInputFilter = CallNextHookEx(m_hMsgHook, nCode, wParam, lParam) 
End Function 
Private Function HookAddress(ByVal lPtr As Long) As Long 
 HookAddress = lPtr 
End Function 
Public Property Get ObjectFromPtr(ByVal lPtr As Long) As Object 
Dim objT As Object 
 If Not (lPtr = 0) Then 
 ' Turn the pointer into an illegal, uncounted interface 
 CopyMemory objT, lPtr, 4 
 ' Do NOT hit the End button here! You will crash! 
 ' Assign to legal reference 
 Set ObjectFromPtr = objT 
 ' Still do NOT hit the End button here! You will still crash! 
 ' Destroy the illegal reference 
 CopyMemory objT, 0&, 4 
 End If 
End Property 
-------------- 
Option Explicit 
' declares: 
Private Declare Function IsWindow Lib "user32" (ByVal hwnd As Long) As Long 
Private Declare Function GetProp Lib "user32" Alias "GetPropA" (ByVal hwnd As Long, ByVal lpString As String) As Long 
Private Declare Function SetProp Lib "user32" Alias "SetPropA" (ByVal hwnd As Long, ByVal lpString As String, ByVal hData As Long) As Long 
Private Declare Function RemoveProp Lib "user32" Alias "RemovePropA" (ByVal hwnd As Long, ByVal lpString As String) As Long 
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long 
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long 
Private 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 
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long 
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long 
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _ 
 lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long) 
Private Const GWL_WNDPROC = (-4) 
' SubTimer is independent of VBCore, so it hard codes error handling 
Public Enum EErrorWindowProc 
 eeBaseWindowProc = 13080 ' WindowProc 
 eeCantSubclass ' Can't subclass window 
 eeAlreadyAttached ' Message already handled by another class 
 eeInvalidWindow ' Invalid window 
 eeNoExternalWindow ' Can't modify external window 
End Enum 
Private m_iCurrentMessage As Long 
Private m_iProcOld As Long 
Public Property Get CurrentMessage() As Long 
 CurrentMessage = m_iCurrentMessage 
End Property 
Private Sub ErrRaise(e As Long) 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:32   回复此发言    
 
--------------------------------------------------------------------------------
 
40 漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  Dim sText As String, sSource As String 
 If e > 1000 Then 
 sSource = App.EXEName & ".WindowProc" 
 Select Case e 
 Case eeCantSubclass 
 sText = "Can't subclass window" 
 Case eeAlreadyAttached 
 sText = "Message already handled by another class" 
 Case eeInvalidWindow 
 sText = "Invalid window" 
 Case eeNoExternalWindow 
 sText = "Can't modify external window" 
 End Select 
 Err.Raise e Or vbObjectError, sSource, sText 
 Else 
 ' Raise standard Visual Basic error 
 Err.Raise e, sSource 
 End If 
End Sub 
Sub AttachMessage(iwp As ISubclass, ByVal hwnd As Long, _ 
 ByVal iMsg As Long) 
 Dim procOld As Long, f As Long, c As Long 
 Dim iC As Long, bFail As Boolean 
  
 ' Validate window 
 If IsWindow(hwnd) = False Then ErrRaise eeInvalidWindow 
 If IsWindowLocal(hwnd) = False Then ErrRaise eeNoExternalWindow 
 ' Get the message count 
 c = GetProp(hwnd, "C" & hwnd) 
 If c = 0 Then 
 ' Subclass window by installing window procecure 
 procOld = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc) 
 If procOld = 0 Then ErrRaise eeCantSubclass 
 ' Associate old procedure with handle 
 f = SetProp(hwnd, hwnd, procOld) 
 Debug.Assert f <> 0 
 ' Count this message 
 c = 1 
 f = SetProp(hwnd, "C" & hwnd, c) 
 Else 
 ' Count this message 
 c = c + 1 
 f = SetProp(hwnd, "C" & hwnd, c) 
 End If 
 Debug.Assert f <> 0 
  
 ' SPM - in this version I am allowing more than one class to 
 ' make a subclass to the same hWnd and Msg. Why am I doing 
 ' this? Well say the class in question is a control, and it 
 ' wants to subclass its container. In this case, we want 
 ' all instances of the control on the form to receive the 
 ' form notification message. 
 c = GetProp(hwnd, hwnd & "#" & iMsg & "C") 
 If (c > 0) Then 
 For iC = 1 To c 
 If (GetProp(hwnd, hwnd & "#" & iMsg & "#" & iC) = ObjPtr(iwp)) Then 
 ErrRaise eeAlreadyAttached 
 bFail = True 
 Exit For 
 End If 
 Next iC 
 End If 
  
 If Not (bFail) Then 
 c = c + 1 
 ' Increase count for hWnd/Msg: 
 f = SetProp(hwnd, hwnd & "#" & iMsg & "C", c) 
 Debug.Assert f <> 0 
  
 ' Associate object with message at the count: 
 f = SetProp(hwnd, hwnd & "#" & iMsg & "#" & c, ObjPtr(iwp)) 
 Debug.Assert f <> 0 
 End If 
End Sub 
Sub DetachMessage(iwp As ISubclass, ByVal hwnd As Long, _ 
 ByVal iMsg As Long) 
 Dim procOld As Long, f As Long, c As Long 
 Dim iC As Long, iP As Long, lPtr As Long 
  
 ' Get the message count 
 c = GetProp(hwnd, "C" & hwnd) 
 If c = 1 Then 
 ' This is the last message, so unsubclass 
 procOld = GetProp(hwnd, hwnd) 
 Debug.Assert procOld <> 0 
 ' Unsubclass by reassigning old window procedure 
 Call SetWindowLong(hwnd, GWL_WNDPROC, procOld) 
 ' Remove unneeded handle (oldProc) 
 RemoveProp hwnd, hwnd 
 ' Remove unneeded count 
 RemoveProp hwnd, "C" & hwnd 
 Else 
 ' Uncount this message 
 c = GetProp(hwnd, "C" & hwnd) 
 c = c - 1 
 f = SetProp(hwnd, "C" & hwnd, c) 
 End If 
  
 ' SPM - in this version I am allowing more than one class to 
 ' make a subclass to the same hWnd and Msg. Why am I doing 
 ' this? Well say the class in question is a control, and it 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:32   回复此发言    
 
--------------------------------------------------------------------------------
 
41 漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  ' wants to subclass its container. In this case, we want 
 ' all instances of the control on the form to receive the 
 ' form notification message. 
  
 ' How many instances attached to this hwnd/msg? 
 c = GetProp(hwnd, hwnd & "#" & iMsg & "C") 
 If (c > 0) Then 
 ' Find this iwp object amongst the items: 
 For iC = 1 To c 
 If (GetProp(hwnd, hwnd & "#" & iMsg & "#" & iC) = ObjPtr(iwp)) Then 
 iP = iC 
 Exit For 
 End If 
 Next iC 
  
 If (iP <> 0) Then 
 ' Remove this item: 
 For iC = iP + 1 To c 
 lPtr = GetProp(hwnd, hwnd & "#" & iMsg & "#" & iC) 
 SetProp hwnd, hwnd & "#" & iMsg & "#" & (iC - 1), lPtr 
 Next iC 
 End If 
 ' Decrement the count 
 RemoveProp hwnd, hwnd & "#" & iMsg & "#" & c 
 c = c - 1 
 SetProp hwnd, hwnd & "#" & iMsg & "C", c 
  
 End If 
End Sub 
Private Function WindowProc(ByVal hwnd As Long, ByVal iMsg As Long, _ 
 ByVal wParam As Long, ByVal lParam As Long) _ 
 As Long 
 Dim procOld As Long, pSubclass As Long, f As Long 
 Dim iwp As ISubclass, iwpT As ISubclass 
 Dim iPC As Long, iP As Long, bNoProcess As Long 
 Dim bCalled As Boolean 
  
 ' Get the old procedure from the window 
 procOld = GetProp(hwnd, hwnd) 
 Debug.Assert procOld <> 0 
  
 ' SPM - in this version I am allowing more than one class to 
 ' make a subclass to the same hWnd and Msg. Why am I doing 
 ' this? Well say the class in question is a control, and it 
 ' wants to subclass its container. In this case, we want 
 ' all instances of the control on the form to receive the 
 ' form notification message. 
  
 ' Get the number of instances for this msg/hwnd: 
 bCalled = False 
 iPC = GetProp(hwnd, hwnd & "#" & iMsg & "C") 
 If (iPC > 0) Then 
 ' For each instance attached to this msg/hwnd, call the subclass: 
 For iP = 1 To iPC 
 bNoProcess = False 
 ' Get the object pointer from the message 
 pSubclass = GetProp(hwnd, hwnd & "#" & iMsg & "#" & iP) 
 If pSubclass = 0 Then 
 ' This message not handled, so pass on to old procedure 
 WindowProc = CallWindowProc(procOld, hwnd, iMsg, _ 
 wParam, ByVal lParam) 
 bNoProcess = True 
 End If 
  
 If Not (bNoProcess) Then 
 ' Turn the pointer into an illegal, uncounted interface 
 CopyMemory iwpT, pSubclass, 4 
 ' Do NOT hit the End button here! You will crash! 
 ' Assign to legal reference 
 Set iwp = iwpT 
 ' Still do NOT hit the End button here! You will still crash! 
 ' Destroy the illegal reference 
 CopyMemory iwpT, 0&, 4 
 ' OK, hit the End button if you must--you'll probably still crash, 
 ' but it will be because of the subclass, not the uncounted reference 
  
 ' Store the current message, so the client can check it: 
 m_iCurrentMessage = iMsg 
 m_iProcOld = procOld 
  
 ' Use the interface to call back to the class 
 With iwp 
 ' Preprocess (only check this the first time around): 
 If (iP = 1) Then 
 If .MsgResponse = emrPreprocess Then 
 If Not (bCalled) Then 
 WindowProc = CallWindowProc(procOld, hwnd, iMsg, _ 
 wParam, ByVal lParam) 
 bCalled = True 
 End If 
 End If 
 End If 
 ' Consume (this message is always passed to all control 
 ' instances regardless of whether any single one of them 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:32   回复此发言    
 
--------------------------------------------------------------------------------
 
42 漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  ' requests to consume it): 
 WindowProc = .WindowProc(hwnd, iMsg, wParam, ByVal lParam) 
 ' PostProcess (only check this the last time around): 
 If (iP = iPC) Then 
 If .MsgResponse = emrPostProcess Then 
 If Not (bCalled) Then 
 WindowProc = CallWindowProc(procOld, hwnd, iMsg, _ 
 wParam, ByVal lParam) 
 bCalled = True 
 End If 
 End If 
 End If 
 End With 
 End If 
 Next iP 
 Else 
 ' This message not handled, so pass on to old procedure 
 WindowProc = CallWindowProc(procOld, hwnd, iMsg, _ 
 wParam, ByVal lParam) 
 End If 
End Function 
Public Function CallOldWindowProc( _ 
 ByVal hwnd As Long, _ 
 ByVal iMsg As Long, _ 
 ByVal wParam As Long, _ 
 ByVal lParam As Long _ 
 ) As Long 
 CallOldWindowProc = CallWindowProc(m_iProcOld, hwnd, iMsg, wParam, lParam) 
End Function 
' Cheat! Cut and paste from MWinTool rather than reusing 
' file because reusing file would cause many unneeded dependencies 
Function IsWindowLocal(ByVal hwnd As Long) As Boolean 
 Dim idWnd As Long 
 Call GetWindowThreadProcessId(hwnd, idWnd) 
 IsWindowLocal = (idWnd = GetCurrentProcessId()) 
End Function 
' 
 
-------------- 
Option Explicit 
' declares: 
Private Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long 
Private Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long 
Const cTimerMax = 100 
' Array of timers 
Public aTimers(1 To cTimerMax) As CTimer 
' Added SPM to prevent excessive searching through aTimers array: 
Private m_cTimerCount As Integer 
Function TimerCreate(timer As CTimer) As Boolean 
 ' Create the timer 
 timer.TimerID = SetTimer(0&, 0&, timer.Interval, AddressOf TimerProc) 
 If timer.TimerID Then 
 TimerCreate = True 
 Dim i As Integer 
 For i = 1 To cTimerMax 
 If aTimers(i) Is Nothing Then 
 Set aTimers(i) = timer 
 If (i > m_cTimerCount) Then 
 m_cTimerCount = i 
 End If 
 TimerCreate = True 
 Exit Function 
 End If 
 Next 
 timer.ErrRaise eeTooManyTimers 
 Else 
 ' TimerCreate = False 
 timer.TimerID = 0 
 timer.Interval = 0 
 End If 
End Function 
Public Function TimerDestroy(timer As CTimer) As Long 
 ' TimerDestroy = False 
 ' Find and remove this timer 
 Dim i As Integer, f As Boolean 
 ' SPM - no need to count past the last timer set up in the 
 ' aTimer array: 
 For i = 1 To m_cTimerCount 
 ' Find timer in array 
 If Not aTimers(i) Is Nothing Then 
 If timer.TimerID = aTimers(i).TimerID Then 
 f = KillTimer(0, timer.TimerID) 
 ' Remove timer and set reference to nothing 
 Set aTimers(i) = Nothing 
 TimerDestroy = True 
 Exit Function 
 End If 
 ' SPM: aTimers(1) could well be nothing before 
 ' aTimers(2) is. This original [else] would leave 
 ' timer 2 still running when the class terminates - 
 ' not very nice! Causes serious GPF in IE and VB design 
 ' mode... 
 'Else 
 ' TimerDestroy = True 
 ' Exit Function 
 End If 
 Next 
End Function 
Sub TimerProc(ByVal hwnd As Long, ByVal uMsg As Long, _ 
 ByVal idEvent As Long, ByVal dwTime As Long) 
 Dim i As Integer 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:32   回复此发言    
 
--------------------------------------------------------------------------------
 
43 漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  ' Find the timer with this ID 
 For i = 1 To m_cTimerCount 
 ' SPM: Add a check to ensure aTimers(i) is not nothing! 
 ' This would occur if we had two timers declared from 
 ' the same thread and we terminated the first one before 
 ' the second! Causes serious GPF if we don't do this... 
 If Not (aTimers(i) Is Nothing) Then 
 If idEvent = aTimers(i).TimerID Then 
 ' Generate the event 
 aTimers(i).PulseTimer 
 Exit Sub 
 End If 
 End If 
 Next 
End Sub 
Private Function StoreTimer(timer As CTimer) 
 Dim i As Integer 
 For i = 1 To m_cTimerCount 
 If aTimers(i) Is Nothing Then 
 Set aTimers(i) = timer 
 StoreTimer = True 
 Exit Function 
 End If 
 Next 
End Function 
 
------------- 
Option Explicit 
' ====================================================================================== 
Private Declare Function CreateDCAsNull Lib "gdi32" Alias "CreateDCA" (ByVal lpDriverName As String, lpDeviceName As Any, lpOutput As Any, lpInitData As Any) As Long 
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long 
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long 
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long 
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long 
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long 
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long 
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long 
Private Type BITMAP '24 bytes 
 bmType As Long 
 bmWidth As Long 
 bmHeight As Long 
 bmWidthBytes As Long 
 bmPlanes As Integer 
 bmBitsPixel As Integer 
 bmBits As Long 
End Type 
Private Declare Function GetObjectAPI Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long 
Private m_hDC As Long 
Private m_hBmpOld As Long 
Private m_hBmp As Long 
Private m_lWidth As Long 
Private m_lheight As Long 
Public Sub CreateFromPicture(sPic As IPicture) 
 Dim tB As BITMAP 
 Dim lhDCC As Long, lhDC As Long 
 Dim lhBmpOld As Long 
 GetObjectAPI sPic.Handle, Len(tB), tB 
 Width = tB.bmWidth 
 Height = tB.bmHeight 
 lhDCC = CreateDCAsNull("DISPLAY", ByVal 0&, ByVal 0&, ByVal 0&) 
 lhDC = CreateCompatibleDC(lhDCC) 
 lhBmpOld = SelectObject(lhDC, sPic.Handle) 
 BitBlt hdc, 0, 0, tB.bmWidth, tB.bmHeight, lhDC, 0, 0, vbSrcCopy 
 SelectObject lhDC, lhBmpOld 
 DeleteDC lhDC 
 DeleteDC lhDCC 
End Sub 
Public Property Get hdc() As Long 
 hdc = m_hDC 
End Property 
Public Property Let Width(ByVal lW As Long) 
 If lW > m_lWidth Then 
 pCreate lW, m_lheight 
 End If 
End Property 
Public Property Get Width() As Long 
 Width = m_lWidth 
End Property 
Public Property Let Height(ByVal lH As Long) 
 If lH > m_lheight Then 
 pCreate m_lWidth, lH 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:32   回复此发言    
 
--------------------------------------------------------------------------------
 
44 漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  End If 
End Property 
Public Property Get Height() As Long 
 Height = m_lheight 
End Property 
Private Sub pCreate(ByVal lW As Long, ByVal lH As Long) 
Dim lhDC As Long 
 pDestroy 
 lhDC = CreateDCAsNull("DISPLAY", ByVal 0&, ByVal 0&, ByVal 0&) 
 m_hDC = CreateCompatibleDC(lhDC) 
 m_hBmp = CreateCompatibleBitmap(lhDC, lW, lH) 
 m_hBmpOld = SelectObject(m_hDC, m_hBmp) 
 If m_hBmpOld = 0 Then 
 pDestroy 
 Else 
 m_lWidth = lW 
 m_lheight = lH 
 End If 
 DeleteDC lhDC 
End Sub 
Private Sub pDestroy() 
 If Not m_hBmpOld = 0 Then 
 SelectObject m_hDC, m_hBmpOld 
 m_hBmpOld = 0 
 End If 
 If Not m_hBmp = 0 Then 
 DeleteObject m_hBmp 
 m_hBmp = 0 
 End If 
 m_lWidth = 0 
 m_lheight = 0 
 If Not m_hDC = 0 Then 
 DeleteDC m_hDC 
 m_hDC = 0 
 End If 
End Sub 
Private Sub Class_Terminate() 
 pDestroy 
End Sub 
--------------- 
Option Explicit 
' ======================================================================= 
' MENU private declares: 
' ======================================================================= 
' Menu flag constants: 
Private Const MF_APPEND = &H100& 
Private Const MF_BITMAP = &H4& 
Private Const MF_BYCOMMAND = &H0& 
Private Const MF_BYPOSITION = &H400& 
Private Const MF_CALLBACKS = &H8000000 
Private Const MF_CHANGE = &H80& 
Private Const MF_CHECKED = &H8& 
Private Const MF_CONV = &H40000000 
Private Const MF_DELETE = &H200& 
Private Const MF_DISABLED = &H2& 
Private Const MF_ENABLED = &H0& 
Private Const MF_END = &H80 
Private Const MF_ERRORS = &H10000000 
Private Const MF_GRAYED = &H1& 
Private Const MF_HELP = &H4000& 
Private Const MF_HILITE = &H80& 
Private Const MF_HSZ_INFO = &H1000000 
Private Const MF_INSERT = &H0& 
Private Const MF_LINKS = &H20000000 
Private Const MF_MASK = &HFF000000 
Private Const MF_MENUBARBREAK = &H20& 
Private Const MF_MENUBREAK = &H40& 
Private Const MF_MOUSESELECT = &H8000& 
Private Const MF_OWNERDRAW = &H100& 
Private Const MF_POPUP = &H10& 
Private Const MF_POSTMSGS = &H4000000 
Private Const MF_REMOVE = &H1000& 
Private Const MF_SENDMSGS = &H2000000 
Private Const MF_SEPARATOR = &H800& 
Private Const MF_STRING = &H0& 
Private Const MF_SYSMENU = &H2000& 
Private Const MF_UNCHECKED = &H0& 
Private Const MF_UNHILITE = &H0& 
Private Const MF_USECHECKBITMAPS = &H200& 
Private Const MF_DEFAULT = &H1000& 
Private Const MFT_STRING = MF_STRING 
Private Const MFT_BITMAP = MF_BITMAP 
Private Const MFT_MENUBARBREAK = MF_MENUBARBREAK 
Private Const MFT_MENUBREAK = MF_MENUBREAK 
Private Const MFT_OWNERDRAW = MF_OWNERDRAW 
Private Const MFT_RADIOCHECK = &H200& 
Private Const MFT_SEPARATOR = MF_SEPARATOR 
Private Const MFT_RIGHTORDER = &H2000& 
' New versions of the names... 
Private Const MFS_GRAYED = &H3& 
Private Const MFS_DISABLED = MFS_GRAYED 
Private Const MFS_CHECKED = MF_CHECKED 
Private Const MFS_HILITE = MF_HILITE 
Private Const MFS_ENABLED = MF_ENABLED 
Private Const MFS_UNCHECKED = MF_UNCHECKED 
Private Const MFS_UNHILITE = MF_UNHILITE 
Private Const MFS_DEFAULT = MF_DEFAULT 
' MenuItemInfo Mask constants 
Private Const MIIM_STATE = &H1& 
Private Const MIIM_ID = &H2& 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:32   回复此发言    
 
--------------------------------------------------------------------------------
 
45 漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
 Private Const MIIM_SUBMENU = &H4& 
Private Const MIIM_CHECKMARKS = &H8& 
Private Const MIIM_TYPE = &H10& 
Private Const MIIM_DATA = &H20& 
Private Const SC_RESTORE = &HF120& 
Private Const SC_MOVE = &HF010& 
Private Const SC_SIZE = &HF000& 
Private Const SC_MAXIMIZE = &HF030& 
Private Const SC_MINIMIZE = &HF020& 
Private Const SC_CLOSE = &HF060& 
  
Private Const SC_ARRANGE = &HF110& 
Private Const SC_HOTKEY = &HF150& 
Private Const SC_HSCROLL = &HF080& 
Private Const SC_KEYMENU = &HF100& 
Private Const SC_MOUSEMENU = &HF090& 
Private Const SC_NEXTWINDOW = &HF040& 
Private Const SC_PREVWINDOW = &HF050& 
Private Const SC_SCREENSAVE = &HF140& 
Private Const SC_TASKLIST = &HF130& 
Private Const SC_VSCROLL = &HF070& 
Private Const SC_ZOOM = SC_MAXIMIZE 
Private Const SC_ICON = SC_MINIMIZE 
' Owner draw information: 
Private Const ODS_CHECKED = &H8 
Private Const ODS_DISABLED = &H4 
Private Const ODS_FOCUS = &H10 
Private Const ODS_GRAYED = &H2 
Private Const ODS_SELECTED = &H1 
Private Const ODT_BUTTON = 4 
Private Const ODT_COMBOBOX = 3 
Private Const ODT_LISTBOX = 2 
Private Const ODT_MENU = 1 
Private Type MEASUREITEMSTRUCT 
 CtlType As Long 
 CtlID As Long 
 itemID As Long 
 itemWidth As Long 
 itemHeight As Long 
 ItemData As Long 
End Type 
Private Type DRAWITEMSTRUCT 
 CtlType As Long 
 CtlID As Long 
 itemID As Long 
 itemAction As Long 
 itemState As Long 
 hwndItem As Long 
 hdc As Long 
 rcItem As RECT 
 ItemData As Long 
End Type 
Private Type MENUITEMINFO 
 cbSize As Long 
 fMask As Long 
 fType As Long 
 fState As Long 
 wID As Long 
 hSubMenu As Long 
 hbmpChecked As Long 
 hbmpUnchecked As Long 
 dwItemData As Long 
 dwTypeData As Long 
 cch As Long 
End Type 
Private Type MENUITEMINFO_STRINGDATA 
 cbSize As Long 
 fMask As Long 
 fType As Long 
 fState As Long 
 wID As Long 
 hSubMenu As Long 
 hbmpChecked As Long 
 hbmpUnchecked As Long 
 dwItemData As Long 
 dwTypeData As String 
 cch As Long 
End Type 
Private Type MENUITEMTEMPLATE 
 mtOption As Integer 
 mtID As Integer 
 mtString As Byte 
End Type 
Private Type MENUITEMTEMPLATEHEADER 
 versionNumber As Integer 
 Offset As Integer 
End Type 
Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long 
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long 
Private Declare Function SetMenu Lib "user32" (ByVal hwnd As Long, ByVal hMenu As Long) As Long 
Private Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long 
Private Declare Function GetMenuCheckMarkDimensions Lib "user32" () As Long 
Private Declare Function GetMenuContextHelpId Lib "user32" (ByVal hMenu As Long) As Long 
Private Declare Function GetMenuDefaultItem Lib "user32" (ByVal hMenu As Long, ByVal fByPos As Long, ByVal gmdiFlags As Long) As Long 
Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long 
Private Declare Function GetMenuItemInfo Lib "user32" Alias "GetMenuItemInfoA" (ByVal hMenu As Long, ByVal uItem As Long, ByVal fByPosition As Boolean, lpMenuItemInfo As MENUITEMINFO) As Long 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:32   回复此发言    
 
--------------------------------------------------------------------------------
 
46 漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
 Private Declare Function GetMenuItemInfoStr Lib "user32" Alias "GetMenuItemInfoA" (ByVal hMenu As Long, ByVal uItem As Long, ByVal fByPosition As Boolean, lpMenuItemInfo As MENUITEMINFO_STRINGDATA) As Long 
Private Declare Function SetMenuItemInfo Lib "user32" Alias "SetMenuItemInfoA" (ByVal hMenu As Long, ByVal un As Long, ByVal bool As Boolean, lpcMenuItemInfo As MENUITEMINFO) As Long 
Private Declare Function SetMenuItemInfoStr Lib "user32" Alias "SetMenuItemInfoA" (ByVal hMenu As Long, ByVal un As Long, ByVal bool As Boolean, lpcMenuItemInfo As MENUITEMINFO_STRINGDATA) As Long 
Private Declare Function GetMenuItemRect Lib "user32" (ByVal hwnd As Long, ByVal hMenu As Long, ByVal uItem As Long, lprcItem As RECT) As Long 
Private Declare Function GetMenuState Lib "user32" (ByVal hMenu As Long, ByVal wID As Long, ByVal wFlags As Long) As Long 
Private Declare Function CreateMenu Lib "user32" () As Long 
Private Declare Function DestroyMenu Lib "user32" (ByVal hMenu As Long) As Long 
Private Declare Function CreatePopupMenu Lib "user32" () As Long 
Private Declare Function AppendMenuBylong Lib "user32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As Long) As Long 
Private Declare Function AppendMenuByString Lib "user32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As String) As Long 
Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long 
Private Declare Function ModifyMenu Lib "user32" Alias "ModifyMenuA" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpString As Any) As Long 
Private Declare Function ModifyMenuByLong Lib "user32" Alias "ModifyMenuA" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpString As Long) As Long 
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long 
Private Declare Function InsertMenuByLong Lib "user32" Alias "InsertMenuA" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As Long) As Long 
Private Declare Function InsertMenuByString Lib "user32" Alias "InsertMenuA" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As String) As Long 
Private Declare Function InsertMenuItem Lib "user32" Alias "InsertMenuItemA" (ByVal hMenu As Long, ByVal un As Long, ByVal bool As Boolean, lpcMenuItemInfo As MENUITEMINFO) As Long 
Private Declare Function CheckMenuItem Lib "user32" (ByVal hMenu As Long, ByVal wIDCheckItem As Long, ByVal wCheck As Long) As Long 
Private Declare Function CheckMenuRadioItem Lib "user32" (ByVal hMenu As Long, ByVal un1 As Long, ByVal un2 As Long, ByVal un3 As Long, ByVal un4 As Long) As Long 
Private Declare Function EnableMenuItem Lib "user32" (ByVal hMenu As Long, ByVal wIDEnableItem As Long, ByVal wEnable As Long) As Long 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:32   回复此发言    
 
--------------------------------------------------------------------------------
 
47 漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
 Private Declare Function HiliteMenuItem Lib "user32" (ByVal hwnd As Long, ByVal hMenu As Long, ByVal wIDHiliteItem As Long, ByVal wHilite As Long) As Long 
Private Declare Function MenuItemFromPoint Lib "user32" (ByVal hwnd As Long, ByVal hMenu As Long, ByVal ptScreen As POINTAPI) As Long 
Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long 
' ======================================================================= 
' GDI private declares: 
' ======================================================================= 
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long 
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long 
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long 
Private Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long 
Private Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long 
Private Declare Function SetTextColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long 
Private Declare Function SetBkMode Lib "gdi32" (ByVal hdc As Long, ByVal nBkMode As Long) As Long 
Private Declare Function OffsetRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal y As Long) As Long 
Private Declare Function DrawEdge Lib "user32" (ByVal hdc As Long, qrc As RECT, ByVal edge As Long, ByVal grfFlags As Long) As Long 
Private Declare Function OleTranslateColor Lib "OLEPRO32.DLL" (ByVal OLE_COLOR As Long, ByVal HPALETTE As Long, pccolorref As Long) As Long 
Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long 
Private Declare Function FillRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal hBrush As Long) As Long 
Private Const DT_BOTTOM = &H8 
Private Const DT_CENTER = &H1 
Private Const DT_LEFT = &H0 
Private Const DT_CALCRECT = &H400 
Private Const DT_WORDBREAK = &H10 
Private Const DT_VCENTER = &H4 
Private Const DT_TOP = &H0 
Private Const DT_TABSTOP = &H80 
Private Const DT_SINGLELINE = &H20 
Private Const DT_RIGHT = &H2 
Private Const DT_NOCLIP = &H100 
Private Const DT_INTERNAL = &H1000 
Private Const DT_EXTERNALLEADING = &H200 
Private Const DT_EXPANDTABS = &H40 
Private Const DT_CHARSTREAM = 4 
Private Const DT_NOPREFIX = &H800 
Private Const DT_EDITCONTROL = &H2000& 
Private Const DT_PATH_ELLIPSIS = &H4000& 
Private Const DT_END_ELLIPSIS = &H8000& 
Private Const DT_MODIFYSTRING = &H10000 
Private Const DT_RTLREADING = &H20000 
Private Const DT_WORD_ELLIPSIS = &H40000 
Private Const OPAQUE = 2 
Private Const TRANSPARENT = 1 
' DrawEdge: 
Private Const BDR_RAISEDOUTER = &H1 
Private Const BDR_SUNKENOUTER = &H2 
Private Const BDR_RAISEDINNER = &H4 
Private Const BDR_SUNKENINNER = &H8 
Private Const BDR_OUTER = &H3 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:32   回复此发言    
 
--------------------------------------------------------------------------------
 
48 漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
 Private Const BDR_INNER = &HC 
Private Const BDR_RAISED = &H5 
Private Const BDR_SUNKEN = &HA 
Private Const EDGE_RAISED = (BDR_RAISEDOUTER Or BDR_RAISEDINNER) 
Private Const EDGE_SUNKEN = (BDR_SUNKENOUTER Or BDR_SUNKENINNER) 
Private Const EDGE_ETCHED = (BDR_SUNKENOUTER Or BDR_RAISEDINNER) 
Private Const EDGE_BUMP = (BDR_RAISEDOUTER Or BDR_SUNKENINNER) 
Private Const BF_LEFT = &H1 
Private Const BF_TOP = &H2 
Private Const BF_RIGHT = &H4 
Private Const BF_BOTTOM = &H8 
Private Const BF_TOPLEFT = (BF_TOP Or BF_LEFT) 
Private Const BF_TOPRIGHT = (BF_TOP Or BF_RIGHT) 
Private Const BF_BOTTOMLEFT = (BF_BOTTOM Or BF_LEFT) 
Private Const BF_BOTTOMRIGHT = (BF_BOTTOM Or BF_RIGHT) 
Private Const BF_RECT = (BF_LEFT Or BF_TOP Or BF_RIGHT Or BF_BOTTOM) 
Private Const CLR_INVALID = -1 
' ======================================================================= 
' General Win private declares: 
' ======================================================================= 
Private Declare Function PtInRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal y As Long) As Long 
Private Declare Function MapWindowPoints Lib "user32" (ByVal hwndFrom As Long, ByVal hwndTo As Long, lppt As Any, ByVal cPoints As Long) As Long 
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long 
Private Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long 
Private Declare Function InflateRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal y As Long) As Long 
Private Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer 
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long 
Private Const HWND_DESKTOP = 0 
' ======================================================================= 
' IMPLEMENTATION 
' ======================================================================= 
Private m_cMemDC As cMemDC 
Private m_cToolbarMenu As cToolbarMenu 
Private m_hMenu As Long 
Private m_hWnd As Long 
Private m_tR() As RECT 
Private m_hSubMenu() As Long 
Private m_iCount As Long 
Private m_iDownOn As Long 
Private m_iOver As Long 
Private m_oActiveMenuColor As OLE_COLOR 
Private m_oActiveMenuColorOver As OLE_COLOR 
Private m_oInActiveMenuColor As OLE_COLOR 
Private m_oMenuBackgroundColor As OLE_COLOR 
Private m_lCaptionHeight As Long 
Private m_iRestore As Long 
Private m_hMenuRestore() As Long 
Private m_iMenuPosition() As Long 
Private m_tMIIS() As MENUITEMINFO_STRINGDATA 
Private m_sCaption() As String 
Private m_sShortCut() As String 
Private m_sAccelerator() As String 
Private m_lMenuTextSize() As Long 
Private m_lMenuShortCutSize() As Long 
Private m_iHaveSeenCount As Long 
Private m_hMenuSeen() As Long 
Private m_fnt As StdFont 
Private m_fntSymbol As StdFont 
Private m_lMenuItemHeight As Long 
Private WithEvents m_cTmr As CTimer 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:32   回复此发言    
 
--------------------------------------------------------------------------------
 
49 漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
 
Implements ISubclass 
Friend Property Let Font( _ 
 fntThis As StdFont _ 
 ) 
 Set m_fnt = fntThis 
End Property 
Friend Property Set Font( _ 
 fntThis As StdFont _ 
 ) 
 Set m_fnt = fntThis 
 m_fntSymbol.Name = "Marlett" 
 m_fntSymbol.Size = m_fnt.Size * 1.2 
End Property 
Friend Property Get Font() As StdFont 
 Set Font = m_fnt 
End Property 
Friend Sub SetColors( _ 
 ByVal oActiveMenuColor As OLE_COLOR, _ 
 ByVal oActiveMenuColorOver As OLE_COLOR, _ 
 ByVal oInActiveMenuColor As OLE_COLOR, _ 
 ByVal oMenuBackgroundColor As OLE_COLOR _ 
 ) 
 m_oActiveMenuColor = oActiveMenuColor 
 m_oActiveMenuColorOver = oActiveMenuColorOver 
 m_oInActiveMenuColor = oInActiveMenuColor 
 m_oMenuBackgroundColor = oMenuBackgroundColor 
End Sub 
Private Property Get hFont() As Long 
Dim iFn As IFont 
 Set iFn = m_fnt 
 hFont = iFn.hFont 
End Property 
Private Property Get hFontSymbol() As Long 
Dim iFn As IFont 
 Set iFn = m_fntSymbol 
 hFontSymbol = iFn.hFont 
End Property 
Public Property Let hMenu(ByVal hTheMenu As Long) 
 m_hMenu = hTheMenu 
End Property 
Public Property Get hMenu() As Long 
 hMenu = m_hMenu 
End Property 
Public Sub Attach(ByVal lhWnd As Long) 
 LockWindowUpdate lhWnd 
 Detach 
 m_hWnd = lhWnd 
 Set m_cToolbarMenu = New cToolbarMenu 
 m_cToolbarMenu.CoolMenuAttach m_hWnd, Me 
 AttachMessage Me, m_hWnd, WM_LBUTTONDOWN 
 AttachMessage Me, m_hWnd, WM_MOUSEMOVE 
 AttachMessage Me, m_hWnd, WM_DRAWITEM 
 AttachMessage Me, m_hWnd, WM_MEASUREITEM 
 AttachMessage Me, m_hWnd, WM_MENUCHAR 
 LockWindowUpdate 0 
End Sub 
Public Sub Detach() 
 If Not m_hWnd = 0 Then 
 DetachMessage Me, m_hWnd, WM_LBUTTONDOWN 
 DetachMessage Me, m_hWnd, WM_MOUSEMOVE 
 DetachMessage Me, m_hWnd, WM_DRAWITEM 
 DetachMessage Me, m_hWnd, WM_MEASUREITEM 
 DetachMessage Me, m_hWnd, WM_MENUCHAR 
 End If 
 If Not m_cToolbarMenu Is Nothing Then 
 m_cToolbarMenu.CoolMenuDetach 
 Set m_cToolbarMenu = Nothing 
 End If 
End Sub 
Public Property Let CaptionHeight(ByVal lHeight As Long) 
 m_lCaptionHeight = lHeight 
End Property 
Public Sub Render( _ 
 ByVal hFnt As Long, _ 
 ByVal lhDC As Long, _ 
 ByVal lLeft As Long, _ 
 ByVal lTop As Long, _ 
 ByVal lWidth As Long, _ 
 ByVal lHeight As Long, _ 
 ByVal lYoffset As Long _ 
 ) 
Dim iIdx As Long 
Dim lC As Long 
Dim lhDCC As Long 
Dim tMII As MENUITEMINFO_STRINGDATA 
Dim sCap As String 
Dim hFntOld As Long 
Dim tTR As RECT, tBR As RECT 
Dim lX As Long 
Dim lR As Long 
Dim bPress As Boolean 
Dim lID As Long 
 If Not (m_hMenu = 0) Then 
 m_cMemDC.Width = lWidth 
 m_cMemDC.Height = lHeight 
 lhDCC = m_cMemDC.hdc 
 hFntOld = SelectObject(lhDCC, hFnt) 
 m_iCount = 0 
 Erase m_tR 
 lC = GetMenuItemCount(m_hMenu) 
 If lC > 0 Then 
 lX = 8 
 lTop = lTop + 2 
 BitBlt lhDCC, 0, 0, lWidth, lHeight, lhDC, lLeft, lTop, vbSrcCopy 
 SetBkMode lhDCC, TRANSPARENT 
 For iIdx = 0 To lC - 1 
 lID = GetMenuItemID(m_hMenu, iIdx) 
 If lID = -1 Then 
 tMII.fMask = MIIM_TYPE 
 tMII.cch = 127 
 tMII.dwTypeData = String$(128, 0) 
 tMII.cbSize = LenB(tMII) 
 lR = GetMenuItemInfoStr(m_hMenu, iIdx, True, tMII) 
 If (tMII.fType And MFT_STRING) = MFT_STRING Then 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:32   回复此发言    
 
--------------------------------------------------------------------------------
 
50 漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  If tMII.cch > 0 Then 
 sCap = left$(tMII.dwTypeData, tMII.cch) 
 Else 
 sCap = "" 
 End If 
 tTR.top = 0 
 tTR.bottom = lHeight 
 tTR.left = 0: tTR.right = 0 
 DrawText lhDCC, sCap, -1, tTR, DT_CALCRECT 
 OffsetRect tTR, lX, 2 
 LSet tBR = tTR 
 InflateRect tBR, 2, 2 
 tBR.right = tBR.right + 7 
 m_iCount = m_iCount + 1 
 bPress = False 
 If m_iCount = m_iDownOn Then 
 ' This is the item that was clicked: 
 If m_iDownOn = m_iOver Then 
 ' Draw Pressed 
 'Debug.Print "DrawPressed" 
 bPress = True 
 SetTextColor lhDCC, TranslateColor(m_oActiveMenuColorOver) 
 DrawEdge lhDCC, tBR, BDR_SUNKENOUTER, BF_RECT 
 Else 
 ' Draw Raised 
 'Debug.Print "DrawRaised" 
 SetTextColor lhDCC, TranslateColor(m_oActiveMenuColorOver) 
 DrawEdge lhDCC, tBR, BDR_RAISEDINNER, BF_RECT 
 End If 
 Else 
 ' Not down on, may be over: 
 If m_iCount = m_iOver Then 
 ' Draw Raised 
 'Debug.Print "DrawRaised" 
 SetTextColor lhDCC, TranslateColor(m_oActiveMenuColorOver) 
 DrawEdge lhDCC, tBR, BDR_RAISEDINNER, BF_RECT 
 Else 
 ' Draw None 
 SetTextColor lhDCC, TranslateColor(m_oActiveMenuColor) 
 End If 
 End If 
 If bPress Then 
 OffsetRect tTR, 1, 1 
 End If 
 DrawText lhDCC, sCap, -1, tTR, DT_LEFT Or DT_SINGLELINE 
 If bPress Then 
 OffsetRect tTR, -1, -1 
 End If 
 ReDim Preserve m_tR(1 To m_iCount) As RECT 
 ReDim Preserve m_hSubMenu(1 To m_iCount) As Long 
 OffsetRect tBR, lLeft, lYoffset 
 LSet m_tR(m_iCount) = tBR 
 m_hSubMenu(m_iCount) = GetSubMenu(m_hMenu, iIdx) 
 lX = lX + tTR.right - tTR.left + 1 + 10 
 End If 
 End If 
 Next iIdx 
 BitBlt lhDC, lLeft, lTop, lWidth, lHeight, lhDCC, 0, 0, vbSrcCopy 
 End If 
  
 SelectObject lhDCC, hFntOld 
 End If 
End Sub 
Friend Function AltKeyAccelerator(ByVal vKey As KeyCodeConstants) As Boolean 
Dim lC As Long 
Dim iIdx As Long 
Dim tMII As MENUITEMINFO_STRINGDATA 
Dim lR As Long 
Dim sCap As String 
Dim iPos As Long 
Dim sAccel As String 
 lC = GetMenuItemCount(m_hMenu) 
 If lC > 0 Then 
 For iIdx = 0 To lC - 1 
 tMII.fMask = MIIM_TYPE Or MIIM_DATA 
 tMII.cch = 127 
 tMII.dwTypeData = String$(128, 0) 
 tMII.cbSize = LenB(tMII) 
 lR = GetMenuItemInfoStr(m_hMenu, iIdx, True, tMII) 
 If tMII.cch > 0 Then 
 sCap = left$(tMII.dwTypeData, tMII.cch) 
 iPos = InStr(sCap, "&") 
 If iPos > 0 And iPos < Len(sCap) Then 
 sAccel = UCase$(Mid$(sCap, iPos + 1, 1)) 
 If sAccel = Chr$(vKey) Then 
 PressButton iIdx + 1, True 
 If Not m_cTmr Is Nothing Then 
 m_cTmr.Interval = 0 
 End If 
 lR = m_cToolbarMenu.TrackPopup(m_iDownOn) 
 pRestoreList 
 AltKeyAccelerator = True 
 End If 
 End If 
 End If 
 Next iIdx 
 End If 
End Function 
Private Function MenuHitTest() As Long 
 If m_iCount > 0 Then 
 Dim tP As POINTAPI 
 GetCursorPos tP 
 MenuHitTest = HitTest(tP) 
 End If 
  
End Function 
Friend Function HitTest(tP As POINTAPI) As Long 
 ' Is tP within a top level menu button? tP 
 ' is in screen coords 
 ' 
Dim iMenu As Long 
 ScreenToClient m_hWnd, tP 
 For iMenu = 1 To m_iCount 
 'Debug.Print m_tR(iMenu).left, m_tR(iMenu).top, m_tR(iMenu).right, m_tR(iMenu).bottom, tP.x, tP.y 
 If PtInRect(m_tR(iMenu), tP.x, tP.y) <> 0 Then 
 
 
51 漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  HitTest = iMenu 
 Exit Function 
 End If 
 Next iMenu 
End Function 
Friend Property Get Count() As Long 
  
 ' Number of top level menu items:? 
 ' 
 Count = m_iCount 
  
End Property 
Friend Function GetMenuHandle(ByVal iNewPopup As Long) As Long 
  
 ' Returns the popup menu handle for a given top level 
 ' menu item (1 based index) 
 ' 
 If iNewPopup > 0 And iNewPopup <= m_iCount Then 
 GetMenuHandle = m_hSubMenu(iNewPopup) 
 End If 
End Function 
Friend Sub PressButton(ByVal iButton As Long, ByVal bState As Boolean) 
 ' 
 If bState Then 
 m_iDownOn = iButton 
 Else 
 If m_iDownOn = iButton Then 
 m_iDownOn = -1 
 End If 
 End If 
 SendMessageLong m_hWnd, WM_NCPAINT, 0, 0 
  
End Sub 
Friend Sub GetRect(ByVal iButton As Long, ByRef tR As RECT) 
Dim tRW As RECT 
 If iButton > 0 And iButton <= m_iCount Then 
 LSet tR = m_tR(iButton) 
 GetWindowRect m_hWnd, tRW 
 OffsetRect tR, tRW.left, tRW.top + m_lCaptionHeight 
 End If 
End Sub 
Friend Property Get HotItem() As Long 
 ' 
 HotItem = m_iDownOn 
End Property 
Friend Property Let HotItem(ByVal iHotItem As Long) 
 ' Set the hotitem 
 m_iOver = iHotItem 
 ' Repaint: 
 SendMessageLong m_hWnd, WM_NCPAINT, 0, 0 
End Property 
Friend Sub OwnerDrawMenu(ByVal hMenu As Long) 
Dim lC As Long 
Dim tMIIS As MENUITEMINFO_STRINGDATA 
Dim tMII As MENUITEMINFO 
Dim iMenu As Long 
Dim sCap As String 
Dim sShortCut As String 
Dim tR As RECT 
Dim iPos As Long 
Dim lID As Long 
Dim bHaveSeen As Boolean 
Dim hFntOld As Long 
Dim lMenuTextSize As Long 
Dim lMenuShortCutSize As Long 
Dim i As Long 
  
 ' Set OD flag on the fly... 
 bHaveSeen = pbHaveSeen(hMenu) 
 hFntOld = SelectObject(m_cMemDC.hdc, hFont) 
 lC = GetMenuItemCount(hMenu) 
 For iMenu = 0 To lC - 1 
  
 If Not bHaveSeen Then 
  
 tMIIS.fMask = MIIM_TYPE Or MIIM_DATA Or MIIM_ID 
 tMIIS.cch = 127 
 tMIIS.dwTypeData = String$(128, 0) 
 tMIIS.cbSize = LenB(tMIIS) 
 GetMenuItemInfoStr hMenu, iMenu, True, tMIIS 
 'Debug.Print "New Item", tMIIS.dwTypeData 
  
 lID = plAddToRestoreList(hMenu, iMenu, tMIIS) 
  
 If Not (tMIIS.fType And MFT_OWNERDRAW) = MFT_OWNERDRAW Then 
 ' Setting this flag causes tMIIS.dwTypeData to be 
 ' overwritten with our own app-defined value: 
 tMII.fType = tMIIS.fType Or MFT_OWNERDRAW 
 tMII.dwItemData = lID 
 tMII.cbSize = LenB(tMII) 
 tMII.fMask = MIIM_TYPE Or MIIM_DATA 
 SetMenuItemInfo hMenu, iMenu, True, tMII 
 End If 
  
 Else 
  
 tMII.fMask = MIIM_TYPE Or MIIM_DATA 
 tMII.cbSize = Len(tMII) 
 GetMenuItemInfo hMenu, iMenu, True, tMII 
 lID = tMII.dwItemData 
  
 If Not ((tMII.fType And MFT_OWNERDRAW) = MFT_OWNERDRAW) Then 
  
 lID = plReplaceIndex(hMenu, iMenu) 
  
 'Debug.Print "VB has done something to it!", lID 
 tMIIS.fMask = MIIM_TYPE Or MIIM_DATA Or MIIM_ID 
 tMIIS.cch = 127 
 tMIIS.dwTypeData = String$(128, 0) 
 tMIIS.cbSize = LenB(tMIIS) 
 GetMenuItemInfoStr hMenu, iMenu, True, tMIIS 
  
 pReplaceRestoreList lID, hMenu, iMenu, tMIIS 
  
 ' Setting this flag causes tMIIS.dwTypeData to be 
 ' overwritten with our own app-defined value: 
 tMII.fType = tMIIS.fType Or MFT_OWNERDRAW 
 tMII.dwItemData = lID 
 tMII.cbSize = LenB(tMII) 
 tMII.fMask = MIIM_TYPE Or MIIM_DATA 
 SetMenuItemInfo hMenu, iMenu, True, tMII 
  
 End If 
  
 End If 
  
 If lID > 0 And lID <= m_iRestore Then 
 sCap = m_sCaption(lID) 
 sShortCut = m_sShortCut(lID) 
  
 'Debug.Print m_sCaption(lID), m_sShortCut(lID) 
  
 DrawText m_cMemDC.hdc, sCap, -1, tR, DT_LEFT Or DT_SINGLELINE Or DT_CALCRECT 
 If tR.right - tR.left + 1 > lMenuTextSize Then 
 lMenuTextSize = tR.right - tR.left + 1 
 End If 
 If Len(sShortCut) > 0 Then 
 DrawText m_cMemDC.hdc, sShortCut, -1, tR, DT_LEFT Or DT_SINGLELINE Or DT_CALCRECT 
 If tR.right - tR.left + 1 > lMenuShortCutSize Then 
 lMenuShortCutSize = tR.right - tR.left + 1 
 End If 
 End If 
 m_lMenuItemHeight = tR.bottom - tR.top + 1 
  
 Else 
 'Debug.Print "ERROR! ERROR! ERROR!" 
 End If 
  
 Next iMenu 
  
 For i = 1 To m_iRestore 
 If m_hMenuRestore(i) = hMenu Then 
 m_lMenuTextSize(i) = lMenuTextSize 
 m_lMenuShortCutSize(i) = lMenuShortCutSize 
 End If 
 Next i 
  
 SelectObject m_cMemDC.hdc, hFntOld 
  
End Sub 
Private Function pbHaveSeen(ByVal hMenu As Long) As Boolean 
  
 ' When WM_INITMENUPOPUP fires, this may or not be 
 ' a new menu. We use an array to store which menus 
 ' we've already worked on: 
Dim i As Long 
  
 For i = 1 To m_iHaveSeenCount 
 If hMenu = m_hMenuSeen(i) Then 
 pbHaveSeen = True 
 Exit Function 
 End If 
 Next i 
 m_iHaveSeenCount = m_iHaveSeenCount + 1 
 ReDim Preserve m_hMenuSeen(1 To m_iHaveSeenCount) As Long 
 m_hMenuSeen(m_iHaveSeenCount) = hMenu 
End Function 
Private Function plReplaceIndex(ByVal hMenu As Long, ByVal iMenu As Long) 
Dim i As Long 
 For i = 1 To m_iRestore 
 If m_hMenuRestore(i) = hMenu Then 
 If m_iMenuPosition(i) = iMenu Then 
 p  
 
  
 作者: 61.142.212.*  2005-10-28 21:32   回复此发言    
 
--------------------------------------------------------------------------------
 
52 回复 50:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
 Private m_cMemDC As cMemDC 
Private m_cToolbarMenu As cToolbarMenu 
Private m_hMenu As Long 
Private m_hWnd As Long 
Private m_tR() As RECT 
Private m_hSubMenu() As Long 
Private m_iCount As Long 
Private m_iDownOn As Long 
Private m_iOver As Long 
Private m_oActiveMenuColor As OLE_COLOR 
Private m_oActiveMenuColorOver As OLE_COLOR 
Private m_oInActiveMenuColor As OLE_COLOR 
Private m_oMenuBackgroundColor As OLE_COLOR 
Private m_lCaptionHeight As Long 
Private m_iRestore As Long 
Private m_hMenuRestore() As Long 
Private m_iMenuPosition() As Long 
Private m_tMIIS() As MENUITEMINFO_STRINGDATA 
Private m_sCaption() As String 
Private m_sShortCut() As String 
Private m_sAccelerator() As String 
Private m_lMenuTextSize() As Long 
Private m_lMenuShortCutSize() As Long 
Private m_iHaveSeenCount As Long 
Private m_hMenuSeen() As Long 
Private m_fnt As StdFont 
Private m_fntSymbol As StdFont 
Private m_lMenuItemHeight As Long 
Private WithEvents m_cTmr As CTimer 
Implements ISubclass 
Friend Property Let Font( _ 
 fntThis As StdFont _ 
 ) 
 Set m_fnt = fntThis 
End Property 
Friend Property Set Font( _ 
 fntThis As StdFont _ 
 ) 
 Set m_fnt = fntThis 
 m_fntSymbol.Name = "Marlett" 
 m_fntSymbol.Size = m_fnt.Size * 1.2 
End Property 
Friend Property Get Font() As StdFont 
 Set Font = m_fnt 
End Property 
Friend Sub SetColors( _ 
 ByVal oActiveMenuColor As OLE_COLOR, _ 
 ByVal oActiveMenuColorOver As OLE_COLOR, _ 
 ByVal oInActiveMenuColor As OLE_COLOR, _ 
 ByVal oMenuBackgroundColor As OLE_COLOR _ 
 ) 
 m_oActiveMenuColor = oActiveMenuColor 
 m_oActiveMenuColorOver = oActiveMenuColorOver 
 m_oInActiveMenuColor = oInActiveMenuColor 
 m_oMenuBackgroundColor = oMenuBackgroundColor 
End Sub 
Private Property Get hFont() As Long 
Dim iFn As IFont 
 Set iFn = m_fnt 
 hFont = iFn.hFont 
End Property 
Private Property Get hFontSymbol() As Long 
Dim iFn As IFont 
 Set iFn = m_fntSymbol 
 hFontSymbol = iFn.hFont 
End Property 
Public Property Let hMenu(ByVal hTheMenu As Long) 
 m_hMenu = hTheMenu 
End Property 
Public Property Get hMenu() As Long 
 hMenu = m_hMenu 
End Property 
Public Sub Attach(ByVal lhWnd As Long) 
 LockWindowUpdate lhWnd 
 Detach 
 m_hWnd = lhWnd 
 Set m_cToolbarMenu = New cToolbarMenu 
 m_cToolbarMenu.CoolMenuAttach m_hWnd, Me 
 AttachMessage Me, m_hWnd, WM_LBUTTONDOWN 
 AttachMessage Me, m_hWnd, WM_MOUSEMOVE 
 AttachMessage Me, m_hWnd, WM_DRAWITEM 
 AttachMessage Me, m_hWnd, WM_MEASUREITEM 
 AttachMessage Me, m_hWnd, WM_MENUCHAR 
 LockWindowUpdate 0 
End Sub 
Public Sub Detach() 
 If Not m_hWnd = 0 Then 
 DetachMessage Me, m_hWnd, WM_LBUTTONDOWN 
 DetachMessage Me, m_hWnd, WM_MOUSEMOVE 
 DetachMessage Me, m_hWnd, WM_DRAWITEM 
 DetachMessage Me, m_hWnd, WM_MEASUREITEM 
 DetachMessage Me, m_hWnd, WM_MENUCHAR 
 End If 
 If Not m_cToolbarMenu Is Nothing Then 
 m_cToolbarMenu.CoolMenuDetach 
 Set m_cToolbarMenu = Nothing 
 End If 
End Sub 
Public Property Let CaptionHeight(ByVal lHeight As Long) 
 m_lCaptionHeight = lHeight 
End Property 
Public Sub Render( _ 
 ByVal hFnt As Long, _ 
 ByVal lhDC As Long, _ 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:33   回复此发言    
 
--------------------------------------------------------------------------------
 
53 回复 50:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  ByVal lLeft As Long, _ 
 ByVal lTop As Long, _ 
 ByVal lWidth As Long, _ 
 ByVal lHeight As Long, _ 
 ByVal lYoffset As Long _ 
 ) 
Dim iIdx As Long 
Dim lC As Long 
Dim lhDCC As Long 
Dim tMII As MENUITEMINFO_STRINGDATA 
Dim sCap As String 
Dim hFntOld As Long 
Dim tTR As RECT, tBR As RECT 
Dim lX As Long 
Dim lR As Long 
Dim bPress As Boolean 
Dim lID As Long 
 If Not (m_hMenu = 0) Then 
 m_cMemDC.Width = lWidth 
 m_cMemDC.Height = lHeight 
 lhDCC = m_cMemDC.hdc 
 hFntOld = SelectObject(lhDCC, hFnt) 
 m_iCount = 0 
 Erase m_tR 
 lC = GetMenuItemCount(m_hMenu) 
 If lC > 0 Then 
 lX = 8 
 lTop = lTop + 2 
 BitBlt lhDCC, 0, 0, lWidth, lHeight, lhDC, lLeft, lTop, vbSrcCopy 
 SetBkMode lhDCC, TRANSPARENT 
 For iIdx = 0 To lC - 1 
 lID = GetMenuItemID(m_hMenu, iIdx) 
 If lID = -1 Then 
 tMII.fMask = MIIM_TYPE 
 tMII.cch = 127 
 tMII.dwTypeData = String$(128, 0) 
 tMII.cbSize = LenB(tMII) 
 lR = GetMenuItemInfoStr(m_hMenu, iIdx, True, tMII) 
 If (tMII.fType And MFT_STRING) = MFT_STRING Then 
 If tMII.cch > 0 Then 
 sCap = left$(tMII.dwTypeData, tMII.cch) 
 Else 
 sCap = "" 
 End If 
 tTR.top = 0 
 tTR.bottom = lHeight 
 tTR.left = 0: tTR.right = 0 
 DrawText lhDCC, sCap, -1, tTR, DT_CALCRECT 
 OffsetRect tTR, lX, 2 
 LSet tBR = tTR 
 InflateRect tBR, 2, 2 
 tBR.right = tBR.right + 7 
 m_iCount = m_iCount + 1 
 bPress = False 
 If m_iCount = m_iDownOn Then 
 ' This is the item that was clicked: 
 If m_iDownOn = m_iOver Then 
 ' Draw Pressed 
 'Debug.Print "DrawPressed" 
 bPress = True 
 SetTextColor lhDCC, TranslateColor(m_oActiveMenuColorOver) 
 DrawEdge lhDCC, tBR, BDR_SUNKENOUTER, BF_RECT 
 Else 
 ' Draw Raised 
 'Debug.Print "DrawRaised" 
 SetTextColor lhDCC, TranslateColor(m_oActiveMenuColorOver) 
 DrawEdge lhDCC, tBR, BDR_RAISEDINNER, BF_RECT 
 End If 
 Else 
 ' Not down on, may be over: 
 If m_iCount = m_iOver Then 
 ' Draw Raised 
 'Debug.Print "DrawRaised" 
 SetTextColor lhDCC, TranslateColor(m_oActiveMenuColorOver) 
 DrawEdge lhDCC, tBR, BDR_RAISEDINNER, BF_RECT 
 Else 
 ' Draw None 
 SetTextColor lhDCC, TranslateColor(m_oActiveMenuColor) 
 End If 
 End If 
 If bPress Then 
 OffsetRect tTR, 1, 1 
 End If 
 DrawText lhDCC, sCap, -1, tTR, DT_LEFT Or DT_SINGLELINE 
 If bPress Then 
 OffsetRect tTR, -1, -1 
 End If 
 ReDim Preserve m_tR(1 To m_iCount) As RECT 
 ReDim Preserve m_hSubMenu(1 To m_iCount) As Long 
 OffsetRect tBR, lLeft, lYoffset 
 LSet m_tR(m_iCount) = tBR 
 m_hSubMenu(m_iCount) = GetSubMenu(m_hMenu, iIdx) 
 lX = lX + tTR.right - tTR.left + 1 + 10 
 End If 
 End If 
 Next iIdx 
 BitBlt lhDC, lLeft, lTop, lWidth, lHeight, lhDCC, 0, 0, vbSrcCopy 
 End If 
  
 SelectObject lhDCC, hFntOld 
 End If 
End Sub 
Friend Function AltKeyAccelerator(ByVal vKey As KeyCodeConstants) As Boolean 
Dim lC As Long 
Dim iIdx As Long 
Dim tMII As MENUITEMINFO_STRINGDATA 
Dim lR As Long 
Dim sCap As String 
Dim iPos As Long 
Dim sAccel As String 
 lC = GetMenuItemCount(m_hMenu) 
 If lC > 0 Then 
 For iIdx = 0 To lC - 1 
 tMII.fMask = MIIM_TYPE Or MIIM_DATA 
 tMII.cch = 127 
 tMII.dwTypeData = String$(128, 0) 
 tMII.cbSize = LenB(tMII) 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:33   回复此发言    
 
--------------------------------------------------------------------------------
 
54 回复 50:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  lR = GetMenuItemInfoStr(m_hMenu, iIdx, True, tMII) 
 If tMII.cch > 0 Then 
 sCap = left$(tMII.dwTypeData, tMII.cch) 
 iPos = InStr(sCap, "&") 
 If iPos > 0 And iPos < Len(sCap) Then 
 sAccel = UCase$(Mid$(sCap, iPos + 1, 1)) 
 If sAccel = Chr$(vKey) Then 
 PressButton iIdx + 1, True 
 If Not m_cTmr Is Nothing Then 
 m_cTmr.Interval = 0 
 End If 
 lR = m_cToolbarMenu.TrackPopup(m_iDownOn) 
 pRestoreList 
 AltKeyAccelerator = True 
 End If 
 End If 
 End If 
 Next iIdx 
 End If 
End Function 
Private Function MenuHitTest() As Long 
 If m_iCount > 0 Then 
 Dim tP As POINTAPI 
 GetCursorPos tP 
 MenuHitTest = HitTest(tP) 
 End If 
  
End Function 
Friend Function HitTest(tP As POINTAPI) As Long 
 ' Is tP within a top level menu button? tP 
 ' is in screen coords 
 ' 
Dim iMenu As Long 
 ScreenToClient m_hWnd, tP 
 For iMenu = 1 To m_iCount 
 'Debug.Print m_tR(iMenu).left, m_tR(iMenu).top, m_tR(iMenu).right, m_tR(iMenu).bottom, tP.x, tP.y 
 If PtInRect(m_tR(iMenu), tP.x, tP.y) <> 0 Then 
 HitTest = iMenu 
 Exit Function 
 End If 
 Next iMenu 
End Function 
Friend Property Get Count() As Long 
  
 ' Number of top level menu items:? 
 ' 
 Count = m_iCount 
  
End Property 
Friend Function GetMenuHandle(ByVal iNewPopup As Long) As Long 
  
 ' Returns the popup menu handle for a given top level 
 ' menu item (1 based index) 
 ' 
 If iNewPopup > 0 And iNewPopup <= m_iCount Then 
 GetMenuHandle = m_hSubMenu(iNewPopup) 
 End If 
End Function 
Friend Sub PressButton(ByVal iButton As Long, ByVal bState As Boolean) 
 ' 
 If bState Then 
 m_iDownOn = iButton 
 Else 
 If m_iDownOn = iButton Then 
 m_iDownOn = -1 
 End If 
 End If 
 SendMessageLong m_hWnd, WM_NCPAINT, 0, 0 
  
End Sub 
Friend Sub GetRect(ByVal iButton As Long, ByRef tR As RECT) 
Dim tRW As RECT 
 If iButton > 0 And iButton <= m_iCount Then 
 LSet tR = m_tR(iButton) 
 GetWindowRect m_hWnd, tRW 
 OffsetRect tR, tRW.left, tRW.top + m_lCaptionHeight 
 End If 
End Sub 
Friend Property Get HotItem() As Long 
 ' 
 HotItem = m_iDownOn 
End Property 
Friend Property Let HotItem(ByVal iHotItem As Long) 
 ' Set the hotitem 
 m_iOver = iHotItem 
 ' Repaint: 
 SendMessageLong m_hWnd, WM_NCPAINT, 0, 0 
End Property 
Friend Sub OwnerDrawMenu(ByVal hMenu As Long) 
Dim lC As Long 
Dim tMIIS As MENUITEMINFO_STRINGDATA 
Dim tMII As MENUITEMINFO 
Dim iMenu As Long 
Dim sCap As String 
Dim sShortCut As String 
Dim tR As RECT 
Dim iPos As Long 
Dim lID As Long 
Dim bHaveSeen As Boolean 
Dim hFntOld As Long 
Dim lMenuTextSize As Long 
Dim lMenuShortCutSize As Long 
Dim i As Long 
  
 ' Set OD flag on the fly... 
 bHaveSeen = pbHaveSeen(hMenu) 
 hFntOld = SelectObject(m_cMemDC.hdc, hFont) 
 lC = GetMenuItemCount(hMenu) 
 For iMenu = 0 To lC - 1 
  
 If Not bHaveSeen Then 
  
 tMIIS.fMask = MIIM_TYPE Or MIIM_DATA Or MIIM_ID 
 tMIIS.cch = 127 
 tMIIS.dwTypeData = String$(128, 0) 
 tMIIS.cbSize = LenB(tMIIS) 
 GetMenuItemInfoStr hMenu, iMenu, True, tMIIS 
 'Debug.Print "New Item", tMIIS.dwTypeData 
  
 lID = plAddToRestoreList(hMenu, iMenu, tMIIS) 
  
 If Not (tMIIS.fType And MFT_OWNERDRAW) = MFT_OWNERDRAW Then 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:33   回复此发言    
 
--------------------------------------------------------------------------------
 
55 回复 50:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  ' Setting this flag causes tMIIS.dwTypeData to be 
 ' overwritten with our own app-defined value: 
 tMII.fType = tMIIS.fType Or MFT_OWNERDRAW 
 tMII.dwItemData = lID 
 tMII.cbSize = LenB(tMII) 
 tMII.fMask = MIIM_TYPE Or MIIM_DATA 
 SetMenuItemInfo hMenu, iMenu, True, tMII 
 End If 
  
 Else 
  
 tMII.fMask = MIIM_TYPE Or MIIM_DATA 
 tMII.cbSize = Len(tMII) 
 GetMenuItemInfo hMenu, iMenu, True, tMII 
 lID = tMII.dwItemData 
  
 If Not ((tMII.fType And MFT_OWNERDRAW) = MFT_OWNERDRAW) Then 
  
 lID = plReplaceIndex(hMenu, iMenu) 
  
 'Debug.Print "VB has done something to it!", lID 
 tMIIS.fMask = MIIM_TYPE Or MIIM_DATA Or MIIM_ID 
 tMIIS.cch = 127 
 tMIIS.dwTypeData = String$(128, 0) 
 tMIIS.cbSize = LenB(tMIIS) 
 GetMenuItemInfoStr hMenu, iMenu, True, tMIIS 
  
 pReplaceRestoreList lID, hMenu, iMenu, tMIIS 
  
 ' Setting this flag causes tMIIS.dwTypeData to be 
 ' overwritten with our own app-defined value: 
 tMII.fType = tMIIS.fType Or MFT_OWNERDRAW 
 tMII.dwItemData = lID 
 tMII.cbSize = LenB(tMII) 
 tMII.fMask = MIIM_TYPE Or MIIM_DATA 
 SetMenuItemInfo hMenu, iMenu, True, tMII 
  
 End If 
  
 End If 
  
 If lID > 0 And lID <= m_iRestore Then 
 sCap = m_sCaption(lID) 
 sShortCut = m_sShortCut(lID) 
  
 'Debug.Print m_sCaption(lID), m_sShortCut(lID) 
  
 DrawText m_cMemDC.hdc, sCap, -1, tR, DT_LEFT Or DT_SINGLELINE Or DT_CALCRECT 
 If tR.right - tR.left + 1 > lMenuTextSize Then 
 lMenuTextSize = tR.right - tR.left + 1 
 End If 
 If Len(sShortCut) > 0 Then 
 DrawText m_cMemDC.hdc, sShortCut, -1, tR, DT_LEFT Or DT_SINGLELINE Or DT_CALCRECT 
 If tR.right - tR.left + 1 > lMenuShortCutSize Then 
 lMenuShortCutSize = tR.right - tR.left + 1 
 End If 
 End If 
 m_lMenuItemHeight = tR.bottom - tR.top + 1 
  
 Else 
 'Debug.Print "ERROR! ERROR! ERROR!" 
 End If 
  
 Next iMenu 
  
 For i = 1 To m_iRestore 
 If m_hMenuRestore(i) = hMenu Then 
 m_lMenuTextSize(i) = lMenuTextSize 
 m_lMenuShortCutSize(i) = lMenuShortCutSize 
 End If 
 Next i 
  
 SelectObject m_cMemDC.hdc, hFntOld 
  
End Sub 
Private Function pbHaveSeen(ByVal hMenu As Long) As Boolean 
  
 ' When WM_INITMENUPOPUP fires, this may or not be 
 ' a new menu. We use an array to store which menus 
 ' we've already worked on: 
Dim i As Long 
  
 For i = 1 To m_iHaveSeenCount 
 If hMenu = m_hMenuSeen(i) Then 
 pbHaveSeen = True 
 Exit Function 
 End If 
 Next i 
 m_iHaveSeenCount = m_iHaveSeenCount + 1 
 ReDim Preserve m_hMenuSeen(1 To m_iHaveSeenCount) As Long 
 m_hMenuSeen(m_iHaveSeenCount) = hMenu 
End Function 
Private Function plReplaceIndex(ByVal hMenu As Long, ByVal iMenu As Long) 
Dim i As Long 
 For i = 1 To m_iRestore 
 If m_hMenuRestore(i) = hMenu Then 
 If m_iMenuPosition(i) = iMenu Then 
 plReplaceIndex = i 
 Exit Function 
 End If 
 End If 
 Next i 
End Function 
Private Function plAddToRestoreList(ByVal hMenu As Long, ByVal iMenu As Long, tMIIS As MENUITEMINFO_STRINGDATA) As Long 
  
 ' Here we store information about a menu item. When the 
 ' menus are closed again we can reset things back to the 
 ' way they were using this struct. 
 m_iRestore = m_iRestore + 1 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:33   回复此发言    
 
--------------------------------------------------------------------------------
 
56 回复 50:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  ReDim Preserve m_hMenuRestore(1 To m_iRestore) As Long 
 ReDim Preserve m_iMenuPosition(1 To m_iRestore) As Long 
 ReDim Preserve m_tMIIS(1 To m_iRestore) As MENUITEMINFO_STRINGDATA 
 ReDim Preserve m_sCaption(1 To m_iRestore) As String 
 ReDim Preserve m_sShortCut(1 To m_iRestore) As String 
 ReDim Preserve m_sAccelerator(1 To m_iRestore) As String 
 ReDim Preserve m_lMenuTextSize(1 To m_iRestore) As Long 
 ReDim Preserve m_lMenuShortCutSize(1 To m_iRestore) As Long 
 pReplaceRestoreList m_iRestore, hMenu, iMenu, tMIIS 
 plAddToRestoreList = m_iRestore 
End Function 
Private Sub pReplaceRestoreList(ByVal lIdx As Long, hMenu As Long, iMenu As Long, tMIIS As MENUITEMINFO_STRINGDATA) 
Dim sCap As String 
Dim sShortCut As String 
Dim iPos As Long 
 m_hMenuRestore(lIdx) = hMenu 
 m_iMenuPosition(lIdx) = iMenu 
 LSet m_tMIIS(lIdx) = tMIIS 
 If tMIIS.cch > 0 Then 
 sCap = left$(tMIIS.dwTypeData, tMIIS.cch) 
 Else 
 sCap = "" 
 End If 
 iPos = InStr(sCap, vbTab) 
 If iPos > 0 Then 
 m_sShortCut(lIdx) = Mid$(sCap, iPos + 1) 
 m_sCaption(lIdx) = left$(sCap, iPos - 1) 
 Else 
 m_sCaption(lIdx) = sCap 
 m_sShortCut(lIdx) = "" 
 End If 
 iPos = InStr(m_sCaption(lIdx), "&") 
 If iPos > 0 And iPos < Len(m_sCaption(lIdx)) Then 
 m_sAccelerator(lIdx) = UCase$(Mid$(m_sCaption(lIdx), iPos + 1, 1)) 
 End If 
End Sub 
Private Function InternalIDForWindowsID(ByVal wID As Long) As Long 
Dim i As Long 
 ' linear search I'm afraid, but it is only called once 
 ' per menu item shown (when WM_MEASUREITEM is fired) 
 For i = 1 To m_iRestore 
 If m_tMIIS(i).wID = wID Then 
 InternalIDForWindowsID = i 
 Exit Function 
 End If 
 Next i 
End Function 
Friend Sub pRestoreList() 
Dim i As Long 
 'Debug.Print "RESTORELIST" 
 ' erase the lot: 
 For i = 1 To m_iRestore 
 SetMenuItemInfoStr m_hMenuRestore(i), m_iMenuPosition(i), True, m_tMIIS(i) 
 Next i 
 m_iRestore = 0 
 Erase m_hMenuRestore 
 Erase m_iMenuPosition 
 Erase m_tMIIS 
 Erase m_sCaption() 
 Erase m_sShortCut() 
 Erase m_sAccelerator() 
 m_iHaveSeenCount = 0 
 Erase m_hMenuSeen() 
End Sub 
Private Sub Class_Initialize() 
 Set m_cMemDC = New cMemDC 
 Set m_fnt = New StdFont 
 m_fnt.Name = "MS Sans Serif" 
 Set m_fntSymbol = New StdFont 
 m_fntSymbol.Name = "Marlett" 
 m_fntSymbol.Size = m_fnt.Size * 1.2 
End Sub 
Private Sub Class_Terminate() 
 Set m_cMemDC = Nothing 
End Sub 
Private Property Let ISubclass_MsgResponse(ByVal RHS As EMsgResponse) 
 ' 
End Property 
Private Property Get ISubclass_MsgResponse() As EMsgResponse 
 ISubclass_MsgResponse = emrConsume 
End Property 
Private Function ISubclass_WindowProc(ByVal hwnd As Long, ByVal iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 
Dim iMenu As Long 
Dim iLastDownOn As Long 
Dim iLastOver As Long 
Dim lR As Long 
Dim lFlag As Long 
Dim hMenu As Long 
Dim iChar As Long 
 Select Case iMsg 
 Case WM_LBUTTONDOWN 
 ISubclass_WindowProc = CallOldWindowProc(hwnd, iMsg, wParam, lParam) 
 ' If in range, then... 
 iMenu = MenuHitTest() 
 iLastDownOn = m_iDownOn 
 m_iDownOn = iMenu 
 If m_iDownOn <> iLastDownOn Then 
 ' !Repaint! 
 'Debug.Print "Repaint" 
 SendMessageLong m_hWnd, WM_NCPAINT, 0, 0 
 End If 
  
 If m_iDownOn > 0 Then 
 m_cTmr.Interval = 0 
 lR = m_cToolbarMenu.TrackPopup(m_iDownOn) 
 pRestoreList 
 End If 
  
 Case WM_MOUSEMOVE 
 ISubclass_WindowProc = CallOldWindowProc(hwnd, iMsg, wParam, lParam) 
 pMouseMove 
  
 Case WM_MEASUREITEM 
 ISubclass_WindowProc = MeasureItem(wParam, lParam) 
  
 Case WM_DRAWITEM 
 DrawItem wParam, lParam 
  
 Case WM_MENUCHAR 
 ' Check that this is my menu: 
 lFlag = wParam \ &H10000 
 If ((lFlag And MF_SYSMENU) <> MF_SYSMENU) Then 
 hMenu = lParam 
 iChar = (wParam And &HFFFF&) 
 ' See if this corresponds to an accelerator on the menu: 
 lR = ParseMenuChar(hMenu, iChar) 
 If lR > 0 Then 
 ISubclass_WindowProc = lR 
 Exit Function 
 End If 
 End If 
 ISubclass_WindowProc = CallOldWindowProc(m_hWnd, WM_MENUCHAR, wParam, lParam) 
  
 End Select 
  
End Function 
'  
 
  
 作者: 61.142.212.*  2005-10-28 21:33   回复此发言    
 
--------------------------------------------------------------------------------
 
57 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
 Private Function ParseMenuChar( _ 
 ByVal hMenu As Long, _ 
 ByVal iChar As Integer _ 
 ) As Long 
Dim sChar As String 
Dim l As Long 
Dim lH() As Long 
Dim sItems() As String 
 'Debug.Print "WM_MENUCHAR" 
 sChar = UCase$(Chr$(iChar)) 
 For l = 1 To m_iRestore 
 If (m_hMenuRestore(l) = hMenu) Then 
 If (m_sAccelerator(l) = sChar) Then 
 ParseMenuChar = &H20000 Or m_iMenuPosition(l) 
 ' Debug.Print "Found Menu Char" 
 Exit Function 
 End If 
 End If 
 Next l 
End Function 
Private Function MeasureItem(ByVal wParam As Long, ByVal lParam As Long) As Long 
Dim tMIS As MEASUREITEMSTRUCT 
Dim lID As Long 
 CopyMemory tMIS, ByVal lParam, LenB(tMIS) 
 If tMIS.CtlType = ODT_MENU Then 
  
 ' because we don't get the popup menu handle 
 ' in the tMIS structure, we have to do an internal 
 ' lookup to find info about this menu item. 
 ' poor implementation of MEASUREITEMSTRUCT - it 
 ' should have a .hWndItem field like DRAWITEMSTRUCT 
 ' - spm 
 lID = InternalIDForWindowsID(tMIS.itemID) 
  
 ' Width: 
 tMIS.itemWidth = 4 + 22 + m_lMenuTextSize(lID) + 4 
 If m_lMenuShortCutSize(lID) > 0 Then 
 tMIS.itemWidth = tMIS.itemWidth + 4 + m_lMenuShortCutSize(lID) + 4 
 End If 
  
 ' Height: 
 If lID > 0 And lID <= m_iRestore Then 
 If (m_tMIIS(lID).fType And MFT_SEPARATOR) = MFT_SEPARATOR Then 
 tMIS.itemHeight = 6 
 Else 
 ' menu item height is always the same 
 tMIS.itemHeight = m_lMenuItemHeight + 8 
 End If 
 Else 
 ' problem. 
 End If 
  
 CopyMemory ByVal lParam, tMIS, LenB(tMIS) 
  
 Else 
 MeasureItem = CallOldWindowProc(m_hWnd, WM_MEASUREITEM, wParam, lParam) 
 End If 
End Function 
Private Function DrawItem(ByVal wParam As Long, ByVal lParam As Long) As Long 
Dim tDIS As DRAWITEMSTRUCT 
Dim hBr As Long 
Dim tR As RECT, tTR As RECT, tWR As RECT 
Dim lhDC As Long 
Dim hFntOld As Long 
Dim tMII As MENUITEMINFO 
Dim bRadioCheck As Boolean, bDisabled As Boolean, bChecked As Boolean, bHighlighted As Boolean 
Dim lID As Long 
Dim hFntS As Long, hFntSOld As Long 
 CopyMemory tDIS, ByVal lParam, LenB(tDIS) 
 If tDIS.CtlType = ODT_MENU Then 
 ' Todo 
 ' tDIS.hWndItem is the menu containing the item, tDIS.itemID is the wID 
  
 m_cMemDC.Width = tDIS.rcItem.right - tDIS.rcItem.left + 1 
 m_cMemDC.Height = tDIS.rcItem.bottom - tDIS.rcItem.top + 1 
 lhDC = m_cMemDC.hdc 
 hFntOld = SelectObject(lhDC, hFont) 
  
 LSet tR = tDIS.rcItem 
 OffsetRect tR, -tR.left, -tR.top 
  
 ' Fill background: 
 tTR.right = m_cMemDC.Width 
 tTR.bottom = m_cMemDC.Height 
 hBr = CreateSolidBrush(TranslateColor(m_oMenuBackgroundColor)) 
 FillRect lhDC, tTR, hBr 
 DeleteObject hBr 
  
 SetBkMode lhDC, TRANSPARENT 
  
 ' Draw the text: 
 tMII.cbSize = LenB(tMII) 
 tMII.fMask = MIIM_TYPE Or MIIM_STATE Or MIIM_DATA 
 GetMenuItemInfo tDIS.hwndItem, tDIS.itemID, False, tMII 
  
 If (tMII.fType And MFT_SEPARATOR) = MFT_SEPARATOR Then 
 ' Separator: 
 LSet tWR = tR 
 tWR.top = (tWR.bottom - tWR.top - 2) \ 2 + tWR.top 
 tWR.bottom = tWR.top + 2 
 InflateRect tWR, -8, 0 
 DrawEdge lhDC, tWR, BDR_SUNKENOUTER, BF_TOP Or BF_BOTTOM 
 Else 
 ' Text item: 
 bRadioCheck = ((tMII.fType And MFT_RADIOCHECK) = MFT_RADIOCHECK) 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:33   回复此发言    
 
--------------------------------------------------------------------------------
 
58 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  bDisabled = ((tMII.fState And MFS_DISABLED) = MFS_DISABLED) 
 bChecked = ((tMII.fState And MFS_CHECKED) = MFS_CHECKED) 
 bHighlighted = ((tMII.fState And MFS_HILITE) = MFS_HILITE) 
 If bHighlighted Then 
 SetTextColor lhDC, TranslateColor(m_oActiveMenuColorOver) 
 Else 
 SetTextColor lhDC, TranslateColor(m_oActiveMenuColor) 
 End If 
  
 ' Check: 
 If bChecked Then 
 LSet tWR = tR 
 InflateRect tWR, -4, -4 
 tWR.left = tWR.left + 2 
 tWR.right = tWR.left + (tWR.bottom - tWR.top + 1) 
 DrawEdge lhDC, tWR, BDR_SUNKENOUTER, BF_RECT 
  
 SelectObject lhDC, hFntOld 
 hFntSOld = SelectObject(lhDC, hFontSymbol) 
 If bRadioCheck Then 
 pDrawItem lhDC, "h", tWR, bDisabled, DT_CENTER Or DT_SINGLELINE Or DT_VCENTER 
 Else 
 pDrawItem lhDC, "b", tWR, bDisabled, DT_CENTER Or DT_SINGLELINE Or DT_VCENTER 
 End If 
 SelectObject lhDC, hFntSOld 
 hFntOld = SelectObject(lhDC, hFont) 
  
 End If 
  
 ' Draw text: 
 LSet tWR = tR 
 tWR.left = 20 + 4 
 lID = tMII.dwItemData 
 If lID > 0 And lID <= m_iRestore Then 
 pDrawItem lhDC, m_sCaption(lID), tWR, bDisabled, DT_LEFT Or DT_SINGLELINE Or DT_VCENTER 
 If Len(m_sShortCut(lID)) > 0 Then 
 tWR.left = tWR.left + m_lMenuTextSize(lID) + 4 + 4 
 pDrawItem lhDC, m_sShortCut(lID), tWR, bDisabled, DT_LEFT Or DT_SINGLELINE Or DT_VCENTER 
 End If 
 End If 
  
 ' Highlighted: 
 If bHighlighted And Not (bDisabled) Then 
 LSet tWR = tR 
 InflateRect tWR, -2, 0 
 DrawEdge lhDC, tWR, BDR_RAISEDINNER, BF_RECT 
 End If 
  
 End If 
  
 SelectObject lhDC, hFntOld 
  
 BitBlt tDIS.hdc, tDIS.rcItem.left, tDIS.rcItem.top, tDIS.rcItem.right - tDIS.rcItem.left + 1, tDIS.rcItem.bottom - tDIS.rcItem.top + 1, lhDC, 0, 0, vbSrcCopy 
  
 Else 
 DrawItem = CallOldWindowProc(m_hWnd, WM_DRAWITEM, wParam, lParam) 
 End If 
End Function 
Private Sub pDrawItem( _ 
 ByVal lhDC As Long, _ 
 ByVal sText As String, _ 
 ByRef tR As RECT, _ 
 ByVal bDisabled As Boolean, _ 
 ByVal dtFlags As Long _ 
 ) 
Dim tWR As RECT 
 LSet tWR = tR 
 If bDisabled Then 
 SetTextColor lhDC, TranslateColor(vb3DHighlight) 
 OffsetRect tWR, 1, 1 
 DrawText lhDC, sText, -1, tWR, dtFlags 
 SetTextColor lhDC, TranslateColor(vbButtonShadow) 
 OffsetRect tWR, -1, -1 
 DrawText lhDC, sText, -1, tWR, dtFlags 
 Else 
 DrawText lhDC, sText, -1, tWR, dtFlags 
 End If 
End Sub 
Private Sub pMouseMove() 
Dim iMenu As Long 
Dim iLastOver As Long 
 iMenu = MenuHitTest() 
 iLastOver = m_iOver 
 m_iOver = iMenu 
 'Debug.Print "Over:", m_iOver, iLastOver 
 If m_iOver <> iLastOver Then 
 ' !Repaint! 
 'Debug.Print "Repaint" 
 SendMessageLong m_hWnd, WM_NCPAINT, 0, 0 
 End If 
 If m_cTmr Is Nothing Then 
 Set m_cTmr = New CTimer 
 End If 
 If m_iOver < 1 And m_iDownOn = 0 Then 
 m_cTmr.Interval = 0 
 Else 
 If m_iDownOn > 0 Then 
 If GetAsyncKeyState(vbLeftButton) = 0 Then 
 m_iDownOn = 0 
 SendMessageLong m_hWnd, WM_NCPAINT, 0, 0 
 End If 
 End If 
 m_cTmr.Interval = 50 
 End If 
End Sub 
Private Sub m_cTmr_ThatTime() 
 pMouseMove 
End Sub 
' Convert Automation color to Windows color 
Private Function TranslateColor(ByVal clr As OLE_COLOR, _ 
 Optional hPal As Long = 0) As Long 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:33   回复此发言    
 
--------------------------------------------------------------------------------
 
59 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  If OleTranslateColor(clr, hPal, TranslateColor) Then 
 TranslateColor = CLR_INVALID 
 End If 
End Function 
 
------------- 
Option Explicit 
' ========================================================================= 
' cNCCalcSize 
' 
' Copyright ?2000 Steve McMahon (steve@vbaccelerator.com) 
' 
' Allows you to significantly modify the title and 
' borders for a window. 
' 
' ------------------------------------------------------------------------- 
' Visit vbAccelerator at http://vbaccelerator.com 
' ========================================================================= 
Private Type POINTS 
 x As Integer 
 y As Integer 
End Type 
Private Type WINDOWPOS 
 hwnd As Long 
 hWndInsertAfter As Long 
 x As Long 
 y As Long 
 cx As Long 
 cy As Long 
 flags As Long 
End Type 
Private Type NCCALCSIZE_PARAMS 
 rgrc(0 To 2) As RECT 
 lppos As Long 'WINDOWPOS 
End Type 
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long 
Private Declare Function InflateRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal y As Long) As Long 
Private Declare Function OffsetRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal y As Long) As Long 
Private Declare Function PtInRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal y As Long) As Long 
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long 
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long 
Private Declare Function ReleaseCapture Lib "user32" () As Long 
Private Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long 
Private Declare Function MapWindowPoints Lib "user32" (ByVal hwndFrom As Long, ByVal hwndTo As Long, lppt As Any, ByVal cPoints As Long) As Long 
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, lpsz2 As Any) As Long 
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long 
Private Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long 
Private Declare Function IsZoomed Lib "user32" (ByVal hwnd As Long) As Long 
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Any) As Long 
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long 
Private Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long 
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long 
Private Declare Function GetForegroundWindow Lib "user32" () As Long 
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:33   回复此发言    
 
--------------------------------------------------------------------------------
 
60 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
 Private Declare Function RedrawWindow Lib "user32" (ByVal hwnd As Long, lprcUpdate As Any, ByVal hrgnUpdate As Long, ByVal fuRedraw As Long) As Long 
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long 
Private Declare Function CreateDCAsNull Lib "gdi32" Alias "CreateDCA" (ByVal lpDriverName As String, lpDeviceName As Any, lpOutput As Any, lpInitData As Any) As Long 
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long 
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long 
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long 
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long 
Private Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long 
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long 
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long 
Private Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long 
Private Declare Function GetSysColorBrush Lib "user32" (ByVal nIndex As Long) As Long 
Private Declare Function FillRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal hBrush As Long) As Long 
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long 
Private Declare Function DrawFrameControl Lib "user32" (ByVal lhDC As Long, tR As RECT, ByVal eFlag As Long, ByVal eStyle As Long) As Long 
Private Declare Function DrawEdge Lib "user32" (ByVal hdc As Long, qrc As RECT, ByVal edge As Long, ByVal grfFlags As Long) As Long 
Private Declare Function DrawCaptionAPI Lib "user32" Alias "DrawCaption" (ByVal hwnd As Long, ByVal hdc As Long, pcRect As RECT, ByVal un As Long) As Long 
Private Declare Function SetMenu Lib "user32" (ByVal hwnd As Long, ByVal hMenu As Long) As Long 
Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long 
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) 
' mouseevent 
Private Const MOUSEEVENTF_ABSOLUTE = &H8000 ' absolute move 
Private Const MOUSEEVENTF_LEFTDOWN = &H2 ' left button down 
Private Const MOUSEEVENTF_LEFTUP = &H4 ' left button up 
Private Const MOUSEEVENTF_MIDDLEDOWN = &H20 ' middle button down 
Private Const MOUSEEVENTF_MIDDLEUP = &H40 ' middle button up 
Private Const MOUSEEVENTF_MOVE = &H1 ' mouse move 
Private Const MOUSEEVENTF_RIGHTDOWN = &H8 ' right button down 
Private Const MOUSEEVENTF_RIGHTUP = &H10 ' right button up 
' SysMetrics 
Private Const SM_CXBORDER = 5 
Private Const SM_CXDLGFRAME = 7 
Private Const SM_CXFIXEDFRAME = SM_CXDLGFRAME 
Private Const SM_CXFRAME = 32 
Private Const SM_CXHSCROLL = 21 
Private Const SM_CXVSCROLL = 2 
Private Const SM_CYCAPTION = 4 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:33   回复此发言    
 
--------------------------------------------------------------------------------
 
61 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
 Private Const SM_CYDLGFRAME = 8 
Private Const SM_CYFIXEDFRAME = SM_CYDLGFRAME 
Private Const SM_CYFRAME = 33 
Private Const SM_CYHSCROLL = 3 
Private Const SM_CYMENU = 15 
Private Const SM_CYSMSIZE = 31 
Private Const SM_CXSMSIZE = 30 
' DrawFrameControl: 
Private Const DFC_CAPTION = 1 
Private Const DFC_MENU = 2 
Private Const DFC_SCROLL = 3 
Private Const DFC_BUTTON = 4 
'#if(WINVER >= =&H0500) 
Private Const DFC_POPUPMENU = 5 
'#endif /* WINVER >= =&H0500 */ 
Private Const DFCS_CAPTIONCLOSE = &H0 
Private Const DFCS_CAPTIONMIN = &H1 
Private Const DFCS_CAPTIONMAX = &H2 
Private Const DFCS_CAPTIONRESTORE = &H3 
Private Const DFCS_CAPTIONHELP = &H4 
Private Const DFCS_INACTIVE = &H100 
Private Const DFCS_PUSHED = &H200 
Private Const DFCS_CHECKED = &H400 
' DrawEdge: 
Private Const BDR_RAISEDOUTER = &H1 
Private Const BDR_SUNKENOUTER = &H2 
Private Const BDR_RAISEDINNER = &H4 
Private Const BDR_SUNKENINNER = &H8 
Private Const BDR_OUTER = &H3 
Private Const BDR_INNER = &HC 
Private Const BDR_RAISED = &H5 
Private Const BDR_SUNKEN = &HA 
Private Const EDGE_RAISED = (BDR_RAISEDOUTER Or BDR_RAISEDINNER) 
Private Const EDGE_SUNKEN = (BDR_SUNKENOUTER Or BDR_SUNKENINNER) 
Private Const EDGE_ETCHED = (BDR_SUNKENOUTER Or BDR_RAISEDINNER) 
Private Const EDGE_BUMP = (BDR_RAISEDOUTER Or BDR_SUNKENINNER) 
Private Const BF_LEFT = &H1 
Private Const BF_TOP = &H2 
Private Const BF_RIGHT = &H4 
Private Const BF_BOTTOM = &H8 
Private Const BF_TOPLEFT = (BF_TOP Or BF_LEFT) 
Private Const BF_TOPRIGHT = (BF_TOP Or BF_RIGHT) 
Private Const BF_BOTTOMLEFT = (BF_BOTTOM Or BF_LEFT) 
Private Const BF_BOTTOMRIGHT = (BF_BOTTOM Or BF_RIGHT) 
Private Const BF_RECT = (BF_LEFT Or BF_TOP Or BF_RIGHT Or BF_BOTTOM) 
' Map WIndow Points 
Private Const HWND_DESKTOP = 0 
' Redraw window: 
Private Const RDW_ALLCHILDREN = &H80 
Private Const RDW_ERASE = &H4 
Private Const RDW_ERASENOW = &H200 
Private Const RDW_FRAME = &H400 
Private Const RDW_INTERNALPAINT = &H2 
Private Const RDW_INVALIDATE = &H1 
Private Const RDW_NOCHILDREN = &H40 
Private Const RDW_NOERASE = &H20 
Private Const RDW_NOFRAME = &H800 
Private Const RDW_NOINTERNALPAINT = &H10 
Private Const RDW_UPDATENOW = &H100 
Private Const RDW_VALIDATE = &H8 
' Sys colours: 
Private Const COLOR_WINDOWFRAME = 6 
Private Const COLOR_BTNFACE = 15 
Private Const COLOR_BTNTEXT = 18 
Private Const COLOR_INACTIVECAPTION = 3 
Private Const COLOR_ACTIVEBORDER = 10 
Private Const COLOR_ACTIVECAPTION = 2 
Private Const COLOR_INACTIVEBORDER = 11 
' Window MEssages 
Private Const WM_DESTROY = &H2 
Private Const WM_SETTEXT = &HC 
Private Const WM_ACTIVATEAPP = &H1C 
Private Const WM_SETCURSOR = &H20 
Private Const WM_CHILDACTIVATE = &H22 
Private Const WM_STYLECHANGING = &H7C 
Private Const WM_STYLECHANGED = &H7D 
Private Const WM_NCCALCSIZE = &H83 
Private Const WM_NCPAINT = &H85 
Private Const WM_NCHITTEST = &H84 
Private Const WM_NCACTIVATE = &H86 
Private Const WM_NCLBUTTONDOWN = &HA1 
Private Const WM_NCLBUTTONUP = &HA2 
Private Const WM_NCLBUTTONDBLCLK = &HA3 
Private Const WM_SYSCOMMAND = &H112 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:33   回复此发言    
 
--------------------------------------------------------------------------------
 
62 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
 Private Const WM_INITMENU = &H116 
Private Const WM_INITMENUPOPUP = &H117 
Private Const WM_MDIGETACTIVE = &H229 
' flags for DrawCaption 
Private Const DC_ACTIVE = &H1 
Private Const DC_SMALLCAP = &H2 
Private Const DC_ICON = &H4 
Private Const DC_TEXT = &H8 
Private Const DC_INBUTTON = &H10 
Private Const DC_GRADIENT = &H20 
' WM_NCCALCSIZE return values; 
Private Const WVR_ALIGNBOTTOM = &H40 
Private Const WVR_ALIGNLEFT = &H20 
Private Const WVR_ALIGNRIGHT = &H80 
Private Const WVR_ALIGNTOP = &H10 
Private Const WVR_HREDRAW = &H100 
Private Const WVR_VALIDRECTS = &H400 
Private Const WVR_VREDRAW = &H200 
Private Const WVR_REDRAW = (WVR_HREDRAW Or WVR_VREDRAW) 
' Window Long: 
Private Const GWL_STYLE = (-16) 
Private Const GWL_EXSTYLE = (-20) 
Private Const GWL_USERDATA = (-21) 
Private Const GWL_WNDPROC = -4 
Private Const GWL_HWNDPARENT = (-8) 
'Window Styles: 
Private Const WS_THICKFRAME = &H40000 
Private Const WS_SIZEBOX = WS_THICKFRAME 
Private Const WS_CHILD = &H40000000 
Private Const WS_VISIBLE = &H10000000 
Private Const WS_CLIPCHILDREN = &H2000000 
Private Const WS_CLIPSIBLINGS = &H4000000 
Private Const WS_BORDER = &H800000 
Private Const WS_EX_TOPMOST = &H8& 
Private Const WS_EX_TOOLWINDOW = &H80& 
Private Const CW_USEDEFAULT = &H80000000 
' SetWIndowPos 
Private Const HWND_TOPMOST = -1 
Private Const SWP_NOSIZE = &H1 
Private Const SWP_NOMOVE = &H2 
Private Const SWP_NOREDRAW = &H8 
Private Const SWP_SHOWWINDOW = &H40 
Private Const SWP_FRAMECHANGED = &H20 ' The frame changed: send WM_NCCALCSIZE 
Private Const SWP_DRAWFRAME = SWP_FRAMECHANGED 
Private Const SWP_HIDEWINDOW = &H80 
Private Const SWP_NOACTIVATE = &H10 
Private Const SWP_NOCOPYBITS = &H100 
Private Const SWP_NOOWNERZORDER = &H200 ' Don't do owner Z ordering 
Private Const SWP_NOREPOSITION = SWP_NOOWNERZORDER 
Private Const SWP_NOZORDER = &H4 
Implements ISubclass 
Public Enum ECNCSysCommandConstants 
 SC_ARRANGE = &HF110& 
 SC_CLOSE = &HF060& 
 SC_MAXIMIZE = &HF030& 
 SC_MINIMIZE = &HF020& 
 SC_MOVE = &HF010& 
 SC_NEXTWINDOW = &HF040& 
 SC_PREVWINDOW = &HF050& 
 SC_RESTORE = &HF120& 
 SC_SIZE = &HF000& 
End Enum 
Public Enum ECNCHitTestConstants 
 HTBORDER = 18 
 HTBOTTOM = 15 
 HTBOTTOMLEFT = 16 
 HTBOTTOMRIGHT = 17 
 HTCAPTION = 2 
 HTCLIENT = 1 
 HTGROWBOX = 4 
 HTHSCROLL = 6 
 HTLEFT = 10 
 HTMAXBUTTON = 9 
 HTMENU = 5 
 HTMINBUTTON = 8 
 HTNOWHERE = 0 
 HTRIGHT = 11 
 HTSYSMENU = 3 
 HTTOP = 12 
 HTTOPLEFT = 13 
 HTTOPRIGHT = 14 
 HTVSCROLL = 7 
End Enum 
n  
 
  
 作者: 61.142.212.*  2005-10-28 21:33   回复此发言    
 
--------------------------------------------------------------------------------
 
63 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
 ' Window handles: 
Private m_hWnd As Long 
Private m_hWndMDIClient As Long 
Private m_bIsMDIChild As Boolean 
' Menu handle 
Private m_hMenu As Long 
' App activate & window activation state: 
Private m_bActive As Boolean 
Private m_bAppActive As Boolean 
' Is our MDI Child zoomed in or not? 
Private m_bZoomedMDIChild As Boolean 
' MemDC for title bar drawing: 
Private m_hDC As Long 
Private m_hBmp As Long 
Private m_hBmpOld As Long 
' Maximized MDI Child? 
Private m_bState As Boolean 
' Borders: 
Private m_lLeft As Long, m_lTop As Long 
Private m_lRight As Long, m_lBottom As Long 
' Last HitTest result 
Private m_eLastHT As ECNCHitTestConstants 
Public Sub Redraw(hwnd As Long) 
 RedrawWindow hwnd, ByVal 0&, 0, RDW_UPDATENOW Or RDW_INVALIDATE Or RDW_INTERNALPAINT Or RDW_ALLCHILDREN 
End Sub 
Public Sub Display(f As Object) 
 'f.Show 
 On Error Resume Next 
 f.Refresh 
 SetWindowPos m_hWnd, 0, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOOWNERZORDER Or SWP_FRAMECHANGED 
End Sub 
Public Property Get WindowActive() As Boolean 
 WindowActive = m_bActive 
End Property 
Public Property Get AppActive() As Boolean 
 AppActive = m_bAppActive 
End Property 
Public Sub TitleBarMouseDown() 
Dim tPS As POINTS 
Dim tP As POINTAPI 
 GetCursorPos tP 
 tPS.x = tP.x: tPS.y = tP.y 
 ReleaseCapture 
 SendMessage m_hWnd, WM_NCLBUTTONDOWN, HTCAPTION, tPS 
End Sub 
Public Sub SysCommand(ByVal eCmd As ECNCSysCommandConstants) 
 PostMessage m_hWnd, WM_SYSCOMMAND, eCmd, 0 
End Sub 
Public Sub Attach(ByVal iTo As INCAreaModifier) 
 Dim lhDC As Long 
  
 Detach 
  
 m_hWnd = iTo.hwnd 
 m_hMenu = GetMenu(m_hWnd) 
  
 m_bIsMDIChild = IsMDIChildForm(m_hWnd) 
  
 ' Allows us to remove menu bar, caption etc: 
 AttachMessage Me, m_hWnd, WM_NCCALCSIZE 
 ' Handle drawing borders, caption etc ourselves: 
 AttachMessage Me, m_hWnd, WM_NCPAINT 
 ' Win redraws caption during NCACTIVATE: 
 AttachMessage Me, m_hWnd, WM_NCACTIVATE 
 ' On NC Button Down, Win redraws the min/max/close buttons: 
 AttachMessage Me, m_hWnd, WM_NCLBUTTONDOWN 
 ' Check for button up so we can notify client: 
 AttachMessage Me, m_hWnd, WM_NCLBUTTONUP 
 ' on NC double click, Win redraws the min/max/close buttons: 
 AttachMessage Me, m_hWnd, WM_NCLBUTTONDBLCLK 
 ' Allows us to use the default implementations 
 ' for hittest events: 
 AttachMessage Me, m_hWnd, WM_NCHITTEST 
 ' Hack: 
 AttachMessage Me, m_hWnd, WM_SETCURSOR 
 ' On SysMenu Show, Win redraws the min/max/close buttons: 
 AttachMessage Me, m_hWnd, WM_INITMENU 
 AttachMessage Me, m_hWnd, WM_INITMENUPOPUP 
 ' On ChangeStyle, Win redraws the entire caption: 
 AttachMessage Me, m_hWnd, WM_STYLECHANGED 
 ' On SetText, Win redraws the entire caption: 
 AttachMessage Me, m_hWnd, WM_SETTEXT 
 ' Checking for activateapp: 
 AttachMessage Me, m_hWnd, WM_ACTIVATEAPP 
 ' EnterMenuLoop 
 AttachMessage Me, m_hWnd, WM_ENTERMENULOOP 
 ' ExitMenuLoop 
 AttachMessage Me, m_hWnd, WM_EXITMENULOOP 
  
 If m_bIsMDIChild Then 
 AttachMessage Me, m_hWnd, WM_SIZE 
 End If 
  
 ' So we can automatically detach ourselves when the parent closes: 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:34   回复此发言    
 
--------------------------------------------------------------------------------
 
64 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  AttachMessage Me, m_hWnd, WM_DESTROY 
  
  
 lhDC = CreateDCAsNull("DISPLAY", ByVal 0&, ByVal 0&, ByVal 0&) 
 m_hDC = CreateCompatibleDC(lhDC) 
 m_hBmp = CreateCompatibleBitmap(lhDC, Screen.Width \ Screen.TwipsPerPixelX, GetSystemMetrics(SM_CYCAPTION) * 4) 
 DeleteDC lhDC 
 m_hBmpOld = SelectObject(m_hDC, m_hBmp) 
  
 m_hWndMDIClient = FindWindowEx(m_hWnd, 0, "MDIClient", ByVal 0&) 
  
 SetProp m_hWnd, "vbalCNCImplementation", ObjPtr(iTo) 
  
 AttachKeyboardHook Me 
End Sub 
Public Property Get hMenu() As Long 
 hMenu = m_hMenu 
End Property 
Public Sub Detach() 
 DetachKeyboardHook Me 
 If m_hWnd <> 0 Then 
 DetachMessage Me, m_hWnd, WM_NCCALCSIZE 
 DetachMessage Me, m_hWnd, WM_NCPAINT 
 DetachMessage Me, m_hWnd, WM_NCACTIVATE 
 DetachMessage Me, m_hWnd, WM_NCLBUTTONDOWN 
 DetachMessage Me, m_hWnd, WM_NCLBUTTONUP 
 DetachMessage Me, m_hWnd, WM_NCLBUTTONDBLCLK 
 DetachMessage Me, m_hWnd, WM_NCHITTEST 
  
 DetachMessage Me, m_hWnd, WM_SETCURSOR 
  
 DetachMessage Me, m_hWnd, WM_INITMENU 
 DetachMessage Me, m_hWnd, WM_INITMENUPOPUP 
  
 DetachMessage Me, m_hWnd, WM_STYLECHANGED 
 DetachMessage Me, m_hWnd, WM_SETTEXT 
  
 DetachMessage Me, m_hWnd, WM_ACTIVATEAPP 
  
 DetachMessage Me, m_hWnd, WM_ENTERMENULOOP 
 DetachMessage Me, m_hWnd, WM_EXITMENULOOP 
  
 If m_bIsMDIChild Then 
 DetachMessage Me, m_hWnd, WM_SIZE 
 m_bIsMDIChild = False 
 End If 
  
 DetachMessage Me, m_hWnd, WM_DESTROY 
 End If 
 If m_hDC <> 0 Then 
 If m_hBmpOld <> 0 Then 
 SelectObject m_hDC, m_hBmp 
 m_hBmpOld = 0 
 End If 
 If m_hBmp <> 0 Then 
 DeleteObject m_hBmp 
 m_hBmp = 0 
 End If 
 If m_hDC <> 0 Then 
 DeleteDC m_hDC 
 m_hDC = 0 
 End If 
 End If 
 RemoveProp m_hWnd, "vbalCNCImplementation" 
 m_hWnd = 0 
 m_hWndMDIClient = 0 
 m_hMenu = 0 
End Sub 
Friend Function AltKeyAccelerator(ByVal vKey As KeyCodeConstants) As Long 
Dim Implementation As INCAreaModifier 
 If GetImplementation(Implementation) Then 
 AltKeyAccelerator = Implementation.AltKeyAccelerator(vKey) 
 End If 
End Function 
Private Sub pShowMDIButtons(ByVal hwnd As Long, ByVal bState As Boolean) 
 m_bState = bState 
End Sub 
Private Sub MyMoveWindow() 
Dim tPInit As POINTAPI 
Dim tPLast As POINTAPI 
Dim tP As POINTAPI 
Dim tR As RECT 
Dim hWndParent As Long 
Dim tWRInit As RECT 
Dim dx As Long, dy As Long 
  
 GetWindowRect m_hWnd, tR 
 hWndParent = GetParent(m_hWnd) 
 If Not hWndParent = 0 Then 
 MapWindowPoints HWND_DESKTOP, hWndParent, tR, 2 
 End If 
 GetCursorPos tPInit 
 LSet tPLast = tPInit 
 Do While Not (GetAsyncKeyState(vbLeftButton) = 0) And m_bActive 
 GetCursorPos tP 
 If tP.x <> tPLast.x Or tP.y <> tPLast.y Then 
 ' Moved: 
 dx = tP.x - tPLast.x 
 dy = tP.y - tPLast.y 
 SetWindowPos m_hWnd, 0, tR.left + dx, tR.top + dy, 0, 0, SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOOWNERZORDER 
 LSet tPLast = tP 
 GetWindowRect m_hWnd, tR 
 If Not hWndParent = 0 Then 
 MapWindowPoints HWND_DESKTOP, hWndParent, tR, 2 
 End If 
 End If 
 DoEvents 
 Sleep 1 
 Loop 
  
End Sub 
Private Sub Class_Terminate() 
 Detach 
End Sub 
Private Property Let ISubclass_MsgResponse(ByVal RHS As EMsgResponse) 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:34   回复此发言    
 
--------------------------------------------------------------------------------
 
65 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  ' 
End Property 
Private Property Get ISubclass_MsgResponse() As EMsgResponse 
  
 Select Case CurrentMessage 
 Case WM_NCPAINT, WM_NCLBUTTONDOWN, _ 
 WM_NCLBUTTONDBLCLK, _ 
 WM_INITMENUPOPUP, WM_INITMENU, _ 
 WM_SETCURSOR, WM_CHILDACTIVATE, _ 
 WM_STYLECHANGED, WM_SETTEXT, _ 
 WM_NCHITTEST, WM_SIZE, _ 
 WM_ENTERMENULOOP, WM_EXITMENULOOP 
 ISubclass_MsgResponse = emrConsume 
 Case Else 
 ' ActiveApp, Destroy: 
 ISubclass_MsgResponse = emrPreprocess 
 End Select 
  
End Property 
Private Function ISubclass_WindowProc(ByVal hwnd As Long, ByVal iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 
Dim tNCR As NCCALCSIZE_PARAMS 
Dim tWP As WINDOWPOS 
Dim tP As POINTAPI 
Dim tR As RECT 
Dim lhWnd As Long 
Dim lpfMaximised As Long 
Dim lPtr As Long 
Dim hdc As Long 
Dim lStyle As Long 
Dim eHt As ECNCHitTestConstants 
Static s_dx As Long 
Static s_dy As Long 
Dim bCanSize As Boolean 
Dim Implementation As INCAreaModifier 
Dim bHandled As Boolean 
Static s_bNoStyleChangeProcessing As Boolean 
Static s_bChildActivate As Boolean 
 Select Case iMsg 
  
 Case WM_DESTROY 
 ' Goodbye! 
 Detach 
  
 Case WM_NCPAINT 
  
 ' Due to processing elsewhere in this subclass, we 
 ' might inadvertently be drawing when the window 
 ' is being closed or invisible. Check before 
 ' drawing: 
 If Not (IsWindowVisible(hwnd) = 0) Then 
 m_bZoomedMDIChild = (IsMDIChildForm(hwnd) And (IsZoomed(hwnd) <> 0)) 
 If m_bZoomedMDIChild Then 
 ISubclass_WindowProc = CallOldWindowProc(hwnd, iMsg, wParam, lParam) 
 Else 
 ' Get the non-client DC to draw in: 
 hdc = GetWindowDC(m_hWnd) 
  
 GetWindowRect m_hWnd, tR 
 OffsetRect tR, -tR.left, -tR.top 
  
 If GetImplementation(Implementation) Then 
 Implementation.NCPaint hdc, tR.left, tR.top, tR.right, tR.bottom 
 Else 
 DefaultNCPaint hdc, tR.left, tR.top, tR.right, tR.bottom 
 End If 
  
 ReleaseDC m_hWnd, hdc 
 End If 
 End If 
  
 Case WM_NCHITTEST 
  
 If GetImplementation(Implementation) Then 
 eHt = pGetHitTestCode() 
 m_eLastHT = eHt 
 If eHt = HTMENU Then 
 ' Cannot allow windows to have this; if you 
 ' mouse down on menu or caption then windows 
 ' redraws the caption on top... 
 ISubclass_WindowProc = HTCLIENT 
 Else 
 ISubclass_WindowProc = eHt 
 End If 
  
 Else 
 ISubclass_WindowProc = CallOldWindowProc(hwnd, iMsg, wParam, lParam) 
 End If 
  
 Case WM_NCLBUTTONDOWN 
 ' 
 ' a hack. 
 ' 
 ' Win suspends when we do a NC Button down. It also 
 ' redraws the min/max/close buttons. We can force them 
 ' to go away by moving the mouse 
 ' 
 If s_dx = 0 Then s_dx = 1 
 If s_dy = 0 Then s_dy = 1 
 s_dx = -1 * s_dx: s_dy = -1 * s_dy 
 mouse_event MOUSEEVENTF_MOVE, s_dx, s_dy, 0, 0 
  
 ' We cannot allow Windows to do the default HTCAPTION action, 
 ' because it redraws the caption during the move. THerefore 
 ' swallow HTCAPTION events and reimplement window moving 
 ' ourselves: 
 wParam = pGetHitTestCode() 
 If GetImplementation(Implementation) Then 
 If m_bActive Then 
 If m_eLastHT = HTCAPTION Then 
 MyMoveWindow 
 Exit Function 
 End If 
 Else 
 If m_eLastHT = HTCAPTION Then 
 SetForegroundWindow m_hWnd 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:34   回复此发言    
 
--------------------------------------------------------------------------------
 
66 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  MyMoveWindow 
 Exit Function 
 End If 
 End If 
  
 GetCursorPos tP 
 GetWindowRect m_hWnd, tR 
 tP.x = tP.x - tR.left: tP.y = tP.y - tR.top 
 OffsetRect tR, -tR.left, -tR.top 
 hdc = GetWindowDC(m_hWnd) 
 Implementation.NCMouseDown tP.x, tP.y, bHandled, hdc, tR.left, tR.top, tR.right, tR.bottom 
 ReleaseDC m_hWnd, hdc 
 If bHandled Then 
 Exit Function 
 End If 
  
 End If 
  
 ISubclass_MsgResponse = CallOldWindowProc(hwnd, iMsg, wParam, lParam) 
 ISubclass_WindowProc hwnd, WM_NCPAINT, 0, 0 
  
 Case WM_NCLBUTTONUP 
 If GetImplementation(Implementation) Then 
 GetCursorPos tP 
 GetWindowRect m_hWnd, tR 
 tP.x = tP.x - tR.left: tP.y = tP.y - tR.top 
 OffsetRect tR, -tR.left, -tR.top 
 hdc = GetWindowDC(m_hWnd) 
 Implementation.NCMouseDown tP.x, tP.y, bHandled, hdc, tR.left, tR.top, tR.right, tR.bottom 
 ReleaseDC m_hWnd, hdc 
 Implementation.NCMouseUp tP.x, tP.y, hdc, tR.left, tR.top, tR.right, tR.bottom 
 End If 
  
 Case WM_SETCURSOR 
 ' 
 ' a Very Nasty Hack :) 
 ' discovered by watching NeoPlanet and MSOffice 
 ' in Spy++ 
 ' 
 ' Without this, Win will redraw caption areas and 
 ' min/max/close buttons whenever the mouse is released 
 ' following a NC mouse down. 
 ' 
 s_bNoStyleChangeProcessing = True 
 lStyle = GetWindowLong(m_hWnd, GWL_STYLE) 
 SetWindowLong m_hWnd, GWL_STYLE, lStyle And Not WS_VISIBLE 
 ISubclass_WindowProc = CallOldWindowProc(hwnd, iMsg, wParam, lParam) 
 If GetMenu(m_hWnd) <> 0 Then 
 SetMenu m_hWnd, 0 
 End If 
 SetWindowLong m_hWnd, GWL_STYLE, lStyle 
 s_bNoStyleChangeProcessing = False 
  
 Case WM_INITMENU 
 ISubclass_MsgResponse = CallOldWindowProc(hwnd, iMsg, wParam, lParam) 
 ISubclass_WindowProc hwnd, WM_NCPAINT, 0, 0 
  
 Case WM_CHILDACTIVATE 
 If Not s_bChildActivate Then 
 s_bChildActivate = True 
 ISubclass_MsgResponse = CallOldWindowProc(hwnd, iMsg, wParam, lParam) 
 ISubclass_WindowProc hwnd, WM_NCPAINT, 0, 0 
 s_bChildActivate = False 
 End If 
  
 Case WM_SIZE 
 ' 
 ISubclass_MsgResponse = CallOldWindowProc(hwnd, iMsg, wParam, lParam) 
 ISubclass_WindowProc hwnd, WM_NCPAINT, 0, 0 
  
 Case WM_INITMENUPOPUP 
 ' 
 ' During a WM_INITMENUPOPUP, the system redraws the 
 ' min/max/close buttons. 
  
  
 ' Check HiWord of lParam to see whether this is 
 ' a SysMenu: 
 If Not (lParam And &HFFFF0000) = 0 Then 
 ' Sys Menu: 
 ISubclass_MsgResponse = CallOldWindowProc(hwnd, iMsg, wParam, lParam) 
 ISubclass_WindowProc hwnd, WM_NCPAINT, 0, 0 
 Else 
 ' App Menu: 
 ISubclass_MsgResponse = CallOldWindowProc(hwnd, iMsg, wParam, lParam) 
 ISubclass_WindowProc hwnd, WM_NCPAINT, 0, 0 
 If GetImplementation(Implementation) Then 
 Implementation.InitMenuPopup wParam, lParam 
 End If 
 End If 
  
 Case WM_ENTERMENULOOP, WM_EXITMENULOOP 
 ISubclass_MsgResponse = CallOldWindowProc(hwnd, iMsg, wParam, lParam) 
 ISubclass_WindowProc hwnd, WM_NCPAINT, 0, 0 
 If iMsg = WM_EXITMENULOOP Then 
 If GetImplementation(Implementation) Then 
 Implementation.ExitMenuLoop 
 End If 
 End If 
  
 Case WM_SETTEXT, WM_STYLECHANGED, WM_NCLBUTTONDBLCLK 
 ' 
 ' The whole title bar is repainted by the defwindowproc. 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:34   回复此发言    
 
--------------------------------------------------------------------------------
 
67 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  ' Therefore redraw once complete: 
 If Not s_bNoStyleChangeProcessing Then 
 ISubclass_WindowProc = CallOldWindowProc(hwnd, iMsg, wParam, lParam) 
 ISubclass_WindowProc hwnd, WM_NCPAINT, 0, 0 
 Else 
 ISubclass_WindowProc = CallOldWindowProc(hwnd, iMsg, wParam, lParam) 
 End If 
  
 Case WM_NCCALCSIZE 
 ' 
 ' No Hacks! 
 ' 
 ' This simply tells windows to modify the client 
 ' area to the appropriate size: 
 ' 
  
 ' First set the zoomed MDI Child flag: 
 m_bZoomedMDIChild = (IsMDIChildForm(hwnd) And (IsZoomed(hwnd) <> 0)) 
 If wParam <> 0 Then 
  
 ' Get the structure pointed to by lParam: 
 CopyMemory tNCR, ByVal lParam, Len(tNCR) 
 CopyMemory tWP, ByVal tNCR.lppos, Len(tWP) 
  
 'pDebugCalcSize tNCR 
 With tNCR.rgrc(0) 
 ' Set these 
 .left = tWP.x 
 .top = tWP.y 
 .right = tWP.x + tWP.cx 
 .bottom = tWP.y + tWP.cy 
  
 ' Defaults 
 m_lLeft = GetSystemMetrics(SM_CXFRAME) 
 m_lRight = m_lLeft 
 m_lTop = GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME) 
 m_lBottom = GetSystemMetrics(SM_CYFRAME) 
  
 ' If the window in question is an MDI child, then we 
 ' ant to ensure that the standard settings get sent 
 ' back to windows: to prevent drawing additional borders, 
 ' which aren't required: 
 If Not m_bZoomedMDIChild Then 
 ' If the implementation is valid then request the 
 ' physical size of the title bar and borders: 
 If GetImplementation(Implementation) Then 
 Implementation.GetLeftMarginWidth m_lLeft 
 Implementation.GetTopMarginHeight m_lTop 
 Implementation.GetRightMarginWidth m_lRight 
 Implementation.GetBottomMarginHeight m_lBottom 
 End If 
 End If 
  
 ' Set our physical left/top/right/bottom values: 
 .left = .left + m_lLeft 
 .top = .top + m_lTop 
 .right = .right - m_lRight 
 .bottom = .bottom - m_lBottom 
 End With 
  
 ' Return the new client area size to windows: 
 LSet tNCR.rgrc(1) = tNCR.rgrc(0) 
 CopyMemory ByVal lParam, tNCR, Len(tNCR) 
 ISubclass_WindowProc = WVR_VALIDRECTS 
  
 Else 
 ' lParam points to a rectangle 
 ISubclass_WindowProc = CallOldWindowProc(hwnd, iMsg, wParam, lParam) 
 End If 
  
 ' Check for the active window: 
 'lPtr = VarPtr(lpfMaximised) 
 'If Not m_hWndMDIClient = 0 Then 
 ' lhWnd = SendMessageLong(m_hWndMDIClient, WM_MDIGETACTIVE, 0, lPtr) 
 ' pShowMDIButtons lhWnd, (lpfMaximised <> 0) 
 'End If 
  
 Case WM_NCACTIVATE 
 ' 
 ' When we get a NC Activate The title bar is 
 ' being redrawn to show active or inactive states. 
 ' 
 ' This processing ensures the title bar is updated 
 ' correctly following state change: 
 ' 
  
 ' We must call the defwindowproc otherwise VB goes 
 ' funny. This draws a full titlebar: 
 m_bActive = Not (wParam = 0) 
 ISubclass_WindowProc = CallOldWindowProc(hwnd, iMsg, wParam, lParam) 
  
 ' Now fix it: 
 ISubclass_WindowProc m_hWnd, WM_NCPAINT, 0, 0 
  
 Case WM_ACTIVATEAPP 
 ' 
 ' This is for detecting which app is active 
 ' 
 m_bAppActive = Not (wParam = 0) 
  
 End Select 
  
End Function 
Private Function IsMDIChildForm(ByVal hwnd As Long) As Boolean 
Dim hWndP As Long 
Dim sBuf As String 
Dim iPos As Long 
 hWndP = GetParent(hwnd) 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:34   回复此发言    
 
--------------------------------------------------------------------------------
 
68 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  sBuf = String$(260, 0) 
 GetClassName hWndP, sBuf, 259 
 iPos = InStr(sBuf, vbNullChar) 
 If iPos > 1 Then 
 If left$(sBuf, iPos - 1) = "MDIClient" Then 
 IsMDIChildForm = True 
 End If 
 End If 
End Function 
Private Function pGetHitTestCode() As ECNCHitTestConstants 
Dim lStyle As Long 
Dim bCanSize As Boolean 
Dim Implementation As INCAreaModifier 
Dim eHt As ECNCHitTestConstants 
Dim tP As POINTAPI 
Dim tR As RECT 
  
 If GetImplementation(Implementation) Then 
 lStyle = GetWindowLong(m_hWnd, GWL_STYLE) 
 bCanSize = ((lStyle And WS_SIZEBOX) = WS_SIZEBOX) 
 eHt = HTCLIENT 
 GetCursorPos tP 
  
 GetWindowRect m_hWnd, tR 
 tP.x = tP.x - tR.left: tP.y = tP.y - tR.top 
 OffsetRect tR, -tR.left, -tR.top 
 eHt = HTCLIENT 
 If Not (PtInRect(tR, tP.x, tP.y) = 0) Then 
 ' Left 
 If tP.x <= m_lLeft Then 
 If tP.y <= m_lBottom Then 
 If bCanSize Then 
 eHt = HTTOPLEFT 
 End If 
 ElseIf tP.y >= tR.bottom - m_lBottom Then 
 If bCanSize Then 
 eHt = HTBOTTOMLEFT 
 End If 
 Else 
 If bCanSize Then 
 eHt = HTLEFT 
 End If 
 End If 
 ' Right 
 ElseIf tP.x >= tR.right - m_lRight Then 
 If tP.y <= m_lBottom Then 
 If bCanSize Then 
 eHt = HTTOPRIGHT 
 End If 
 ElseIf tP.y >= tR.bottom - m_lBottom Then 
 If bCanSize Then 
 eHt = HTBOTTOMRIGHT 
 End If 
 Else 
 If bCanSize Then 
 eHt = HTRIGHT 
 End If 
 End If 
 ' Top/Bottom? 
 ElseIf tP.y <= m_lBottom Then 
 If bCanSize Then 
 eHt = HTTOP 
 End If 
 ElseIf tP.y >= tR.bottom - m_lBottom Then 
 If bCanSize Then 
 eHt = HTBOTTOM 
 End If 
 ' Caption/Menu 
 ElseIf tP.y <= m_lTop Then 
 ' We assume for default that the caption 
 ' is the same as the system caption etc: 
 If tP.y <= m_lBottom + GetSystemMetrics(SM_CYCAPTION) Then 
 eHt = HTCAPTION 
 If tP.x <= GetSystemMetrics(SM_CYCAPTION) Then 
 eHt = HTSYSMENU 
 Else 
 ' todo min/max/close btns 
 End If 
 ElseIf tP.y > m_lBottom + GetSystemMetrics(SM_CYCAPTION) Then 
 eHt = HTCLIENT 
 End If 
 End If 
 End If 
 Implementation.HitTest tP.x, tP.y, eHt 
 End If 
 pGetHitTestCode = eHt 
  
End Function 
Public Sub DefaultNCPaint(ByVal hdc As Long, ByVal lLeft As Long, ByVal lTop As Long, ByVal lRight As Long, ByVal lBottom As Long) 
Dim tR As RECT, tTR As RECT, tSR As RECT, tBR As RECT 
Dim lFlag As Long 
Dim hBr As Long, hBrButton As Long 
 tR.left = lLeft 
 tR.top = lTop 
 tR.right = lRight 
 tR.bottom = lBottom 
 LSet tBR = tR 
 If m_bActive Then 
 lFlag = DC_ACTIVE 
 hBrButton = GetSysColorBrush(COLOR_ACTIVECAPTION) 
 hBr = GetSysColorBrush(COLOR_ACTIVEBORDER) 
 Else 
 hBrButton = GetSysColorBrush(COLOR_INACTIVECAPTION) 
 hBr = GetSysColorBrush(COLOR_INACTIVEBORDER) 
 End If 
 ' Titlebar area: 
 ' Draw the part between the edge & the client: 
 LSet tTR = tR 
 ' left edge 
 tTR.top = GetSystemMetrics(SM_CYFRAME) 
 tTR.bottom = tTR.bottom - GetSystemMetrics(SM_CYFRAME) 
 tTR.right = GetSystemMetrics(SM_CXFRAME) 
 FillRect hdc, tTR, hBr 
 ' top 
 LSet tTR = tR 
 tTR.bottom = GetSystemMetrics(SM_CYFRAME) 
 FillRect hdc, tTR, hBr 
 ' right 
 LSet tTR = tR 
 tTR.top = GetSystemMetrics(SM_CYFRAME) 
 tTR.bottom = tTR.bottom - GetSystemMetrics(SM_CYFRAME) 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:34   回复此发言    
 
--------------------------------------------------------------------------------
 
69 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  tTR.left = tTR.right - GetSystemMetrics(SM_CXFRAME) 
 FillRect hdc, tTR, hBr 
 ' bottom 
 LSet tTR = tR 
 tTR.top = tTR.bottom - GetSystemMetrics(SM_CYFRAME) 
 FillRect hdc, tTR, hBr 
 ' Draw the caption into the caption area: 
 ' top bit under titlebar: 
 LSet tTR = tR 
 tTR.top = GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CYCAPTION) - 1 
 tTR.bottom = tTR.top + 1 
 FillRect hdc, tTR, hBr 
 DeleteObject hBr 
 ' Draw the titlebar into a work DC to prevent flicker: 
 lFlag = lFlag Or DC_ICON Or DC_TEXT 
 LSet tTR = tR 
 tTR.left = tTR.left + GetSystemMetrics(SM_CXFRAME) 
 tTR.right = tTR.right - GetSystemMetrics(SM_CXFRAME) 
 tTR.top = tTR.top + GetSystemMetrics(SM_CYFRAME) 
 tTR.bottom = tTR.top + GetSystemMetrics(SM_CYCAPTION) - 1 
 LSet tR = tTR 
 OffsetRect tR, -tR.left, -tR.top 
 LSet tSR = tR 
 tSR.right = tSR.right - (tR.bottom - tR.top) * 3 - 2 
 DrawCaptionAPI m_hWnd, m_hDC, tSR, lFlag 
 ' Draw the titlebar buttons: 
 tSR.left = tSR.right 
 tSR.right = tR.right 
 FillRect m_hDC, tSR, hBrButton 
 DeleteObject hBrButton 
 InflateRect tR, 0, -2 
 tR.right = tR.right - 2 
 tR.left = tR.right - (tR.bottom - tR.top) - 2 
 DrawFrameControl m_hDC, tR, DFC_CAPTION, DFCS_CAPTIONCLOSE 
 OffsetRect tR, -(tR.right - tR.left + 2), 0 
 If IsZoomed(m_hWnd) Then 
 DrawFrameControl m_hDC, tR, DFC_CAPTION, DFCS_CAPTIONRESTORE 
 Else 
 DrawFrameControl m_hDC, tR, DFC_CAPTION, DFCS_CAPTIONMAX 
 End If 
 OffsetRect tR, -(tR.right - tR.left), 0 
 DrawFrameControl m_hDC, tR, DFC_CAPTION, DFCS_CAPTIONMIN 
 ' Finished drawing the NC area: 
 BitBlt hdc, tTR.left, tTR.top, tTR.right - tTR.left, tTR.bottom - tTR.top, m_hDC, 0, 0, vbSrcCopy 
 ' Edge 3d 
 DrawEdge hdc, tBR, EDGE_RAISED, BF_RECT 
End Sub 
Public Function GetImplementation(iTo As INCAreaModifier) As Boolean 
Dim lPtr As Long 
 lPtr = GetProp(m_hWnd, "vbalCNCImplementation") 
 If Not lPtr = 0 Then 
 Dim iToTemp As INCAreaModifier 
 CopyMemory iToTemp, lPtr, 4 
 Set iTo = iToTemp 
 CopyMemory iToTemp, 0&, 4 
 GetImplementation = True 
 End If 
End Function 
#If 0 = 1 Then 
Private Sub pDebugCalcSize(ByRef tNCR As NCCALCSIZE_PARAMS) 
Dim i As Long 
Dim tWP As WINDOWPOS 
 ' Use to show what is happening: 
 With tNCR 
 For i = 1 To 3 
 With .rgrc(i - 1) 
 Debug.Print .left, .top, .right, .bottom 
 End With 
 Next i 
 CopyMemory tWP, ByVal .lppos, Len(tWP) 
 With tWP 
 Debug.Print .x, .y, .x + .cx, .y + .cy 
 End With 
  
 End With 
End Sub 
#End If 
-------------- 
Option Explicit 
' APIs 
Private Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long 
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long 
Private Declare Function SetFocusAPI Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long 
Private Declare Function PtInRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal y As Long) As Long 
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer 
Private Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long 
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:34   回复此发言    
 
--------------------------------------------------------------------------------
 
70 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
 Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long 
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long 
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long 
Private Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long 
Private Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long 
Private Declare Function SetTextColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long 
Private Declare Function SetBkMode Lib "gdi32" (ByVal hdc As Long, ByVal nBkMode As Long) As Long 
Private Declare Function OleTranslateColor Lib "OLEPRO32.DLL" (ByVal OLE_COLOR As Long, ByVal HPALETTE As Long, pccolorref As Long) As Long 
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long 
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long 
Private Const CLR_INVALID = -1 
Private Const OPAQUE = 2 
Private Const TRANSPARENT = 1 
Private Const DT_BOTTOM = &H8 
Private Const DT_CENTER = &H1 
Private Const DT_LEFT = &H0 
Private Const DT_CALCRECT = &H400 
Private Const DT_WORDBREAK = &H10 
Private Const DT_VCENTER = &H4 
Private Const DT_TOP = &H0 
Private Const DT_TABSTOP = &H80 
Private Const DT_SINGLELINE = &H20 
Private Const DT_RIGHT = &H2 
Private Const DT_NOCLIP = &H100 
Private Const DT_INTERNAL = &H1000 
Private Const DT_EXTERNALLEADING = &H200 
Private Const DT_EXPANDTABS = &H40 
Private Const DT_CHARSTREAM = 4 
Private Const DT_NOPREFIX = &H800 
Private Const DT_EDITCONTROL = &H2000& 
Private Const DT_PATH_ELLIPSIS = &H4000& 
Private Const DT_END_ELLIPSIS = &H8000& 
Private Const DT_MODIFYSTRING = &H10000 
Private Const DT_RTLREADING = &H20000 
Private Const DT_WORD_ELLIPSIS = &H40000 
' Font: 
Private Const LF_FACESIZE = 32 
Private Type LOGFONT 
 lfHeight As Long 
 lfWidth As Long 
 lfEscapement As Long 
 lfOrientation As Long 
 lfWeight As Long 
 lfItalic As Byte 
 lfUnderline As Byte 
 lfStrikeOut As Byte 
 lfCharSet As Byte 
 lfOutPrecision As Byte 
 lfClipPrecision As Byte 
 lfQuality As Byte 
 lfPitchAndFamily As Byte 
 lfFaceName(LF_FACESIZE) As Byte 
End Type 
Private Const FW_NORMAL = 400 
Private Const FW_BOLD = 700 
Private Const FF_DONTCARE = 0 
Private Const DEFAULT_QUALITY = 0 
Private Const DEFAULT_PITCH = 0 
Private Const DEFAULT_CHARSET = 1 
Private Declare Function CreateFontIndirect Lib "gdi32" Alias "CreateFontIndirectA" (lpLogFont As LOGFONT) As Long 
Private Declare Function MulDiv Lib "kernel32" (ByVal nNumber As Long, ByVal nNumerator As Long, ByVal nDenominator As Long) As Long 
Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:34   回复此发言    
 
--------------------------------------------------------------------------------
 
71 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
 Private Const LOGPIXELSY = 90 
Private Declare Function SetMenu Lib "user32" (ByVal hwnd As Long, ByVal hMenu As Long) As Long 
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long 
Private Const GWL_STYLE = (-16) 
Private Const WS_BORDER = &H800000 
Private Const WS_CAPTION = &HC00000 ' WS_BORDER Or WS_DLGFRAME 
Private Const WS_CHILD = &H40000000 
Private Const WS_CLIPCHILDREN = &H2000000 
Private Const WS_CLIPSIBLINGS = &H4000000 
Private Const WS_DISABLED = &H8000000 
Private Const WS_DLGFRAME = &H400000 
Private Const WS_GROUP = &H20000 
Private Const WS_HSCROLL = &H100000 
Private Const WS_MAXIMIZE = &H1000000 
Private Const WS_MAXIMIZEBOX = &H10000 
Private Const WS_MINIMIZE = &H20000000 
Private Const WS_MINIMIZEBOX = &H20000 
Private Const WS_OVERLAPPED = &H0& 
Private Const WS_POPUP = &H80000000 
Private Const WS_SYSMENU = &H80000 
Private Const WS_TABSTOP = &H10000 
Private Const WS_THICKFRAME = &H40000 
Private Const WS_VISIBLE = &H10000000 
Private Const WS_VSCROLL = &H200000 
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 
Private Const WM_SYSCOMMAND = &H112 
' Implementation 
Implements INCAreaModifier 
Private Enum ECNCButtonStates 
 up 
 Down 
End Enum 
Private m_cNCS As cNCCalcSize 
Private m_hWnd As Long 
' MemDCs for storing GFX 
Private m_cBorder As cMemDC 
Private m_cCaption As cMemDC 
' MemDC for building caption: 
Private m_cFF As cMemDC 
' and l/r borders 
Private m_cFFB As cMemDC 
' Menu bar: 
Private m_cMenu As cMenuBar 
Private m_oActiveCaptionColor As OLE_COLOR 
Private m_oInActiveCaptionColor As OLE_COLOR 
Private m_fnt As IFont 
Private m_oActiveMenuColor As OLE_COLOR 
Private m_oActiveMenuColorOver As OLE_COLOR 
Private m_oInActiveMenuColor As OLE_COLOR 
Private m_oMenuBackgroundColor As OLE_COLOR 
Private m_fntMenu As IFont 
Private m_lButtonWidth As Long 
Private m_lButtonHeight As Long 
Private m_lActiveLeftEnd As Long 
Private m_lActiveRightStart As Long 
Private m_lActiveRightEnd As Long 
Private m_lInactiveOffset As Long 
Private m_tBtn(0 To 2) As RECT 
Private m_bMaximise As Boolean 
Private m_bMinimise As Boolean 
Private m_bClose As Boolean 
Private m_bMouseDownMinimise As Boolean 
Private m_bMouseDownMaximise As Boolean 
Private m_bMouseDownClose As Boolean 
 
Public Sub Detach() 
Dim lMenu As Long 
 If Not m_cNCS Is Nothing Then 
 m_cNCS.Detach 
 End If 
 If Not m_cMenu Is Nothing Then 
 lMenu = m_cMenu.hMenu 
 m_cMenu.Detach 
 End If 
 If Not (lMenu = 0) Then 
 SetMenu m_hWnd, lMenu 
 End If 
  
End Sub 
Public Sub Attach( _ 
 f As Object, _ 
 PicCaption As StdPicture, _ 
 PicBorder As StdPicture, _ 
 lButtonWidth As Long, _ 
 lButtonHeight As Long, _ 
 lActiveLeftEnd As Long, _ 
 lActiveRightStart As Long, _ 
 lActiveRightEnd As Long, _ 
 lInactiveOffset As Long _ 
 ) 
 LockWindowUpdate f.hwnd 
 Detach 
  
 ' Store the pictures: 
 Set m_cCaption = New cMemDC 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:34   回复此发言    
 
--------------------------------------------------------------------------------
 
72 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  m_cCaption.CreateFromPicture PicCaption 
 Set m_cBorder = New cMemDC 
 m_cBorder.CreateFromPicture PicBorder 
  
 ' FF drawing 
 Set m_cFF = New cMemDC 
 Set m_cFFB = New cMemDC 
  
 ' Store passed in vars: 
 m_lButtonWidth = lButtonWidth 
 m_lButtonHeight = lButtonHeight 
 m_lActiveLeftEnd = lActiveLeftEnd 
 m_lActiveRightStart = lActiveRightStart 
 m_lActiveRightEnd = lActiveRightEnd 
 m_lInactiveOffset = lInactiveOffset 
  
 ' Store hWNd: 
 m_hWnd = f.hwnd 
  
 ' Menu: 
 Set m_cMenu = New cMenuBar 
 m_cMenu.Attach m_hWnd 
 m_cMenu.Font = m_fntMenu 
 m_cMenu.SetColors m_oActiveMenuColor, m_oActiveMenuColorOver, m_oInActiveMenuColor, m_oMenuBackgroundColor 
 m_cMenu.CaptionHeight = m_cCaption.Height 
  
 ' Start non-client modification: 
 Set m_cNCS = New cNCCalcSize 
 m_cNCS.Attach Me 
 m_cNCS.Display f 
  
 If IsWindowVisible(m_hWnd) <> 0 Then 
 SetForegroundWindow m_hWnd 
 SetFocusAPI m_hWnd 
 SendMessageLong m_hWnd, WM_NCACTIVATE, 1, 0 
 End If 
  
 LockWindowUpdate 0 
  
End Sub 
Public Property Get MenuBackgroundColor() As OLE_COLOR 
 MenuBackgroundColor = m_oMenuBackgroundColor 
End Property 
Public Property Let MenuBackgroundColor(ByVal oColor As OLE_COLOR) 
 m_oMenuBackgroundColor = oColor 
End Property 
Public Property Get ActiveCaptionColor() As OLE_COLOR 
 ActiveCaptionColor = m_oActiveCaptionColor 
End Property 
Public Property Let ActiveCaptionColor(ByVal oColor As OLE_COLOR) 
 m_oActiveCaptionColor = oColor 
End Property 
Public Property Get InActiveCaptionColor() As OLE_COLOR 
 InActiveCaptionColor = m_oInActiveCaptionColor 
End Property 
Public Property Let InActiveCaptionColor(ByVal oColor As OLE_COLOR) 
 m_oInActiveCaptionColor = oColor 
End Property 
Public Property Get CaptionFont() As IFont 
 Set CaptionFont = m_fnt 
End Property 
Public Property Let CaptionFont(iFnt As IFont) 
 Set m_fnt = iFnt 
End Property 
Public Property Get MenuFont() As IFont 
 Set MenuFont = m_fntMenu 
End Property 
Public Property Let MenuFont(iFnt As IFont) 
 Set m_fntMenu = iFnt 
End Property 
Public Property Get ActiveMenuColor() As OLE_COLOR 
 ActiveMenuColor = m_oActiveMenuColor 
End Property 
Public Property Get ActiveMenuColorOver() As OLE_COLOR 
 ActiveMenuColorOver = m_oActiveMenuColorOver 
End Property 
Public Property Get InActiveMenuColor() As OLE_COLOR 
 InActiveMenuColor = m_oInActiveMenuColor 
End Property 
Public Property Let ActiveMenuColor(oColor As OLE_COLOR) 
 m_oActiveMenuColor = oColor 
End Property 
Public Property Let ActiveMenuColorOver(oColor As OLE_COLOR) 
 m_oActiveMenuColorOver = oColor 
End Property 
Public Property Let InActiveMenuColor(oColor As OLE_COLOR) 
 m_oInActiveMenuColor = oColor 
End Property 
Private Sub Class_Initialize() 
 m_oActiveCaptionColor = &HCCCCCC 
 m_oInActiveCaptionColor = &H999999 
 m_oActiveMenuColor = &H0& 
 m_oActiveMenuColorOver = &H0& 
 m_oInActiveMenuColor = &H808080 
 m_oMenuBackgroundColor = &HFFFFFF 
 Set m_fnt = New StdFont 
 m_fnt.Name = "MS Sans Serif" 
 Set m_fntMenu = New StdFont 
 m_fntMenu.Name = "MS Sans Serif" 
End Sub 
Private Sub Class_Terminate() 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:34   回复此发言    
 
--------------------------------------------------------------------------------
 
73 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  ' 
End Sub 
Private Function INCAreaModifier_AltKeyAccelerator(ByVal vKey As KeyCodeConstants) As Long 
 INCAreaModifier_AltKeyAccelerator = m_cMenu.AltKeyAccelerator(vKey) 
End Function 
Private Sub INCAreaModifier_ExitMenuLoop() 
 m_cMenu.pRestoreList 
End Sub 
Private Sub INCAreaModifier_HitTest(ByVal x As Long, ByVal y As Long, eHitTest As ECNCHitTestConstants) 
Dim bMouseOverClose As Boolean 
Dim bMouseOverMaximise As Boolean 
Dim bMouseOverMinimise As Boolean 
Dim bBtnMouseDown As Boolean 
Dim hdc As Long 
 ' 
 Dim tR As RECT 
 tR.left = 12: tR.top = 11: tR.right = 42: tR.bottom = 43 
 If PtInRect(tR, x, y) <> 0 Then 
 eHitTest = HTSYSMENU 
 Exit Sub 
 End If 
 ' Code for working out whether in the buttons or not: 
 If m_bClose Then 
 If PtInRect(m_tBtn(0), x, y) <> 0 Then 
 eHitTest = HTSYSMENU 
 bMouseOverClose = True 
 Else 
 bMouseOverClose = False 
 End If 
 End If 
 If m_bMaximise Then 
 If PtInRect(m_tBtn(1), x, y) <> 0 Then 
 eHitTest = HTSYSMENU 
 bMouseOverMaximise = True 
 Else 
 bMouseOverMaximise = False 
 End If 
 End If 
 If m_bMinimise Then 
 If PtInRect(m_tBtn(2), x, y) <> 0 Then 
 eHitTest = HTSYSMENU 
 bMouseOverMinimise = True 
 Else 
 bMouseOverMinimise = False 
 End If 
 End If 
  
 hdc = GetWindowDC(m_hWnd) 
  
 bBtnMouseDown = GetAsyncKeyState(vbLeftButton) 
 If m_bClose Then 
 If Not (m_bMouseDownClose = bMouseOverClose) Then 
 If bMouseOverClose And bBtnMouseDown And m_bMouseDownClose Then 
 DrawButton hdc, 0, Down 
 Else 
 DrawButton hdc, 0, up 
 End If 
 End If 
 End If 
 If m_bMaximise Then 
 If Not (m_bMouseDownMaximise = bMouseOverMaximise) Then 
 If bMouseOverMaximise And bBtnMouseDown And m_bMouseDownMaximise Then 
 DrawButton hdc, 1, Down 
 Else 
 DrawButton hdc, 1, up 
 End If 
 End If 
 End If 
 If m_bMinimise Then 
 If Not (m_bMouseDownMinimise = bMouseOverMinimise) Then 
 If bMouseOverMinimise And bBtnMouseDown And m_bMouseDownMinimise Then 
 DrawButton hdc, 2, Down 
 Else 
 DrawButton hdc, 2, up 
 End If 
 End If 
 End If 
 ReleaseDC m_hWnd, hdc 
  
End Sub 
Private Property Get INCAreaModifier_hWnd() As Long 
 INCAreaModifier_hWnd = m_hWnd 
End Property 
Private Sub INCAreaModifier_InitMenuPopup(ByVal wParam As Long, ByVal lParam As Long) 
 ' Set all the menu items to Owner-Draw: 
 ' wParam = hMenu 
 m_cMenu.OwnerDrawMenu wParam 
End Sub 
Private Sub INCAreaModifier_NCMouseDown(ByVal x As Long, ByVal y As Long, bHandled As Boolean, ByVal hdc As Long, ByVal lLeft As Long, ByVal lTop As Long, ByVal lRight As Long, ByVal lBottom As Long) 
 If m_bClose Then 
 If PtInRect(m_tBtn(0), x, y) <> 0 Then 
 ' Redraw close button pressed: 
 DrawButton hdc, 0, Down 
 m_bMouseDownClose = True 
 bHandled = True 
 End If 
 End If 
 If m_bMaximise Then 
 If PtInRect(m_tBtn(1), x, y) <> 0 Then 
 ' Redraw maximise button pressed: 
 DrawButton hdc, 1, Down 
 m_bMouseDownMaximise = True 
 bHandled = True 
 End If 
 End If 
 If m_bMinimise Then 
 If PtInRect(m_tBtn(2), x, y) <> 0 Then 
 ' Redraw minimise button pressed: 
 DrawButton hdc, 2, Down 
 m_bMouseDownMinimise = True 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:34   回复此发言    
 
--------------------------------------------------------------------------------
 
74 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  bHandled = True 
 End If 
 End If 
End Sub 
Private Sub INCAreaModifier_NCMouseUp(ByVal x As Long, ByVal y As Long, ByVal hdc As Long, ByVal lLeft As Long, ByVal lTop As Long, ByVal lRight As Long, ByVal lBottom As Long) 
Dim lStyle As Long 
 If m_bClose Then 
 If PtInRect(m_tBtn(0), x, y) <> 0 Then 
 If m_bMouseDownClose Then 
 m_cNCS.SysCommand SC_CLOSE 
 End If 
 End If 
 End If 
 If m_bMaximise Then 
 If PtInRect(m_tBtn(1), x, y) <> 0 Then 
 If m_bMouseDownMaximise Then 
 ' Redraw maximise button pressed: 
 lStyle = GetWindowLong(m_hWnd, GWL_STYLE) 
 If ((lStyle And WS_MAXIMIZE) = WS_MAXIMIZE) Then 
 m_cNCS.SysCommand SC_RESTORE 
 Else 
 m_cNCS.SysCommand SC_MAXIMIZE 
 End If 
 End If 
 End If 
 End If 
 If m_bMinimise Then 
 If PtInRect(m_tBtn(2), x, y) <> 0 Then 
 If m_bMouseDownMinimise Then 
 m_cNCS.SysCommand SC_MINIMIZE 
 End If 
 End If 
 End If 
 DrawButton hdc, 0, up 
 DrawButton hdc, 1, up 
 DrawButton hdc, 2, up 
  
 m_bMouseDownMinimise = False 
 m_bMouseDownMaximise = False 
 m_bMouseDownClose = False 
  
End Sub 
Private Sub DrawButton(ByVal hdc As Long, ByVal iIndex As Long, ByVal eState As ECNCButtonStates) 
Dim lY As Long 
Dim lStyle As Long 
 If eState = Down Then 
 lY = m_lButtonHeight 
 Else 
 lY = 0 
 End If 
 Select Case iIndex 
 Case 0 
 If m_bClose Then 
 BitBlt hdc, m_tBtn(0).left, m_tBtn(0).top, m_lButtonWidth, m_lButtonHeight, m_cCaption.hdc, 241, lY, vbSrcCopy 
 End If 
 Case 1 
 If m_bMaximise Then 
 lStyle = GetWindowLong(m_hWnd, GWL_STYLE) 
 If ((lStyle And WS_MAXIMIZE) = WS_MAXIMIZE) Then 
 BitBlt hdc, m_tBtn(1).left, m_tBtn(1).top, m_lButtonWidth, m_lButtonHeight, m_cCaption.hdc, 240 + m_lButtonWidth, lY, vbSrcCopy 
 Else 
 BitBlt hdc, m_tBtn(1).left, m_tBtn(1).top, m_lButtonWidth, m_lButtonHeight, m_cCaption.hdc, 240 + m_lButtonWidth * 2, lY, vbSrcCopy 
 End If 
 End If 
 Case 2 
 If m_bMinimise Then 
 BitBlt hdc, m_tBtn(2).left, m_tBtn(2).top, m_lButtonWidth, m_lButtonHeight, m_cCaption.hdc, 240 + m_lButtonWidth * 3, lY, vbSrcCopy 
 End If 
 End Select 
End Sub 
Private Sub INCAreaModifier_NCPaint(ByVal hdc As Long, ByVal lLeft As Long, ByVal lTop As Long, ByVal lRight As Long, ByVal lBottom As Long) 
Dim lX As Long, lXE As Long 
Dim lY As Long 
Dim lW As Long, lH As Long, lRW As Long 
Dim lT As Long 
Dim lSrcDC As Long, lSrcX As Long, lSrcY As Long 
Dim lOrgX As Long 
Dim bNoMiddle As Boolean 
Dim tR As RECT 
Dim sCaption As String 
Dim lLen As Long 
Dim tLF As LOGFONT 
Dim hFnt As Long 
Dim hFntOld As Long 
Dim lStyle As Long 
Dim lhDC As Long, lhDCB As Long 
Dim hFntMenu As Long 
 LockWindowUpdate hdc 
 ' Here we do the work! 
 tR.left = lLeft 
 tR.top = lTop 
 tR.right = lRight 
 tR.bottom = lBottom 
  
 ' Ensure mem DCs are big enough to draw into: 
 m_cFF.Width = tR.right - tR.left + 1 
 m_cFF.Height = m_cCaption.Height 
 lhDC = m_cFF.hdc 
  
 m_cFFB.Width = m_cBorder.Width * 2 
 m_cFFB.Height = tR.bottom - tR.top + 1 
 lhDCB = m_cFFB.hdc 
  
  
 pOLEFontToLogFont m_fnt, hdc, tLF 
 If m_cNCS.WindowActive Then 
 tLF.lfWeight = FW_BOLD 
 End If 
 hFnt = CreateFontIndirect(tLF) 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:34   回复此发言    
 
--------------------------------------------------------------------------------
 
75 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  hFntOld = SelectObject(lhDC, hFnt) 
  
 If m_cNCS.WindowActive Then 
 lOrgX = 0 
 Else 
 lOrgX = m_lInactiveOffset 
 End If 
 ' Draw the caption 
 BitBlt lhDC, lLeft, lTop, lLeft + m_lActiveLeftEnd, m_cCaption.Height, m_cCaption.hdc, lOrgX, 0, vbSrcCopy 
 lRW = (m_lActiveRightEnd - m_lActiveRightStart + 1) 
 lXE = lRight - lRW + 1 
 If lXE < lLeft + lRW Then 
 lXE = lLeft + lRW 
 bNoMiddle = True 
 End If 
 BitBlt lhDC, lXE, lTop, lRW, m_cCaption.Height, m_cCaption.hdc, lOrgX + m_lActiveRightStart, 0, vbSrcCopy 
  
 ' Buttons: 
 lStyle = GetWindowLong(m_hWnd, GWL_STYLE) 
 m_bMaximise = ((lStyle And WS_MAXIMIZEBOX) = WS_MAXIMIZEBOX) 
 m_bMinimise = ((lStyle And WS_MINIMIZEBOX) = WS_MINIMIZEBOX) 
 m_bClose = ((lStyle And WS_SYSMENU) = WS_SYSMENU) 
 m_tBtn(0).left = lXE + lRW - m_cBorder.Height + 4 
 If m_bClose Then 
 m_tBtn(0).left = m_tBtn(0).left - (m_lButtonWidth + 1) 
 m_tBtn(0).top = lTop + 5 
 m_tBtn(0).right = m_tBtn(0).left + m_lButtonWidth + 1 
 m_tBtn(0).bottom = m_tBtn(0).top + m_lButtonHeight 
 DrawButton lhDC, 0, up 
 End If 
 If m_bMaximise Then 
 m_tBtn(1).left = m_tBtn(0).left - (m_lButtonWidth + 1) 
 m_tBtn(1).top = lTop + 5 
 m_tBtn(1).right = m_tBtn(1).left + m_lButtonWidth + 1 
 m_tBtn(1).bottom = m_tBtn(1).top + m_lButtonHeight 
 DrawButton lhDC, 1, up 
 Else 
 m_tBtn(1).left = m_tBtn(0).left 
 End If 
 If m_bMinimise Then 
 m_tBtn(2).left = m_tBtn(1).left - (m_lButtonWidth + 1) 
 m_tBtn(2).top = lTop + 5 
 m_tBtn(2).right = m_tBtn(2).left + (m_lButtonWidth + 1) 
 m_tBtn(2).bottom = m_tBtn(2).top + m_lButtonHeight 
 DrawButton lhDC, 2, up 
 End If 
  
 ' Fill in: 
 lX = lLeft + 90 
 Do 
 lW = 52 
 If lX + 52 > lXE Then 
 lW = lXE - lX 
 End If 
 BitBlt lhDC, lX, 0, lW, m_cCaption.Height, m_cCaption.hdc, lOrgX + m_lActiveLeftEnd + 1, 0, vbSrcCopy 
 lX = lX + 52 
 Loop While lX < lXE 
  
 If Not bNoMiddle Then 
  
 ' Draw the caption: 
 SetBkMode lhDC, TRANSPARENT 
 If m_cNCS.WindowActive Then 
 SetTextColor lhDC, TranslateColor(m_oActiveCaptionColor) 
 Else 
 SetTextColor lhDC, TranslateColor(m_oInActiveCaptionColor) 
 End If 
 lLen = GetWindowTextLength(m_hWnd) 
 If lLen > 0 Then 
 tR.left = lLeft + 92 
 tR.right = lRight - 96 
 tR.top = m_cBorder.Height + 1 
 tR.bottom = tR.top + (m_cCaption.Height - m_cBorder.Height - 2) \ 2 
 sCaption = String$(lLen + 1, 0) 
 GetWindowText m_hWnd, sCaption, lLen + 1 
 DrawText lhDC, sCaption, -1, tR, DT_LEFT Or DT_SINGLELINE Or DT_END_ELLIPSIS Or DT_NOPREFIX 
 End If 
  
 End If 
  
 ' Menu: 
 m_cMenu.hMenu = m_cNCS.hMenu 
 lW = lXE - m_lActiveLeftEnd 
 tLF.lfWeight = FW_NORMAL 
 hFntMenu = CreateFontIndirect(tLF) 
 m_cMenu.Render hFntMenu, lhDC, m_lActiveLeftEnd, m_cCaption.Height \ 2, lW, m_cCaption.Height \ 2, -m_cCaption.Height \ 2 + 2 
 DeleteObject hFntMenu 
  
 BitBlt hdc, 0, 0, m_cFF.Width, m_cFF.Height, lhDC, 0, 0, vbSrcCopy 
  
  
 ' Draw the border: 
 lY = m_cCaption.Height 
 lH = m_cBorder.Height 
 lW = lH 
 lSrcDC = m_cBorder.hdc 
 lSrcX = lW * 4 
 lSrcY = 0 
 ' We draw double the amount each time for a quick finish: 
 Do 
 ' Draw to lhs: 
 BitBlt lhDCB, 0, lY + lTop, lW, lH, lSrcDC, 0, lSrcY, vbSrcCopy 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:34   回复此发言    
 
--------------------------------------------------------------------------------
 
76 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  ' Draw to right: 
 BitBlt lhDCB, lW, lY + lTop, lW, lH, lSrcDC, lSrcX, lSrcY, vbSrcCopy 
 'Exit Do 
 If lSrcY = 0 Then 
 lSrcDC = lhDCB 
 lSrcY = lY + lTop 
 lSrcX = lW 
 lY = lY + lH 
 Else 
 lY = lY + lH 
 lH = lH * 2 
 End If 
 Loop While lY < lBottom - lW 
 lT = m_cCaption.Height + lTop 
 lH = lBottom - lT 
 BitBlt hdc, lLeft, lT, lW, lH, lhDCB, 0, lT, vbSrcCopy 
 BitBlt hdc, lRight - lW, lT, lW, lH, lhDCB, lW, lT, vbSrcCopy 
  
 lT = lBottom - lW 
 If lT < m_cCaption.Height Then 
 lT = m_cCaption.Height 
 End If 
  
 ' Bottom - we draw into the caption mem dc for flicker free 
 lX = lLeft + lW 
 lH = m_cBorder.Height 
 lSrcDC = m_cBorder.hdc 
 lSrcX = lW * 3 
 lSrcY = 0 
 ' We draw double the amount each time for a quick finish: 
 Do 
 BitBlt lhDC, lX, 0, lW, lH, lSrcDC, lSrcX, lSrcY, vbSrcCopy 
 If lSrcY = 0 Then 
 lSrcDC = lhDC 
 lSrcX = lX 
 lX = lX + lW 
 Else 
 lX = lX + lW 
 lW = lW * 2 
 End If 
 Loop While lX < lRight - lH 
 ' Bottom corners 
 BitBlt lhDC, lLeft, 0, lH, lH, m_cBorder.hdc, lH * 2, 0, vbSrcCopy 
 BitBlt lhDC, lRight - lH, 0, lH, lH, m_cBorder.hdc, lH * 6, 0, vbSrcCopy 
  
 ' Swap out to display: 
 BitBlt hdc, lLeft, lT, m_cFF.Width, lH, lhDC, 0, 0, vbSrcCopy 
  
 SelectObject lhDC, hFntOld 
 DeleteObject hFnt 
 LockWindowUpdate 0 
End Sub 
Private Sub INCAreaModifier_GetBottomMarginHeight(cy As Long) 
 ' 
 cy = m_cBorder.Height 
End Sub 
Private Sub INCAreaModifier_GetLeftMarginWidth(cx As Long) 
 ' 
 cx = m_cBorder.Height 
End Sub 
Private Sub INCAreaModifier_GetRightMarginWidth(cx As Long) 
 ' 
 cx = m_cBorder.Height 
End Sub 
Private Sub INCAreaModifier_GetTopMarginHeight(cy As Long) 
 ' 
 cy = m_cCaption.Height 
End Sub 
' Convert Automation color to Windows color 
Private Function TranslateColor(ByVal clr As OLE_COLOR, _ 
 Optional hPal As Long = 0) As Long 
 If OleTranslateColor(clr, hPal, TranslateColor) Then 
 TranslateColor = CLR_INVALID 
 End If 
End Function 
Private Sub pOLEFontToLogFont(fntThis As StdFont, ByVal hdc As Long, tLF As LOGFONT) 
Dim sFont As String 
Dim iChar As Integer 
Dim b() As Byte 
 ' Convert an OLE StdFont to a LOGFONT structure: 
 With tLF 
 sFont = fntThis.Name 
 b = StrConv(sFont, vbFromUnicode) 
 For iChar = 1 To Len(sFont) 
 .lfFaceName(iChar - 1) = b(iChar - 1) 
 Next iChar 
 ' Based on the Win32SDK documentation: 
 .lfHeight = -MulDiv((fntThis.Size), (GetDeviceCaps(hdc, LOGPIXELSY)), 72) 
 .lfItalic = fntThis.Italic 
 If (fntThis.Bold) Then 
 .lfWeight = FW_BOLD 
 Else 
 .lfWeight = FW_NORMAL 
 End If 
 .lfUnderline = fntThis.Underline 
 .lfStrikeOut = fntThis.Strikethrough 
 .lfCharSet = fntThis.Charset 
 End With 
End Sub 
 
-------------- 
Option Explicit 
Private iInterval As Long 
Private id As Long 
' User can attach any Variant data they want to the timer 
Public Item As Variant 
Public Event ThatTime() 
' SubTimer is independent of VBCore, so it hard codes error handling 
Public Enum EErrorTimer 
 eeBaseTimer = 13650 ' CTimer 
 eeTooManyTimers ' No more than 10 timers allowed per class 
 eeCantCreateTimer ' Can't create system timer 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:34   回复此发言    
 
--------------------------------------------------------------------------------
 
77 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
 End Enum 
Friend Sub ErrRaise(e As Long) 
 Dim sText As String, sSource As String 
 If e > 1000 Then 
 sSource = App.EXEName & ".WindowProc" 
 Select Case e 
 Case eeTooManyTimers 
 sText = "No more than 10 timers allowed per class" 
 Case eeCantCreateTimer 
 sText = "Can't create system timer" 
 End Select 
 Err.Raise e Or vbObjectError, sSource, sText 
 Else 
 ' Raise standard Visual Basic error 
 Err.Raise e, sSource 
 End If 
End Sub 
Property Get Interval() As Long 
 Interval = iInterval 
End Property 
' Can't just change interval--you must kill timer and start a new one 
Property Let Interval(iIntervalA As Long) 
 Dim f As Boolean 
 If iIntervalA > 0 Then 
 ' Don't mess with it if interval is the same 
 If iInterval = iIntervalA Then Exit Property 
 ' Must destroy any existing timer to change interval 
 If iInterval Then 
 f = TimerDestroy(Me) 
 Debug.Assert f ' Shouldn't fail 
 End If 
 ' Create new timer with new interval 
 iInterval = iIntervalA 
 If TimerCreate(Me) = False Then ErrRaise eeCantCreateTimer 
 Else 
 If (iInterval > 0) Then 
 iInterval = 0 
 f = TimerDestroy(Me) 
 Debug.Assert f ' Shouldn't fail 
 End If 
 End If 
End Property 
' Must be public so that Timer object can't terminate while client's ThatTime 
' event is being processed--Friend wouldn't prevent this disaster 
Public Sub PulseTimer() 
 RaiseEvent ThatTime 
End Sub 
Friend Property Get TimerID() As Long 
 TimerID = id 
End Property 
Friend Property Let TimerID(idA As Long) 
 id = idA 
End Property 
Private Sub Class_Terminate() 
 Interval = 0 
End Sub 
---------------- 
Option Explicit 
' ======================================================================= 
' FileName: cToolbarMenu 
' Author: Steve McMahon 
' Date: 8 Feb 2000 
' 
' Allows menus to pop up and cancel as the user hovers 
' over toolbar buttons. 
' 
' 
' Copyright ?2000 Steve McMahon 
' ======================================================================= 
Private Enum TRACKINGSTATE '{ // menubar has three states: 
 TRACK_NONE = 0 ', // * normal, not tracking anything 
 TRACK_BUTTON ', // * tracking buttons (F10/Alt mode) 
 TRACK_POPUP '// * tracking popups 
End Enum 
' Track popup menu constants: 
Private m_iTrackingState As TRACKINGSTATE 
Private m_bProcessRightArrow As Boolean 
Private m_bProcessLeftArrow As Boolean 
Private m_hMenuTracking As Long 
Private m_iPopupTracking As Long 
Private m_bEscapeWasPressed As Boolean 
Private m_tPMouse As POINTAPI 
Private m_iNewPopup As Long 
Private m_bIn As Boolean 
Private m_hWnd As Long 
Private m_lPtr As Long 
Private m_iExit As Integer 
Implements ISubclass 
Friend Sub CoolMenuAttach(ByRef hWndA As Long, ByVal cBar As cMenuBar) 
Dim lPtr As Long 
 m_iExit = 0 
 CoolMenuDetach 
 m_hWnd = hWndA 
 SendMessageLong m_hWnd, WM_ENTERMENULOOP, 0, 0 
 AttachMessage Me, m_hWnd, WM_MENUSELECT 
 m_lPtr = ObjPtr(cBar) 
  
End Sub 
Friend Sub CoolMenuDetach() 
 If (m_hWnd <> 0) Then 
 SendMessageLong m_hWnd, WM_EXITMENULOOP, 0, 0 
 DetachMessage Me, m_hWnd, WM_MENUSELECT 
 m_hWnd = 0 
 End If 
 m_hWnd = 0 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:34   回复此发言    
 
--------------------------------------------------------------------------------
 
78 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  m_lPtr = 0 
End Sub 
'///////////////// 
'// When user selects a new menu item, note whether it has a submenu 
'// and/or parent menu, so I know whether right/left arrow should 
'// move to the next popup. 
'// 
Private Sub MenuSelect(ByVal hMenu As Long, ByVal iItem As Long) 
 If (m_iTrackingState > 0) Then 
 '// process right-arrow if item is NOT a submenu 
 m_bProcessRightArrow = (GetSubMenu(hMenu, iItem) = 0) 
 '// process left-arrow if curent menu is one I'm tracking 
 m_bProcessLeftArrow = (hMenu = m_hMenuTracking) 
 End If 
End Sub 
'////////////////// 
'// Handle menu input event: Look for left/right to change popup menu, 
'// mouse movement over over a different menu button for "hot" popup effect. 
'// Returns TRUE if message handled (to eat it). 
'// 
Friend Function MenuInput(m As Msg) As Boolean 
Dim iMsg As Long 
Dim vKey As Long 
Dim tP As POINTAPI 
Dim iButton As Long 
 'ASSERT_VALID(this); 
 Debug.Assert m_iTrackingState = TRACK_POPUP '; // sanity check 
 iMsg = m.message 
 If (iMsg = WM_KEYDOWN) Then 
  
 '// handle left/right-arow. 
 vKey = m.wParam 
 If ((vKey = vbKeyLeft And m_bProcessLeftArrow) Or _ 
 (vKey = vbKeyRight And m_bProcessRightArrow)) Then 
 'MBTRACE(_T("CMenuBar::OnMenuInput: handle VK_LEFT/RIGHT\n")); 
 CancelMenuAndTrackNewOne _ 
 GetNextOrPrevButton(m_iPopupTracking, vKey = vbKeyLeft) 
 MenuInput = True ' // eat it 
  
 ' // escape: 
 ElseIf (vKey = vbKeyEscape) Then 
 m_bEscapeWasPressed = True '; // (menu will abort itself) 
 End If 
  
 ElseIf (iMsg = WM_MOUSEMOVE Or iMsg = WM_LBUTTONDOWN) Then 
 '// handle mouse move or click 
 LSet tP = m.pt 
 'ScreenToClient m_hWndBand, tP 
 If (iMsg = WM_MOUSEMOVE) Then 
 'If (tP.X <> m_tPMouse.X) And (tP.Y <> m_tPMouse.Y) Then 
 iButton = HitTest(tP) 
 If IsValidButton(iButton) Then 
 If iButton <> m_iPopupTracking Then 
 '// user moved mouse over a different button: track its popup 
 CancelMenuAndTrackNewOne iButton 
 End If 
 End If 
 LSet m_tPMouse = tP 
 'End If 
 ElseIf iMsg = WM_LBUTTONDOWN Then 
 If (HitTest(tP) = m_iPopupTracking) Then 
 '// user clicked on same button I am tracking: cancel menu 
 'MBTRACE(_T("CMenuBar:OnMenuInput: handle mouse click to exit popup\n")); 
 CancelMenuAndTrackNewOne -1 
 MenuInput = True ' // eat it 
 End If 
 End If 
  
 ElseIf iMsg = WM_LBUTTONUP Or iMsg = WM_RBUTTONUP Then 
  
 End If 
End Function 
Private Function HitTest(pt As POINTAPI) As Long 
Dim cBar As cMenuBar 
 If GetBar(cBar) Then 
 HitTest = cBar.HitTest(pt) 
 End If 
End Function 
Private Property Get IsValidButton(ByVal iButton As Long) As Boolean 
 If (iButton > 0) Then 
 IsValidButton = True 
 End If 
End Property 
'////////////////// 
'// Cancel the current popup menu by posting WM_CANCELMODE, and track a new 
'// menu. iNewPopup is which new popup to track (-1 to quit). 
'// 
Private Sub CancelMenuAndTrackNewOne(ByVal iNewPopup As Long) 
Dim cBar As cMenuBar 
Dim hMenuPopup As Long 
 'MBTRACE(_T("CMenuBar::CancelMenuAndTrackNewOne: %d\n"), iNewPopup); 
 'ASSERT_VALID(this); 
 If iNewPopup > 0 Then 
 If (iNewPopup <> m_iPopupTracking) Then 
 If GetBar(cBar) Then 
 hMenuPopup = cBar.GetMenuHandle(iNewPopup) 
 If hMenuPopup <> 0 Then 
 'PostMessage m_hWndOwner, WM_CANCELMODE, 0, 0 ' // quit menu loop 
 PostMessage m_hWnd, WM_CANCELMODE, 0, 0 
 m_iNewPopup = iNewPopup '// go to this popup (-1 = quit) 
 End If 
 End If 
 End If 
 End If 
End Sub 
'////////////////// 
'// Track the popup submenu associated with the i'th button in the menu bar. 
'// This fn actually goes into a loop, tracking different menus until the user 
'// selects a command or exits the menu. 
'// 
Friend Function TrackPopup(ByVal iButton As Long) As Long 
Dim nMenuItems As Long 
Dim tPM As TPMPARAMS 
Dim rcButton As RECT 
Dim pt As POINTAPI 
Dim hMenuPopup As Long 
Dim lR As Long 
Dim hwnd As Long 
Dim lRtnID As Long 
Dim cBar As cMenuBar 
 If Not m_bIn Then 
 m_bIn = True 
 m_iNewPopup = iButton 
 'Debug.Assert m_hMenu <> 0 
 If GetBar(cBar) Then 
  
 nMenuItems = cBar.Count 'GetMenuItemCount(m_hMenu) 
  
 Do While (m_iNewPopup > -1) '// while user selects another menu 
  
 lRtnID = 0 
  
 m_iNewPopup = -1 '// assume quit after this 
 PressButton iButton, True '// press the button 
 'UpdateWindow ToolbarhWnd(m_hWnd) '// and force repaint now 
  
 SetTrackingState TRACK_POPUP, iButton '// enter tracking state 
  
 '// Need to install a hook to trap menu input in order to make 
 '// left/right-arrow keys and "hot" mouse tracking work. 
 '// 
 AttachMsgHook Me 
  
 '// get submenu and display it beneath button 
 GetRect iButton, rcButton 
 'ClientRectToScreen m_hWndBand, rcButton 
 tPM.cbSize = Len(tPM) 
 ComputeMenuTrackPoint rcButton, tPM, pt 
  
 'hMenuPopup = GetSubMenu(m_hMenu, iButton) 
 hMenuPo  
 
  
 作者: 61.142.212.*  2005-10-28 21:34   回复此发言    
 
--------------------------------------------------------------------------------
 
79 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
 Private Sub INCAreaModifier_NCPaint(ByVal hdc As Long, ByVal lLeft As Long, ByVal lTop As Long, ByVal lRight As Long, ByVal lBottom As Long) 
Dim lX As Long, lXE As Long 
Dim lY As Long 
Dim lW As Long, lH As Long, lRW As Long 
Dim lT As Long 
Dim lSrcDC As Long, lSrcX As Long, lSrcY As Long 
Dim lOrgX As Long 
Dim bNoMiddle As Boolean 
Dim tR As RECT 
Dim sCaption As String 
Dim lLen As Long 
Dim tLF As LOGFONT 
Dim hFnt As Long 
Dim hFntOld As Long 
Dim lStyle As Long 
Dim lhDC As Long, lhDCB As Long 
Dim hFntMenu As Long 
 LockWindowUpdate hdc 
 ' Here we do the work! 
 tR.left = lLeft 
 tR.top = lTop 
 tR.right = lRight 
 tR.bottom = lBottom 
  
 ' Ensure mem DCs are big enough to draw into: 
 m_cFF.Width = tR.right - tR.left + 1 
 m_cFF.Height = m_cCaption.Height 
 lhDC = m_cFF.hdc 
  
 m_cFFB.Width = m_cBorder.Width * 2 
 m_cFFB.Height = tR.bottom - tR.top + 1 
 lhDCB = m_cFFB.hdc 
  
  
 pOLEFontToLogFont m_fnt, hdc, tLF 
 If m_cNCS.WindowActive Then 
 tLF.lfWeight = FW_BOLD 
 End If 
 hFnt = CreateFontIndirect(tLF) 
 hFntOld = SelectObject(lhDC, hFnt) 
  
 If m_cNCS.WindowActive Then 
 lOrgX = 0 
 Else 
 lOrgX = m_lInactiveOffset 
 End If 
 ' Draw the caption 
 BitBlt lhDC, lLeft, lTop, lLeft + m_lActiveLeftEnd, m_cCaption.Height, m_cCaption.hdc, lOrgX, 0, vbSrcCopy 
 lRW = (m_lActiveRightEnd - m_lActiveRightStart + 1) 
 lXE = lRight - lRW + 1 
 If lXE < lLeft + lRW Then 
 lXE = lLeft + lRW 
 bNoMiddle = True 
 End If 
 BitBlt lhDC, lXE, lTop, lRW, m_cCaption.Height, m_cCaption.hdc, lOrgX + m_lActiveRightStart, 0, vbSrcCopy 
  
 ' Buttons: 
 lStyle = GetWindowLong(m_hWnd, GWL_STYLE) 
 m_bMaximise = ((lStyle And WS_MAXIMIZEBOX) = WS_MAXIMIZEBOX) 
 m_bMinimise = ((lStyle And WS_MINIMIZEBOX) = WS_MINIMIZEBOX) 
 m_bClose = ((lStyle And WS_SYSMENU) = WS_SYSMENU) 
 m_tBtn(0).left = lXE + lRW - m_cBorder.Height + 4 
 If m_bClose Then 
 m_tBtn(0).left = m_tBtn(0).left - (m_lButtonWidth + 1) 
 m_tBtn(0).top = lTop + 5 
 m_tBtn(0).right = m_tBtn(0).left + m_lButtonWidth + 1 
 m_tBtn(0).bottom = m_tBtn(0).top + m_lButtonHeight 
 DrawButton lhDC, 0, up 
 End If 
 If m_bMaximise Then 
 m_tBtn(1).left = m_tBtn(0).left - (m_lButtonWidth + 1) 
 m_tBtn(1).top = lTop + 5 
 m_tBtn(1).right = m_tBtn(1).left + m_lButtonWidth + 1 
 m_tBtn(1).bottom = m_tBtn(1).top + m_lButtonHeight 
 DrawButton lhDC, 1, up 
 Else 
 m_tBtn(1).left = m_tBtn(0).left 
 End If 
 If m_bMinimise Then 
 m_tBtn(2).left = m_tBtn(1).left - (m_lButtonWidth + 1) 
 m_tBtn(2).top = lTop + 5 
 m_tBtn(2).right = m_tBtn(2).left + (m_lButtonWidth + 1) 
 m_tBtn(2).bottom = m_tBtn(2).top + m_lButtonHeight 
 DrawButton lhDC, 2, up 
 End If 
  
 ' Fill in: 
 lX = lLeft + 90 
 Do 
 lW = 52 
 If lX + 52 > lXE Then 
 lW = lXE - lX 
 End If 
 BitBlt lhDC, lX, 0, lW, m_cCaption.Height, m_cCaption.hdc, lOrgX + m_lActiveLeftEnd + 1, 0, vbSrcCopy 
 lX = lX + 52 
 Loop While lX < lXE 
  
 If Not bNoMiddle Then 
  
 ' Draw the caption: 
 SetBkMode lhDC, TRANSPARENT 
 If m_cNCS.WindowActive Then 
 SetTextColor lhDC, TranslateColor(m_oActiveCaptionColor) 
 Else 
 SetTextColor lhDC, TranslateColor(m_oInActiveCaptionColor) 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:34   回复此发言    
 
--------------------------------------------------------------------------------
 
80 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  End If 
 lLen = GetWindowTextLength(m_hWnd) 
 If lLen > 0 Then 
 tR.left = lLeft + 92 
 tR.right = lRight - 96 
 tR.top = m_cBorder.Height + 1 
 tR.bottom = tR.top + (m_cCaption.Height - m_cBorder.Height - 2) \ 2 
 sCaption = String$(lLen + 1, 0) 
 GetWindowText m_hWnd, sCaption, lLen + 1 
 DrawText lhDC, sCaption, -1, tR, DT_LEFT Or DT_SINGLELINE Or DT_END_ELLIPSIS Or DT_NOPREFIX 
 End If 
  
 End If 
  
 ' Menu: 
 m_cMenu.hMenu = m_cNCS.hMenu 
 lW = lXE - m_lActiveLeftEnd 
 tLF.lfWeight = FW_NORMAL 
 hFntMenu = CreateFontIndirect(tLF) 
 m_cMenu.Render hFntMenu, lhDC, m_lActiveLeftEnd, m_cCaption.Height \ 2, lW, m_cCaption.Height \ 2, -m_cCaption.Height \ 2 + 2 
 DeleteObject hFntMenu 
  
 BitBlt hdc, 0, 0, m_cFF.Width, m_cFF.Height, lhDC, 0, 0, vbSrcCopy 
  
  
 ' Draw the border: 
 lY = m_cCaption.Height 
 lH = m_cBorder.Height 
 lW = lH 
 lSrcDC = m_cBorder.hdc 
 lSrcX = lW * 4 
 lSrcY = 0 
 ' We draw double the amount each time for a quick finish: 
 Do 
 ' Draw to lhs: 
 BitBlt lhDCB, 0, lY + lTop, lW, lH, lSrcDC, 0, lSrcY, vbSrcCopy 
 ' Draw to right: 
 BitBlt lhDCB, lW, lY + lTop, lW, lH, lSrcDC, lSrcX, lSrcY, vbSrcCopy 
 'Exit Do 
 If lSrcY = 0 Then 
 lSrcDC = lhDCB 
 lSrcY = lY + lTop 
 lSrcX = lW 
 lY = lY + lH 
 Else 
 lY = lY + lH 
 lH = lH * 2 
 End If 
 Loop While lY < lBottom - lW 
 lT = m_cCaption.Height + lTop 
 lH = lBottom - lT 
 BitBlt hdc, lLeft, lT, lW, lH, lhDCB, 0, lT, vbSrcCopy 
 BitBlt hdc, lRight - lW, lT, lW, lH, lhDCB, lW, lT, vbSrcCopy 
  
 lT = lBottom - lW 
 If lT < m_cCaption.Height Then 
 lT = m_cCaption.Height 
 End If 
  
 ' Bottom - we draw into the caption mem dc for flicker free 
 lX = lLeft + lW 
 lH = m_cBorder.Height 
 lSrcDC = m_cBorder.hdc 
 lSrcX = lW * 3 
 lSrcY = 0 
 ' We draw double the amount each time for a quick finish: 
 Do 
 BitBlt lhDC, lX, 0, lW, lH, lSrcDC, lSrcX, lSrcY, vbSrcCopy 
 If lSrcY = 0 Then 
 lSrcDC = lhDC 
 lSrcX = lX 
 lX = lX + lW 
 Else 
 lX = lX + lW 
 lW = lW * 2 
 End If 
 Loop While lX < lRight - lH 
 ' Bottom corners 
 BitBlt lhDC, lLeft, 0, lH, lH, m_cBorder.hdc, lH * 2, 0, vbSrcCopy 
 BitBlt lhDC, lRight - lH, 0, lH, lH, m_cBorder.hdc, lH * 6, 0, vbSrcCopy 
  
 ' Swap out to display: 
 BitBlt hdc, lLeft, lT, m_cFF.Width, lH, lhDC, 0, 0, vbSrcCopy 
  
 SelectObject lhDC, hFntOld 
 DeleteObject hFnt 
 LockWindowUpdate 0 
End Sub 
Private Sub INCAreaModifier_GetBottomMarginHeight(cy As Long) 
 ' 
 cy = m_cBorder.Height 
End Sub 
Private Sub INCAreaModifier_GetLeftMarginWidth(cx As Long) 
 ' 
 cx = m_cBorder.Height 
End Sub 
Private Sub INCAreaModifier_GetRightMarginWidth(cx As Long) 
 ' 
 cx = m_cBorder.Height 
End Sub 
Private Sub INCAreaModifier_GetTopMarginHeight(cy As Long) 
 ' 
 cy = m_cCaption.Height 
End Sub 
' Convert Automation color to Windows color 
Private Function TranslateColor(ByVal clr As OLE_COLOR, _ 
 Optional hPal As Long = 0) As Long 
 If OleTranslateColor(clr, hPal, TranslateColor) Then 
 TranslateColor = CLR_INVALID 
 End If 
End Function 
Private Sub pOLEFontToLogFont(fntThis As StdFont, ByVal hdc As Long, tLF As LOGFONT) 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:34   回复此发言    
 
--------------------------------------------------------------------------------
 
81 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
 Dim sFont As String 
Dim iChar As Integer 
Dim b() As Byte 
 ' Convert an OLE StdFont to a LOGFONT structure: 
 With tLF 
 sFont = fntThis.Name 
 b = StrConv(sFont, vbFromUnicode) 
 For iChar = 1 To Len(sFont) 
 .lfFaceName(iChar - 1) = b(iChar - 1) 
 Next iChar 
 ' Based on the Win32SDK documentation: 
 .lfHeight = -MulDiv((fntThis.Size), (GetDeviceCaps(hdc, LOGPIXELSY)), 72) 
 .lfItalic = fntThis.Italic 
 If (fntThis.Bold) Then 
 .lfWeight = FW_BOLD 
 Else 
 .lfWeight = FW_NORMAL 
 End If 
 .lfUnderline = fntThis.Underline 
 .lfStrikeOut = fntThis.Strikethrough 
 .lfCharSet = fntThis.Charset 
 End With 
End Sub 
 
-------------- 
Option Explicit 
Private iInterval As Long 
Private id As Long 
' User can attach any Variant data they want to the timer 
Public Item As Variant 
Public Event ThatTime() 
' SubTimer is independent of VBCore, so it hard codes error handling 
Public Enum EErrorTimer 
 eeBaseTimer = 13650 ' CTimer 
 eeTooManyTimers ' No more than 10 timers allowed per class 
 eeCantCreateTimer ' Can't create system timer 
End Enum 
Friend Sub ErrRaise(e As Long) 
 Dim sText As String, sSource As String 
 If e > 1000 Then 
 sSource = App.EXEName & ".WindowProc" 
 Select Case e 
 Case eeTooManyTimers 
 sText = "No more than 10 timers allowed per class" 
 Case eeCantCreateTimer 
 sText = "Can't create system timer" 
 End Select 
 Err.Raise e Or vbObjectError, sSource, sText 
 Else 
 ' Raise standard Visual Basic error 
 Err.Raise e, sSource 
 End If 
End Sub 
Property Get Interval() As Long 
 Interval = iInterval 
End Property 
' Can't just change interval--you must kill timer and start a new one 
Property Let Interval(iIntervalA As Long) 
 Dim f As Boolean 
 If iIntervalA > 0 Then 
 ' Don't mess with it if interval is the same 
 If iInterval = iIntervalA Then Exit Property 
 ' Must destroy any existing timer to change interval 
 If iInterval Then 
 f = TimerDestroy(Me) 
 Debug.Assert f ' Shouldn't fail 
 End If 
 ' Create new timer with new interval 
 iInterval = iIntervalA 
 If TimerCreate(Me) = False Then ErrRaise eeCantCreateTimer 
 Else 
 If (iInterval > 0) Then 
 iInterval = 0 
 f = TimerDestroy(Me) 
 Debug.Assert f ' Shouldn't fail 
 End If 
 End If 
End Property 
' Must be public so that Timer object can't terminate while client's ThatTime 
' event is being processed--Friend wouldn't prevent this disaster 
Public Sub PulseTimer() 
 RaiseEvent ThatTime 
End Sub 
Friend Property Get TimerID() As Long 
 TimerID = id 
End Property 
Friend Property Let TimerID(idA As Long) 
 id = idA 
End Property 
Private Sub Class_Terminate() 
 Interval = 0 
End Sub 
---------------- 
Option Explicit 
' ======================================================================= 
' FileName: cToolbarMenu 
' Author: Steve McMahon 
' Date: 8 Feb 2000 
' 
' Allows menus to pop up and cancel as the user hovers 
' over toolbar buttons. 
' 
' 
' Copyright ?2000 Steve McMahon 
' ======================================================================= 
Private Enum TRACKINGSTATE '{ // menubar has three states: 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:34   回复此发言    
 
--------------------------------------------------------------------------------
 
82 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  TRACK_NONE = 0 ', // * normal, not tracking anything 
 TRACK_BUTTON ', // * tracking buttons (F10/Alt mode) 
 TRACK_POPUP '// * tracking popups 
End Enum 
' Track popup menu constants: 
Private m_iTrackingState As TRACKINGSTATE 
Private m_bProcessRightArrow As Boolean 
Private m_bProcessLeftArrow As Boolean 
Private m_hMenuTracking As Long 
Private m_iPopupTracking As Long 
Private m_bEscapeWasPressed As Boolean 
Private m_tPMouse As POINTAPI 
Private m_iNewPopup As Long 
Private m_bIn As Boolean 
Private m_hWnd As Long 
Private m_lPtr As Long 
Private m_iExit As Integer 
Implements ISubclass 
Friend Sub CoolMenuAttach(ByRef hWndA As Long, ByVal cBar As cMenuBar) 
Dim lPtr As Long 
 m_iExit = 0 
 CoolMenuDetach 
 m_hWnd = hWndA 
 SendMessageLong m_hWnd, WM_ENTERMENULOOP, 0, 0 
 AttachMessage Me, m_hWnd, WM_MENUSELECT 
 m_lPtr = ObjPtr(cBar) 
  
End Sub 
Friend Sub CoolMenuDetach() 
 If (m_hWnd <> 0) Then 
 SendMessageLong m_hWnd, WM_EXITMENULOOP, 0, 0 
 DetachMessage Me, m_hWnd, WM_MENUSELECT 
 m_hWnd = 0 
 End If 
 m_hWnd = 0 
 m_lPtr = 0 
End Sub 
'///////////////// 
'// When user selects a new menu item, note whether it has a submenu 
'// and/or parent menu, so I know whether right/left arrow should 
'// move to the next popup. 
'// 
Private Sub MenuSelect(ByVal hMenu As Long, ByVal iItem As Long) 
 If (m_iTrackingState > 0) Then 
 '// process right-arrow if item is NOT a submenu 
 m_bProcessRightArrow = (GetSubMenu(hMenu, iItem) = 0) 
 '// process left-arrow if curent menu is one I'm tracking 
 m_bProcessLeftArrow = (hMenu = m_hMenuTracking) 
 End If 
End Sub 
'////////////////// 
'// Handle menu input event: Look for left/right to change popup menu, 
'// mouse movement over over a different menu button for "hot" popup effect. 
'// Returns TRUE if message handled (to eat it). 
'// 
Friend Function MenuInput(m As Msg) As Boolean 
Dim iMsg As Long 
Dim vKey As Long 
Dim tP As POINTAPI 
Dim iButton As Long 
 'ASSERT_VALID(this); 
 Debug.Assert m_iTrackingState = TRACK_POPUP '; // sanity check 
 iMsg = m.message 
 If (iMsg = WM_KEYDOWN) Then 
  
 '// handle left/right-arow. 
 vKey = m.wParam 
 If ((vKey = vbKeyLeft And m_bProcessLeftArrow) Or _ 
 (vKey = vbKeyRight And m_bProcessRightArrow)) Then 
 'MBTRACE(_T("CMenuBar::OnMenuInput: handle VK_LEFT/RIGHT\n")); 
 CancelMenuAndTrackNewOne _ 
 GetNextOrPrevButton(m_iPopupTracking, vKey = vbKeyLeft) 
 MenuInput = True ' // eat it 
  
 ' // escape: 
 ElseIf (vKey = vbKeyEscape) Then 
 m_bEscapeWasPressed = True '; // (menu will abort itself) 
 End If 
  
 ElseIf (iMsg = WM_MOUSEMOVE Or iMsg = WM_LBUTTONDOWN) Then 
 '// handle mouse move or click 
 LSet tP = m.pt 
 'ScreenToClient m_hWndBand, tP 
 If (iMsg = WM_MOUSEMOVE) Then 
 'If (tP.X <> m_tPMouse.X) And (tP.Y <> m_tPMouse.Y) Then 
 iButton = HitTest(tP) 
 If IsValidButton(iButton) Then 
 If iButton <> m_iPopupTracking Then 
 '// user moved mouse over a different button: track its popup 
 CancelMenuAndTrackNewOne iButton 
 End If 
 End If 
 LSet m_tPMouse = tP 
 'End If 
 ElseIf iMsg = WM_LBUTTONDOWN Then 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:34   回复此发言    
 
--------------------------------------------------------------------------------
 
83 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  If (HitTest(tP) = m_iPopupTracking) Then 
 '// user clicked on same button I am tracking: cancel menu 
 'MBTRACE(_T("CMenuBar:OnMenuInput: handle mouse click to exit popup\n")); 
 CancelMenuAndTrackNewOne -1 
 MenuInput = True ' // eat it 
 End If 
 End If 
  
 ElseIf iMsg = WM_LBUTTONUP Or iMsg = WM_RBUTTONUP Then 
  
 End If 
End Function 
Private Function HitTest(pt As POINTAPI) As Long 
Dim cBar As cMenuBar 
 If GetBar(cBar) Then 
 HitTest = cBar.HitTest(pt) 
 End If 
End Function 
Private Property Get IsValidButton(ByVal iButton As Long) As Boolean 
 If (iButton > 0) Then 
 IsValidButton = True 
 End If 
End Property 
'////////////////// 
'// Cancel the current popup menu by posting WM_CANCELMODE, and track a new 
'// menu. iNewPopup is which new popup to track (-1 to quit). 
'// 
Private Sub CancelMenuAndTrackNewOne(ByVal iNewPopup As Long) 
Dim cBar As cMenuBar 
Dim hMenuPopup As Long 
 'MBTRACE(_T("CMenuBar::CancelMenuAndTrackNewOne: %d\n"), iNewPopup); 
 'ASSERT_VALID(this); 
 If iNewPopup > 0 Then 
 If (iNewPopup <> m_iPopupTracking) Then 
 If GetBar(cBar) Then 
 hMenuPopup = cBar.GetMenuHandle(iNewPopup) 
 If hMenuPopup <> 0 Then 
 'PostMessage m_hWndOwner, WM_CANCELMODE, 0, 0 ' // quit menu loop 
 PostMessage m_hWnd, WM_CANCELMODE, 0, 0 
 m_iNewPopup = iNewPopup '// go to this popup (-1 = quit) 
 End If 
 End If 
 End If 
 End If 
End Sub 
'////////////////// 
'// Track the popup submenu associated with the i'th button in the menu bar. 
'// This fn actually goes into a loop, tracking different menus until the user 
'// selects a command or exits the menu. 
'// 
Friend Function TrackPopup(ByVal iButton As Long) As Long 
Dim nMenuItems As Long 
Dim tPM As TPMPARAMS 
Dim rcButton As RECT 
Dim pt As POINTAPI 
Dim hMenuPopup As Long 
Dim lR As Long 
Dim hwnd As Long 
Dim lRtnID As Long 
Dim cBar As cMenuBar 
 If Not m_bIn Then 
 m_bIn = True 
 m_iNewPopup = iButton 
 'Debug.Assert m_hMenu <> 0 
 If GetBar(cBar) Then 
  
 nMenuItems = cBar.Count 'GetMenuItemCount(m_hMenu) 
  
 Do While (m_iNewPopup > -1) '// while user selects another menu 
  
 lRtnID = 0 
  
 m_iNewPopup = -1 '// assume quit after this 
 PressButton iButton, True '// press the button 
 'UpdateWindow ToolbarhWnd(m_hWnd) '// and force repaint now 
  
 SetTrackingState TRACK_POPUP, iButton '// enter tracking state 
  
 '// Need to install a hook to trap menu input in order to make 
 '// left/right-arrow keys and "hot" mouse tracking work. 
 '// 
 AttachMsgHook Me 
  
 '// get submenu and display it beneath button 
 GetRect iButton, rcButton 
 'ClientRectToScreen m_hWndBand, rcButton 
 tPM.cbSize = Len(tPM) 
 ComputeMenuTrackPoint rcButton, tPM, pt 
  
 'hMenuPopup = GetSubMenu(m_hMenu, iButton) 
 hMenuPopup = cBar.GetMenuHandle(iButton) 
  
 If hMenuPopup <> 0 Then 
 ' Show the menu: 
 m_hMenuTracking = hMenuPopup 
 lR = TrackPopupMenuEx(hMenuPopup, _ 
 TPM_LEFTALIGN Or TPM_LEFTBUTTON Or TPM_VERTICAL, _ 
 pt.x, pt.y, m_hWnd, tPM) 
 'lR is the ID of the menu 
 lRtnID = lR 
 End If 
  
 '// uninstall hook. 
 DetachMsgHook 
  
 PressButton iButton, False '; // un-press button 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:34   回复此发言    
 
--------------------------------------------------------------------------------
 
84 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  'UpdateWindow ToolbarhWNd(m_hWnd) '// and force repaint now 
  
 '// If the user exited the menu loop by pressing Escape, 
 '// return to track-button state; otherwise normal non-tracking state. 
 If (m_bEscapeWasPressed) Then 
 SetTrackingState TRACK_NONE, iButton 
 Else 
 SetTrackingState TRACK_NONE, iButton 
 End If 
  
 '// If the user moved mouse to a new top-level popup (eg from File to 
 '// Edit button), I will have posted a WM_CANCELMODE to quit 
 '// the first popup, and set m_iNewPopup to the new menu to show. 
 '// Otherwise, m_iNewPopup will be -1 as set above. 
 '// So just set iButton to the next popup menu and keep looping... 
 iButton = m_iNewPopup 
  
 Loop 
  
 ' Set hot button if mouse is over, otherwise not: 
  
 ' The ID of the selected menu 
 TrackPopup = lRtnID 
 End If 
 m_bIn = False 
 End If 
End Function 
Private Sub ComputeMenuTrackPoint(ByRef rc As RECT, tPM As TPMPARAMS, tP As POINTAPI) 
 tP.x = rc.left 
 tP.y = rc.bottom 
 LSet tPM.rcExclude = rc 
End Sub 
Private Function GetBar(ByRef cBar As cMenuBar) As Boolean 
 If Not m_lPtr = 0 Then 
 Set cBar = ObjectFromPtr(m_lPtr) 
 'Debug.Print "GetBar:OK" 
 GetBar = True 
 End If 
End Function 
Private Sub PressButton(ByVal iButton As Long, ByVal bState As Boolean) 
Dim fState As Long 
Dim cBar As cMenuBar 
 If GetBar(cBar) Then 
 If iButton > 0 And iButton <= cBar.Count Then 
 cBar.PressButton iButton, bState 
 End If 
 End If 
End Sub 
Private Sub GetRect(ByVal iButton As Long, ByRef tR As RECT) 
Dim cBar As cMenuBar 
 tR.left = 0: tR.top = 0: tR.bottom = 0: tR.right = 0 
 If GetBar(cBar) Then 
 If iButton > 0 And iButton <= cBar.Count Then 
 cBar.GetRect iButton, tR 
 End If 
 End If 
End Sub 
Private Function GetHotItem() As Long 
Dim cBar As cMenuBar 
 If GetBar(cBar) Then 
 GetHotItem = cBar.HotItem 
 End If 
End Function 
Private Function SetHotItem(ByVal iButton As Long) As Long 
Dim cBar As cMenuBar 
 If GetBar(cBar) Then 
 'Debug.Print "Setting hot item: " & iButton 
 cBar.HotItem = iButton 
 End If 
End Function 
Private Function GetButtonVisible(ByVal iButton As Long) As Boolean 
 GetButtonVisible = True 
End Function 
Private Function GetButtonCount() As Long 
Dim cBar As cMenuBar 
 If GetBar(cBar) Then 
 GetButtonCount = cBar.Count 
 End If 
End Function 
Private Sub SetTrackingState(ByVal iState As TRACKINGSTATE, ByVal iButton As Long) 
 If (iState <> m_iTrackingState) Then 
 If (iState = TRACK_NONE) Then 
 iButton = -1 
 End If 
'#ifdef _DEBUG 
' static LPCTSTR StateName[] = { _T("NONE"), _T("BUTTON"), _T("POPUP") }; 
' MBTRACE(_T("CMenuBar::SetTrackingState to %s, button=%d\n"), 
' StateName[iState], iButton); 
'#End If 
 SetHotItem iButton '// could be none (-1) 
 If (iState = TRACK_POPUP) Then 
 '// set related state stuff 
 m_bEscapeWasPressed = False 'FALSE; // assume Esc key not pressed 
 m_bProcessRightArrow = True '// assume left/right arrow.. 
 m_bProcessLeftArrow = True '; // ..will move to prev/next popup 
 m_iPopupTracking = iButton '// which popup I'm tracking 
 End If 
 m_iTrackingState = iState 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:34   回复此发言    
 
--------------------------------------------------------------------------------
 
85 回复:漂亮的VB程序窗体,打破传统的Windows窗体。(强力推荐)  
  End If 
End Sub 
Private Function GetNextOrPrevButton(ByVal iButton As Long, ByVal bPrev As Boolean) As Long 
Dim iSB As Long 
Dim bfound As Boolean 
 If (bPrev) Then 
 iSB = iButton 
 Do While Not bfound 
  
 iButton = iButton - 1 
 If iButton < 1 Then 
 iButton = GetButtonCount() 
 End If 
  
 If Not (GetButtonVisible(iButton)) Then 
 If iButton = iSB Then 
 iButton = -1 
 Exit Do 
 End If 
 Else 
 bfound = True 
 End If 
  
 Loop 
  
 Else 
 iSB = iButton 
 Do While Not bfound 
 iButton = iButton + 1 
 If (iButton > GetButtonCount()) Then 
 iButton = 1 
 End If 
  
 If Not GetButtonVisible(iButton) Then 
 If iButton = iSB Then 
 iButton = -1 
 Exit Do 
 End If 
 Else 
 bfound = True 
 End If 
  
 Loop 
  
 End If 
 GetNextOrPrevButton = iButton 
End Function 
'////////////////// 
'// Toggle state from home state to button-tracking and back 
'// 
Private Sub ToggleTrackButtonMode() 
 If (m_iTrackingState = TRACK_NONE Or m_iTrackingState = TRACK_BUTTON) Then 
 If m_iTrackingState = TRACK_NONE Then 
 SetTrackingState TRACK_BUTTON, 1 
 Else 
 SetTrackingState TRACK_NONE, 1 
 End If 
 End If 
End Sub 
 
Private Property Get ISubclass_MsgResponse() As EMsgResponse 
 If CurrentMessage = WM_MENUSELECT Then 
 ISubclass_MsgResponse = emrPreprocess 
 End If 
End Property 
Private Property Let ISubclass_MsgResponse(ByVal RHS As EMsgResponse) 
 ' 
End Property 
Private Function ISubclass_WindowProc(ByVal hwnd As Long, ByVal iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 
 Select Case iMsg 
 Case WM_MENUSELECT 
 MenuSelect lParam, (wParam And &HFFFF&) 
 End Select 
End Function 
-------------- 
Option Explicit 
Sub AttachMessage(iwp As ISubclass, ByVal hwnd As Long, _ 
 ByVal iMsg As Long) 
 MSubclass.AttachMessage iwp, hwnd, iMsg 
End Sub 
Sub DetachMessage(iwp As ISubclass, ByVal hwnd As Long, _ 
 ByVal iMsg As Long) 
 MSubclass.DetachMessage iwp, hwnd, iMsg 
End Sub 
Public Property Get CurrentMessage() As Long 
 CurrentMessage = MSubclass.CurrentMessage 
End Property 
Public Function CallOldWindowProc( _ 
 ByVal hwnd As Long, _ 
 ByVal iMsg As Long, _ 
 ByVal wParam As Long, _ 
 ByVal lParam As Long _ 
 ) As Long 
 CallOldWindowProc = MSubclass.CallOldWindowProc(hwnd, iMsg, wParam, lParam) 
End Function 
-------------- 
Option Explicit 
Public Property Get hwnd() As Long 
End Property 
Public Sub GetTopMarginHeight(cy As Long) 
End Sub 
Public Sub GetLeftMarginWidth(cx As Long) 
End Sub 
Public Sub GetRightMarginWidth(cx As Long) 
End Sub 
Public Sub GetBottomMarginHeight(cy As Long) 
End Sub 
Public Sub NCPaint(ByVal hdc As Long, ByVal lLeft As Long, ByVal lTop As Long, ByVal lRight As Long, ByVal lBottom As Long) 
End Sub 
Public Sub HitTest(ByVal x As Long, ByVal y As Long, ByRef eHitTest As ECNCHitTestConstants) 
End Sub 
Public Sub NCMouseDown(ByVal x As Long, ByVal y As Long, ByRef bHandled As Boolean, ByVal hdc As Long, ByVal lLeft As Long, ByVal lTop As Long, ByVal lRight As Long, ByVal lBottom As Long) 
End Sub 
Public Sub NCMouseUp(ByVal x As Long, ByVal y As Long, ByVal hdc As Long, ByVal lLeft As Long, ByVal lTop As Long, ByVal lRight As Long, ByVal lBottom As Long) 
End Sub 
Public Sub InitMenuPopup(ByVal wParam As Long, ByVal lParam As Long) 
End Sub 
Public Sub ExitMenuLoop() 
End Sub 
Public Function AltKeyAccelerator(ByVal vKey As KeyCodeConstants) As Long 
End Function 
---------------- 
Option Explicit 
Public Enum EMsgResponse 
 emrConsume ' Process instead of original WindowProc 
 emrPostProcess ' Process after original WindowProc 
 emrPreprocess ' Process before original WindowProc 
End Enum 
Public MsgResponse As EMsgResponse 
Function WindowProc(ByVal hwnd As Long, _ 
 ByVal iMsg As Long, _ 
 ByVal wParam As Long, _ 
 ByVal lParam As Long) As Long 
End Functio  
 
  
 作者: 61.142.212.*  2005-10-28 21:34   回复此发言    
 
--------------------------------------------------------------------------------
 
86 调用 API 实现 Ani 窗体。  
 Option Explicit 
Private Sub Form_Load() 
 Load frmAnim 
End Sub 
Private Sub Form_Unload(Cancel As Integer) 
 Unload frmAnim 
End Sub 
Private Sub cmdSlide_Click() 
 frmAnim.Move 300, 300 
 AnimateWindow frmAnim.hWnd, 300, _ 
 AW_HOR_POSITIVE + AW_VER_POSITIVE + AW_SLIDE + AW_ACTIVATE 
End Sub 
Private Sub cmdExpand_Click() 
 frmAnim.Move 300, 300 
 AnimateWindow frmAnim.hWnd, 300, _ 
 AW_CENTER + AW_SLIDE + AW_ACTIVATE 
End Sub 
Private Sub cmdFade_Click() 
 frmAnim.Move 300, 300 
 AnimateWindow frmAnim.hWnd, 300, _ 
 AW_BLEND + AW_ACTIVATE 
End Sub 
---------- 
Option Explicit 
Private Declare Function CreateSolidBrush Lib "gdi32" _ 
 (ByVal crColor As Long) As Long 
Private Declare Function DeleteObject Lib "gdi32" _ 
 (ByVal hObject As Long) As Long 
Private Declare Function FillRect Lib "user32" (ByVal hDC As Long, _ 
 lpRect As RECT, ByVal hBrush As Long) As Long 
Private Type RECT 
 Left As Long 
 Top As Long 
 Right As Long 
 Bottom As Long 
End Type 
Friend Sub PrintClient(ByVal hDC As Long, ByVal lParam As Long) 
 Dim rct As RECT 
 Dim hBr As Long 
 'Fill in the hDC with the form's 
 'background color. Otherwise the form 
 'may appear strangely. 
 rct.Left = 0 
 rct.Top = 0 
 rct.Right = ScaleX(ScaleWidth, ScaleMode, vbPixels) 
 rct.Bottom = ScaleY(ScaleHeight, ScaleMode, vbPixels) 
 hBr = CreateSolidBrush(TranslateColor(Me.BackColor)) 
 FillRect hDC, rct, hBr 
 DeleteObject hBr 
End Sub 
Private Sub Form_Load() 
 SubclassAnim Me 
End Sub 
Private Sub Form_Unload(Cancel As Integer) 
 UnSubclassAnim Me 
End Sub 
----------------- 
Option Explicit 
Public Const AW_HOR_POSITIVE = &H1 
Public Const AW_HOR_NEGATIVE = &H2 
Public Const AW_VER_POSITIVE = &H4 
Public Const AW_VER_NEGATIVE = &H8 
Public Const AW_CENTER = &H10 
Public Const AW_HIDE = &H10000 
Public Const AW_ACTIVATE = &H20000 
Public Const AW_SLIDE = &H40000 
Public Const AW_BLEND = &H80000 
Public Declare Function AnimateWindow Lib "user32" _ 
 (ByVal hWnd As Long, _ 
 ByVal dwTime As Long, ByVal dwFlags As Long) As Long 
Public Const WM_PRINTCLIENT = &H318 
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _ 
 (Destination As Any, Source As Any, ByVal Length As Long) 
Public Declare Function GetWindowLong Lib "user32" Alias _ 
 "GetWindowLongA" (ByVal hWnd As Long, _ 
 ByVal nIndex As Long) As Long 
Public Declare Function SetWindowLong Lib "user32" Alias _ 
 "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, _ 
 ByVal dwNewLong As Long) As Long 
Public Const GWL_WNDPROC = (-4) 
Public Declare Function GetProp Lib "user32" Alias "GetPropA" _ 
 (ByVal hWnd As Long, ByVal lpString As String) As Long 
Public Declare Function SetProp Lib "user32" Alias "SetPropA" _ 
 (ByVal hWnd As Long, ByVal lpString As String, _ 
 ByVal hData As Long) As Long 
Public Declare Function RemoveProp Lib "user32" Alias "RemovePropA" _ 
 (ByVal hWnd As Long, ByVal lpString As String) As Long 
Public 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 
Public Declare Function OleTranslateColor _ 
 Lib "oleaut32.dll" _ 
 (ByVal lOleColor As Long, _ 
 ByVal lHPalette As Long, _ 
 lColorRef As Long) As Long 
Public Function TranslateColor(inCol As Long) As Long 
 Dim retCol As Long 
 OleTranslateColor inCol, 0&, retCol 
 TranslateColor = retCol 
End Function 
Public Function AnimWndProc(ByVal hWnd As Long, ByVal wMsg As Long, _ 
ByVal wParam As Long, ByVal lParam As Long) As Long 
 Dim lProc As Long 
 Dim lPtr As Long 
 Dim frm As frmAnim 
 lProc = GetProp(hWnd, "ExAnimWndProc") 
 lPtr = GetProp(hWnd, "ExAnimWndPtr") 
 'Catch the WM_PRINTCLIENT message so the form 
 'won't look like garbage when it appears. 
 If wMsg = WM_PRINTCLIENT Then 
 CopyMemory frm, lPtr, 4 
 frm.PrintClient wParam, lParam 
 CopyMemory frm, 0&, 4 
 End If 
 AnimWndProc = CallWindowProc(lProc, hWnd, wMsg, wParam, lParam) 
End Function 
Public Sub SubclassAnim(frm As frmAnim) 
 Dim l As Long 
 If GetProp(frm.hWnd, "ExAnimWndProc") <> 0 Then 
 'Already subclassed 
 Exit Sub 
 End If 
 l = GetWindowLong(frm.hWnd, GWL_WNDPROC) 
 SetProp frm.hWnd, "ExAnimWndProc", l 
 SetProp frm.hWnd, "ExAnimWndPtr", ObjPtr(frm) 
 SetWindowLong frm.hWnd, GWL_WNDPROC, AddressOf AnimWndProc 
End Sub 
Public Sub UnSubclassAnim(frm As frmAnim) 
 Dim l As Long 
 l = GetProp(frm.hWnd, "ExAnimWndProc") 
 If l = 0 Then 
 'Isn't subclassed anyway 
 Exit Sub 
 End If 
 SetWindowLong frm.hWnd, GWL_WNDPROC, l 
 RemoveProp frm.hWnd, "ExAnimWndProc" 
 RemoveProp frm.hWnd, "ExAnimWndPtr" 
End Sub  
 
  
 作者: 61.142.212.*  2005-10-28 21:35   回复此发言    
 
--------------------------------------------------------------------------------
 
87 API的“浏览”对话框。  
 Option Explicit 
Dim nFolder& ' system folder to begin browse in 
Dim CurOptIdx% ' currently selected option button 
Private Sub Form_Load() 
 Dim idx&, item& 
 Dim rtn&, path$ 
 Dim idl As ITEMIDLIST 
  
 For idx& = 1 To 17 
  
 ' see BrowsDlg.bas for the system folder flag values 
 ' The Desktop 
 If idx& = 1 Then 
 item& = 0 
  
 ' Programs Folder -> Start Menu Folder 
 ElseIf idx& > 1 And idx& < 12 Then 
 item& = idx& 
  
 ' Desktop Folder -> ShellNew Folder 
 ElseIf idx& >= 12 Then 
 item& = idx& + 4& 
 End If 
  
 ' fill the idl structure with the specified folder item 
 rtn& = SHGetSpecialFolderLocation(Me.hWnd, item&, idl) 
 If rtn& = NOERROR Then 
  
 ' if the structure is filled, initialize the var & get the path from the id list 
 path$ = Space$(512) 
 rtn& = SHGetPathFromIDList(ByVal idl.mkid.cb, ByVal path$) 
  
 ' if a path was found in the structure, display it in the respective text box 
 If rtn& Then Text1(idx&) = path$ 
 End If 
 Next 
  
End Sub 
Private Sub Option1_Click(Index As Integer) 
 ' see the "bi.lpszTitle=..." line in Command1_Click 
  
 ' save the current option btn for dialog banner display 
 CurOptIdx% = Index 
  
 ' save the value of the system folder to begin dialog display from 
 If Index = 1 Then 
 nFolder& = 0 
 ElseIf Index < 12 Then 
 nFolder& = Index 
 Else 
 nFolder& = Index + 4 
 End If 
  
End Sub 
Private Sub Command1_Click() 
 Dim bi As BROWSEINFO 
 Dim idl As ITEMIDLIST 
 Dim rtn&, pidl&, path$, pos% 
  
 ' the calling app 
 bi.hOwner = Me.hWnd 
  
 ' set the folder to limit the browse to in the dialog 
 ' if CurOptIdx% = 0 (Default Browse), bi.pidlRoot would then be Null 
 If CurOptIdx% Then 
 rtn& = SHGetSpecialFolderLocation(ByVal Me.hWnd, ByVal nFolder&, idl) 
 bi.pidlRoot = idl.mkid.cb 
 End If 
  
 ' set the banner text 
 bi.lpszTitle = "Browsing is limited to: " & Option1(CurOptIdx%).Caption 
  
 ' set the type of folder to return 
 ' play with these option constants to see what can be returned 
 bi.ulFlags = BIF_RETURNONLYFSDIRS 'BIF_RETURNFSANCESTORS 'BIF_BROWSEFORPRINTER + BIF_DONTGOBELOWDOMAIN 
  
 ' show the browse folder dialog 
 pidl& = SHBrowseForFolder(bi) 
  
 ' if displaying the return value, get the selected folder 
 If Check1 Then 
 path$ = Space$(512) 
 rtn& = SHGetPathFromIDList(ByVal pidl&, ByVal path$) 
 If rtn& Then 
  
 ' parce & display the folder selection 
 pos% = InStr(path$, Chr$(0)) 
 MsgBox "Folder selection was:" & Chr$(10) & Chr$(10) & Left(path$, pos - 1), vbInformation 
 Else 
 MsgBox "Dialog was cancelled", vbInformation 
 End If 
 End If 
  
End Sub 
Private Sub Command2_Click() 
 Dim msg$, lf$ 
 lf$ = Chr$(10) 
 msg$ = "If an item has no folder location displayed, then it has no Registry entry under:" & lf$ & lf$ 
 msg$ = msg$ & "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" & lf$ ' & lf$ 
 'msg$ = msg$ & "If one of these items is selected from the Browse dialog, it will return 0 (cancelled) to the calling proc." 
 MsgBox msg$ 
  
End Sub 
Private Sub Command3_Click() 
 Unload Me 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:36   回复此发言    
 
--------------------------------------------------------------------------------
 
88 API的“浏览”对话框。  
   
End Sub 
Private Sub Form_Unload(Cancel As Integer) 
 Set Form1 = Nothing 
End Sub 
-------------- 
Option Explicit 
' This code module & it's accompanying form module, BrowsDlg.frm, 
' demonstrate how to display the "Browse for Folder" dialog box and 
' return a user selected folder. The Win32 API structures, functions & 
' constants used below are not documented for use with VB 4.0 (32 bit) 
' in any conventional sense. The structures & functions were translated 
' from the information available in the MSDN/VB Starter Kit. The constant 
' values were extracted from the VC++ 4.0 Shlobg.h header file. 
' 
' For more information, in the MSDN/VB Starter Kit see the following: 
' Product Documentation 
' SDKs 
' Win32 SDK 
' Guides 
' Programmer's Guide to Windows 95 
' Extending the Windows 95 Shell 
' Hope it comes in handy, 
' Brad Martiez 
'/////////////////////////////////////////////////////////////////////////////////////////////////////////// 
' A little info... 
' Objects in the shell抯 namespace are assigned item identifiers and item 
' identifier lists. An item identifier uniquely identifies an item within its parent 
' folder. An item identifier list uniquely identifies an item within the shell抯 
' namespace by tracing a path to the item from the desktop. 
'/////////////////////////////////////////////////////////////////////////////////////////////////////////// 
' An item identifier is defined by the variable-length SHITEMID structure. 
' The first two bytes of this structure specify its size, and the format of 
' the remaining bytes depends on the parent folder, or more precisely 
' on the software that implements the parent folder抯 IShellFolder interface. 
' Except for the first two bytes, item identifiers are not strictly defined, and 
' applications should make no assumptions about their format. 
Type SHITEMID 'mkid 
 cb As Long 'Size of the ID (including cb itself) 
 abID As Byte 'The item ID (variable length) 
End Type 
' The ITEMIDLIST structure defines an element in an item identifier list 
' (the only member of this structure is an SHITEMID structure). An item 
' identifier list consists of one or more consecutive ITEMIDLIST structures 
' packed on byte boundaries, followed by a 16-bit zero value. An application 
' can walk a list of item identifiers by examining the size specified in each 
' SHITEMID structure and stopping when it finds a size of zero. A pointer 
' to an item identifier list, is sometimes called a PIDL (pronounced piddle) 
Type ITEMIDLIST 'idl 
 mkid As SHITEMID 
End Type 
' Converts an item identifier list to a file system path. 
' Returns TRUE if successful or FALSE if an error occurs ?for example, 
' if the location specified by the pidl parameter is not part of the file system. 
Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long 
' Retrieves the location of a special (system) folder. 
' Returns NOERROR if successful or an OLE-defined error result otherwise. 
Declare Function SHGetSpecialFolderLocation Lib "shell32.dll" (ByVal hwndOwner As Long, ByVal nFolder As Long, pidl As ITEMIDLIST) As Long 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:36   回复此发言    
 
--------------------------------------------------------------------------------
 
89 API的“浏览”对话框。  
 
Public Const NOERROR = 0 
' SHGetSpecialFolderLocation "nFolder" param: 
' Value specifying the folder to retrieve the location of. This parameter 
' can be one of the following values: Most folder locations are stored in: 
' HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders 
' Windows desktop ?virtual folder at the root of the name space. 
Public Const CSIDL_DESKTOP = &H0 
' File system directory that contains the user's program groups 
' (which are also file system directories). 
Public Const CSIDL_PROGRAMS = &H2 
' Control Panel ?virtual folder containing icons for the control panel applications. 
Public Const CSIDL_CONTROLS = &H3 
' Printers folder ?virtual folder containing installed printers. 
Public Const CSIDL_PRINTERS = &H4 
' File system directory that serves as a common respository for documents. 
Public Const CSIDL_PERSONAL = &H5 ' (Documents folder) 
' File system directory that contains the user's favorite Internet Explorer URLs. 
Public Const CSIDL_FAVORITES = &H6 
' File system directory that corresponds to the user's Startup program group. 
Public Const CSIDL_STARTUP = &H7 
' File system directory that contains the user's most recently used documents. 
Public Const CSIDL_RECENT = &H8 ' (Recent folder) 
' File system directory that contains Send To menu items. 
Public Const CSIDL_SENDTO = &H9 
' Recycle bin ?file system directory containing file objects in the user's recycle bin. 
' The location of this directory is not in the registry; it is marked with the hidden and 
' system attributes to prevent the user from moving or deleting it. 
Public Const CSIDL_BITBUCKET = &HA 
' File system directory containing Start menu items. 
Public Const CSIDL_STARTMENU = &HB 
' File system directory used to physically store file objects on the desktop 
' (not to be confused with the desktop folder itself). 
Public Const CSIDL_DESKTOPDIRECTORY = &H10 
' My Computer ?virtual folder containing everything on the local computer: storage 
' devices, printers, and Control Panel. The folder may also contain mapped network drives. 
Public Const CSIDL_DRIVES = &H11 
' Network Neighborhood ?virtual folder representing the top level of the network hierarchy. 
Public Const CSIDL_NETWORK = &H12 
' File system directory containing objects that appear in the network neighborhood. 
Public Const CSIDL_NETHOOD = &H13 
' Virtual folder containing fonts. 
Public Const CSIDL_FONTS = &H14 
' File system directory that serves as a common repository for document templates. 
Public Const CSIDL_TEMPLATES = &H15 ' (ShellNew folder) 
'/////////////////////////////////////////////////////////////////////////////////////////////////////////// 
' Displays a dialog box that enables the user to select a shell folder. 
' Returns a pointer to an item identifier list that specifies the location 
' of the selected folder relative to the root of the name space. If the user 
' chooses the Cancel button in the dialog box, the return value is NULL. 
Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long 'ITEMIDLIST 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:36   回复此发言    
 
--------------------------------------------------------------------------------
 
90 API的“浏览”对话框。  
 
' Contains parameters for the the SHBrowseForFolder function and receives 
' information about the folder selected by the user. 
Public Type BROWSEINFO 'bi 
  
 ' Handle of the owner window for the dialog box. 
 hOwner As Long 
  
 ' Pointer to an item identifier list (an ITEMIDLIST structure) specifying the location 
 ' of the "root" folder to browse from. Only the specified folder and its subfolders 
 ' appear in the dialog box. This member can be NULL, and in that case, the 
 ' name space root (the desktop folder) is used. 
 pidlRoot As Long 
  
 ' Pointer to a buffer that receives the display name of the folder selected by the 
 ' user. The size of this buffer is assumed to be MAX_PATH bytes. 
 pszDisplayName As String 
  
 ' Pointer to a null-terminated string that is displayed above the tree view control 
 ' in the dialog box. This string can be used to specify instructions to the user. 
 lpszTitle As String 
  
 ' Value specifying the types of folders to be listed in the dialog box as well as 
 ' other options. This member can include zero or more of the following values below. 
 ulFlags As Long 
  
 ' Address an application-defined function that the dialog box calls when events 
 ' occur. For more information, see the description of the BrowseCallbackProc 
 ' function. This member can be NULL. 
 lpfn As Long 
  
 ' Application-defined value that the dialog box passes to the callback function 
 ' (if one is specified). 
 lParam As Long 
  
 ' Variable that receives the image associated with the selected folder. The image 
 ' is specified as an index to the system image list. 
 iImage As Long 
End Type 
' BROWSEINFO.ulFlags values: 
' Value specifying the types of folders to be listed in the dialog box as well as 
' other options. This member can include zero or more of the following values: 
' Only returns file system directories. If the user selects folders 
' that are not part of the file system, the OK button is grayed. 
Public Const BIF_RETURNONLYFSDIRS = &H1 
' Does not include network folders below the domain level in the tree view control. 
' For starting the Find Computer 
Public Const BIF_DONTGOBELOWDOMAIN = &H2 
' Includes a status area in the dialog box. The callback function can set 
' the status text by sending messages to the dialog box. 
Public Const BIF_STATUSTEXT = &H4 
' Only returns file system ancestors. If the user selects anything other 
' than a file system ancestor, the OK button is grayed. 
Public Const BIF_RETURNFSANCESTORS = &H8 
' Only returns computers. If the user selects anything other 
' than a computer, the OK button is grayed. 
Public Const BIF_BROWSEFORCOMPUTER = &H1000 
' Only returns (network) printers. If the user selects anything other 
' than a printer, the OK button is grayed. 
Public Const BIF_BROWSEFORPRINTER = &H2000  
 
  
 作者: 61.142.212.*  2005-10-28 21:36   回复此发言    
 
--------------------------------------------------------------------------------
 
91 把外部程序作为MDI窗口打开。  
 Option Explicit 
Private Const GW_HWNDNEXT = 2 
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long 
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long 
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long 
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long 
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long 
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long 
Private old_parent As Long 
Private child_hwnd As Long 
' Return the window handle for an instance handle. 
Private Function InstanceToWnd(ByVal target_pid As Long) As Long 
Dim test_hwnd As Long 
Dim test_pid As Long 
Dim test_thread_id As Long 
 ' Get the first window handle. 
 test_hwnd = FindWindow(ByVal 0&, ByVal 0&) 
 ' Loop until we find the target or we run out 
 ' of windows. 
 Do While test_hwnd <> 0 
 ' See if this window has a parent. If not, 
 ' it is a top-level window. 
 If GetParent(test_hwnd) = 0 Then 
 ' This is a top-level window. See if 
 ' it has the target instance handle. 
 test_thread_id = GetWindowThreadProcessId(test_hwnd, test_pid) 
 If test_pid = target_pid Then 
 ' This is the target. 
 InstanceToWnd = test_hwnd 
 Exit Do 
 End If 
 End If 
 ' Examine the next window. 
 test_hwnd = GetWindow(test_hwnd, GW_HWNDNEXT) 
 Loop 
End Function 
Private Sub cmdFree_Click() 
 SetParent child_hwnd, old_parent 
 cmdRun.Enabled = True 
 cmdFree.Enabled = False 
End Sub 
Private Sub cmdRun_Click() 
Dim pid As Long 
Dim buf As String 
Dim buf_len As Long 
Dim styles As Long 
 ' Start the program. 
 pid = Shell(txtProgram.Text, vbNormalFocus) 
 If pid = 0 Then 
 MsgBox "Error starting program" 
 Exit Sub 
 End If 
 ' Get the window handle. 
 child_hwnd = InstanceToWnd(pid) 
 ' Reparent the program so it lies inside 
 ' the PictureBox. 
 old_parent = SetParent(child_hwnd, MDIForm1.hwnd) 
 cmdRun.Enabled = False 
 cmdFree.Enabled = True 
End Sub 
--------- 
Option Explicit  
 
  
 作者: 61.142.212.*  2005-10-28 21:38   回复此发言    
 
--------------------------------------------------------------------------------
 
92 API的“浏览”对话框。  
 Private Sub cmdBrowse_Click() 
Dim strResFolder As String 
strResFolder = BrowseForFolder(hWnd, "Please select a folder.") 
If strResFolder = "" Then 
 Call MsgBox("The Cancel button was pressed.", vbExclamation) 
Else 
 Call MsgBox("The folder " & strResFolder & " was selected.", vbExclamation) 
End If 
End Sub 
----------- 
'This module contains all the declarations to use the 
'Windows 95 Shell API to use the browse for folders 
'dialog box. To use the browse for folders dialog box, 
'please call the BrowseForFolders function using the 
'syntax: stringFolderPath=BrowseForFolders(Hwnd,TitleOfDialog) 
' 
'For more demo projects, please visit out web site at 
'http://www.btinternet.com/~jelsoft/ 
' 
'To contact us, please send an email to jelsoft@btinternet.com 
Option Explicit 
Public Type BrowseInfo 
 hwndOwner As Long 
 pIDLRoot As Long 
 pszDisplayName As Long 
 lpszTitle As Long 
 ulFlags As Long 
 lpfnCallback As Long 
 lParam As Long 
 iImage As Long 
End Type 
Public Const BIF_RETURNONLYFSDIRS = 1 
Public Const MAX_PATH = 260 
Public Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long) 
Public Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long 
Public Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long 
Public Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long 
Public Function BrowseForFolder(hwndOwner As Long, sPrompt As String) As String 
  
 'declare variables to be used 
 Dim iNull As Integer 
 Dim lpIDList As Long 
 Dim lResult As Long 
 Dim sPath As String 
 Dim udtBI As BrowseInfo 
 'initialise variables 
 With udtBI 
 .hwndOwner = hwndOwner 
 .lpszTitle = lstrcat(sPrompt, "") 
 .ulFlags = BIF_RETURNONLYFSDIRS 
 End With 
 'Call the browse for folder API 
 lpIDList = SHBrowseForFolder(udtBI) 
  
 'get the resulting string path 
 If lpIDList Then 
 sPath = String$(MAX_PATH, 0) 
 lResult = SHGetPathFromIDList(lpIDList, sPath) 
 Call CoTaskMemFree(lpIDList) 
 iNull = InStr(sPath, vbNullChar) 
 If iNull Then sPath = Left$(sPath, iNull - 1) 
 End If 
 'If cancel was pressed, sPath = "" 
 BrowseForFolder = sPath 
End Function  
 
  
 作者: 61.142.212.*  2005-10-28 21:39   回复此发言    
 
--------------------------------------------------------------------------------
 
93 Windows 公共对话框的源代码,包含文件、打印机、颜色、字体、游览  
 '// 
'// Common Dialogs Module 
'// 
'// Description: 
'// Provides wrapper functions into the various Windows OS common dialog boxes 
'// 
'// *************************************************************** 
'// * Go to Dragon's VB Code Corner for more useful sourcecode: * 
'// * http://personal.inet.fi/cool/dragon/vb/ * 
'// *************************************************************** 
'// 
'// Author of this module: Unknown 
'// 
Option Explicit 
'// 
'// Structures 
'// 
Private Type OPENFILENAME 
 lStructSize As Long 
 hWnd As Long 
 hInstance As Long 
 lpstrFilter As String 
 lpstrCustomFilter As String 
 nMaxCustFilter As Long 
 nFilterIndex As Long 
 lpstrFile As String 
 nMaxFile As Long 
 lpstrFileTitle As String 
 nMaxFileTitle As Long 
 lpstrInitialDir As String 
 lpstrTitle As String 
 Flags As Long 
 nFileOffset As Integer 
 nFileExtension As Integer 
 lpstrDefExt As String 
 lCustData As Long 
 lpfnHook As Long 
 lpTemplateName As String 
End Type 
Private Type COLORSTRUC 
 lStructSize As Long 
 hWnd As Long 
 hInstance As Long 
 rgbResult As Long 
 lpCustColors As String 
 Flags As Long 
 lCustData As Long 
 lpfnHook As Long 
 lpTemplateName As String 
End Type 
Private Const LF_FACESIZE = 32 
Private Type LOGFONT 
 lfHeight As Long 
 lfWidth As Long 
 lfEscapement As Long 
 lfOrientation As Long 
 lfWeight As Long 
 lfItalic As Byte 
 lfUnderline As Byte 
 lfStrikeOut As Byte 
 lfCharSet As Byte 
 lfOutPrecision As Byte 
 lfClipPrecision As Byte 
 lfQuality As Byte 
 lfPitchAndFamily As Byte 
 lfFaceName(LF_FACESIZE) As Byte 
End Type 
Private Type FONTSTRUC 
 lStructSize As Long 
 hWnd As Long 
 hDC As Long 
 lpLogFont As Long 
 iPointSize As Long 
 Flags As Long 
 rgbColors As Long 
 lCustData As Long 
 lpfnHook As Long 
 lpTemplateName As String 
 hInstance As Long 
 lpszStyle As String 
 nFontType As Integer 
 MISSING_ALIGNMENT As Integer 
 nSizeMin As Long 
 nSizeMax As Long 
End Type 
Public Type DEVMODE 
 dmDeviceName As String * 32 
 dmSpecVersion As Integer 
 dmDriverVersion As Integer 
 dmSize As Integer 
 dmDriverExtra As Integer 
 dmFields As Long 
 dmOrientation As Integer 
 dmPaperSize As Integer 
 dmPaperLength As Integer 
 dmPaperWidth As Integer 
 dmScale As Integer 
 dmCopies As Integer 
 dmDefaultSource As Integer 
 dmPrintQuality As Integer 
 dmColor As Integer 
 dmDuplex As Integer 
 dmYResolution As Integer 
 dmTTOption As Integer 
 dmCollate As Integer 
 dmFormName As String * 32 
 dmUnusedPadding As Integer 
 dmBitsPerPel As Integer 
 dmPelsWidth As Long 
 dmPelsHeight As Long 
 dmDisplayFlags As Long 
 dmDisplayFreq As Long 
End Type 
Private Type PRINTDLGSTRUC 
 lStructSize As Long 
 hWnd As Long 
 hDevMode As Long 
 hDevNames As Long 
 hDC As Long 
 Flags As Long 
 nFromPage As Integer 
 nToPage As Integer 
 nMinPage As Integer 
 nMaxPage As Integer 
 nCopies As Integer 
 hInstance As Long 
 lCustData As Long 
 lpfnPrintHook As Long 
 lpfnSetupHook As Long 
 lpPrintTemplateName As String 
 lpSetupTemplateName As String 
 hPrintTemplate As Long 
 hSetupTemplate As Long 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:40   回复此发言    
 
--------------------------------------------------------------------------------
 
94 Windows 公共对话框的源代码,包含文件、打印机、颜色、字体、游览  
 End Type 
Public Type PRINTPROPS 
 Cancel As Boolean 
 Device As String 
 Copies As Integer 
 Collate As Boolean 
 File As Boolean 
 All As Boolean 
 Pages As Boolean 
 Selection As Boolean 
 FromPage As Integer 
 ToPage As Integer 
 DM As DEVMODE 
End Type 
Private Type SHITEMID 
 cb As Long 
 abID As Byte 
End Type 
Private Type ITEMIDLIST 
 mkid As SHITEMID 
End Type 
Private Type BROWSEINFO 
 hOwner As Long 
 pidlRoot As Long 
 pszDisplayName As String 
 lpszTitle As String 
 ulFlags As Long 
 lpfn As Long 
 lParam As Long 
 iImage As Long 
End Type 
'// 
'// Win32s (Private Functions for Wrappers Below) 
'// 
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long 
Private Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long 
Private Declare Function PrintDlg Lib "comdlg32.dll" Alias "PrintDlgA" (pPrintdlg As PRINTDLGSTRUC) As Long 
Private Declare Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As COLORSTRUC) As Long 
Private Declare Function ChooseFont Lib "comdlg32.dll" Alias "ChooseFontA" (pChoosefont As FONTSTRUC) As Long 
Private Declare Function GlobalAlloc Lib "Kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long 
Private Declare Function GlobalFree Lib "Kernel32" (ByVal hMem As Long) As Long 
Private Declare Function GlobalLock Lib "Kernel32" (ByVal hMem As Long) As Long 
Private Declare Function GlobalUnlock Lib "Kernel32" (ByVal hMem As Long) As Long 
Private Declare Sub CopyMemory Lib "Kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long) 
Private Declare Function SHGetPathFromIDList Lib "SHELL32.DLL" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long 
Private Declare Function SHGetSpecialFolderLocation Lib "SHELL32.DLL" (ByVal hwndOwner As Long, ByVal nFolder As Long, pidl As ITEMIDLIST) As Long 
Private Declare Function SHBrowseForFolder Lib "SHELL32.DLL" Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long 'ITEMIDLIST 
Private Declare Function WriteProfileString Lib "Kernel32" Alias "WriteProfileStringA" (ByVal lpszSection As String, ByVal lpszKeyName As String, ByVal lpszString As String) As Long 
Private Declare Function GetProfileString Lib "Kernel32" Alias "GetProfileStringA" (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long 
Private Declare Function SendMessageByString Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long 
'// 
'// Win32s (Public) 
'// 
Declare Function WinHelp Lib "user32" Alias "WinHelpA" (ByVal hWnd As Long, ByVal lpHelpFile As String, ByVal wCommand As Long, ByVal dwData As Any) As Long 
Declare Function HTMLHelp Lib "hhctrl.ocx" Alias "HtmlHelpA" (ByVal hWnd As Long, ByVal szFilename As String, ByVal dwCommand As Long, ByVal dwData As Any) As Long 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:40   回复此发言    
 
--------------------------------------------------------------------------------
 
95 Windows 公共对话框的源代码,包含文件、打印机、颜色、字体、游览  
 
'// 
'// Constants (Public for Print Dialog Box) 
'// 
Public Const PD_NOSELECTION = &H4 
Public Const PD_DISABLEPRINTTOFILE = &H80000 
Public Const PD_PRINTTOFILE = &H20 
Public Const PD_RETURNDC = &H100 
Public Const PD_RETURNDEFAULT = &H400 
Public Const PD_RETURNIC = &H200 
Public Const PD_SELECTION = &H1 
Public Const PD_SHOWHELP = &H800 
Public Const PD_NOPAGENUMS = &H8 
Public Const PD_PAGENUMS = &H2 
Public Const PD_ALLPAGES = &H0 
Public Const PD_COLLATE = &H10 
Public Const PD_HIDEPRINTTOFILE = &H100000 
'// 
'// Constants (Public for WinHelp) 
'// 
Public Const HELP_COMMAND = &H102& 
Public Const HELP_CONTENTS = &H3& 
Public Const HELP_CONTEXT = &H1 
Public Const HELP_CONTEXTPOPUP = &H8& 
Public Const HELP_FORCEFILE = &H9& 
Public Const HELP_HELPONHELP = &H4 
Public Const HELP_INDEX = &H3 
Public Const HELP_KEY = &H101 
Public Const HELP_MULTIKEY = &H201& 
Public Const HELP_PARTIALKEY = &H105& 
Public Const HELP_QUIT = &H2 
Public Const HELP_SETCONTENTS = &H5& 
Public Const HELP_SETINDEX = &H5 
Public Const HELP_SETWINPOS = &H203& 
'// 
'// Constants (Public for HTMLHelp) 
'// 
Public Const HH_DISPLAY_TOPIC = &H0& 
Public Const HH_HELP_FINDER = &H0& 
Public Const HH_DISPLAY_TOC = &H1& '// Currently Not Implemented 
Public Const HH_DISPLAY_INDEX = &H2& '// Currently Not Implemented 
Public Const HH_DISPLAY_SEARCH = &H3& '// Currently Not Implemented 
Public Const HH_SET_WIN_TYPE = &H4& 
Public Const HH_GET_WIN_TYPE = &H5& 
Public Const HH_GET_WIN_HANDLE = &H6& 
Public Const HH_ENUM_INFO_TYPE = &H7& 
Public Const HH_SET_INFO_TYPE = &H8& 
Public Const HH_SYNC = &H9& 
Public Const HH_ADD_NAV_UI = &H10& '// Currently Not Implemented 
Public Const HH_ADD_BUTTON = &H11& '// Currently Not Implemented 
Public Const HH_GETBROWSER_APP = &H12& '// Currently Not Implemented 
Public Const HH_KEYWORD_LOOKUP = &H13& 
Public Const HH_DISPLAY_TEXT_POPUP = &H14& 
Public Const HH_HELP_CONTEXT = &H15& 
Public Const HH_TP_HELP_CONTEXTMENU = &H16& 
Public Const HH_TP_HELP_WM_HELP = &H17& 
Public Const HH_CLOSE_ALL = &H18& 
Public Const HH_ALINK_LOOKUP = &H19& 
Public Const HH_GET_LAST_ERROR = &H20& '// Currently Not Implemented 
Public Const HH_ENUM_CATEGORY = &H21& 
Public Const HH_ENUM_CATEGORY_IT = &H22& 
Public Const HH_RESET_IT_FILTER = &H23& 
Public Const HH_SET_INCLUSIVE_FILTER = &H24& 
Public Const HH_SET_EXCLUSIVE_FILTER = &H25& 
Public Const HH_SET_GUID = &H26& 
Public Const HH_INTERNAL = &H255& 
'// 
'// Constants (Private) 
'// 
Private Const FW_BOLD = 700 
Private Const GMEM_MOVEABLE = &H2 
Private Const GMEM_ZEROINIT = &H40 
Private Const GHND = (GMEM_MOVEABLE Or GMEM_ZEROINIT) 
Private Const OFN_ALLOWMULTISELECT = &H200 
Private Const OFN_CREATEPROMPT = &H2000 
Private Const OFN_ENABLEHOOK = &H20 
Private Const OFN_ENABLETEMPLATE = &H40 
Private Const OFN_ENABLETEMPLATEHANDLE = &H80 
Private Const OFN_EXPLORER = &H80000 
Private Const OFN_EXTENSIONDIFFERENT = &H400 
Private Const OFN_FILEMUSTEXIST = &H1000 
Private Const OFN_HIDEREADONLY = &H4 
Private Const OFN_LONGNAMES = &H200000 
Private Const OFN_NOCHANGEDIR = &H8 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:40   回复此发言    
 
--------------------------------------------------------------------------------
 
96 Windows 公共对话框的源代码,包含文件、打印机、颜色、字体、游览  
 Private Const OFN_NODEREFERENCELINKS = &H100000 
Private Const OFN_NOLONGNAMES = &H40000 
Private Const OFN_NONETWORKBUTTON = &H20000 
Private Const OFN_NOREADONLYRETURN = &H8000 
Private Const OFN_NOTESTFILECREATE = &H10000 
Private Const OFN_NOVALIDATE = &H100 
Private Const OFN_OVERWRITEPROMPT = &H2 
Private Const OFN_PATHMUSTEXIST = &H800 
Private Const OFN_READONLY = &H1 
Private Const OFN_SHAREAWARE = &H4000 
Private Const OFN_SHAREFALLTHROUGH = 2 
Private Const OFN_SHARENOWARN = 1 
Private Const OFN_SHAREWARN = 0 
Private Const OFN_SHOWHELP = &H10 
Private Const PD_ENABLEPRINTHOOK = &H1000 
Private Const PD_ENABLEPRINTTEMPLATE = &H4000 
Private Const PD_ENABLEPRINTTEMPLATEHANDLE = &H10000 
Private Const PD_ENABLESETUPHOOK = &H2000 
Private Const PD_ENABLESETUPTEMPLATE = &H8000 
Private Const PD_ENABLESETUPTEMPLATEHANDLE = &H20000 
Private Const PD_NONETWORKBUTTON = &H200000 
Private Const PD_PRINTSETUP = &H40 
Private Const PD_USEDEVMODECOPIES = &H40000 
Private Const PD_USEDEVMODECOPIESANDCOLLATE = &H40000 
Private Const PD_NOWARNING = &H80 
Private Const CF_ANSIONLY = &H400& 
Private Const CF_APPLY = &H200& 
Private Const CF_BITMAP = 2 
Private Const CF_PRINTERFONTS = &H2 
Private Const CF_PRIVATEFIRST = &H200 
Private Const CF_PRIVATELAST = &H2FF 
Private Const CF_RIFF = 11 
Private Const CF_SCALABLEONLY = &H20000 
Private Const CF_SCREENFONTS = &H1 
Private Const CF_BOTH = (CF_SCREENFONTS Or CF_PRINTERFONTS) 
Private Const CF_DIB = 8 
Private Const CF_DIF = 5 
Private Const CF_DSPBITMAP = &H82 
Private Const CF_DSPENHMETAFILE = &H8E 
Private Const CF_DSPMETAFILEPICT = &H83 
Private Const CF_DSPTEXT = &H81 
Private Const CF_EFFECTS = &H100& 
Private Const CF_ENABLEHOOK = &H8& 
Private Const CF_ENABLETEMPLATE = &H10& 
Private Const CF_ENABLETEMPLATEHANDLE = &H20& 
Private Const CF_ENHMETAFILE = 14 
Private Const CF_FIXEDPITCHONLY = &H4000& 
Private Const CF_FORCEFONTEXIST = &H10000 
Private Const CF_GDIOBJFIRST = &H300 
Private Const CF_GDIOBJLAST = &H3FF 
Private Const CF_INITTOLOGFONTSTRUCT = &H40& 
Private Const CF_LIMITSIZE = &H2000& 
Private Const CF_METAFILEPICT = 3 
Private Const CF_NOFACESEL = &H80000 
Private Const CF_NOVERTFONTS = &H1000000 
Private Const CF_NOVECTORFONTS = &H800& 
Private Const CF_NOOEMFONTS = CF_NOVECTORFONTS 
Private Const CF_NOSCRIPTSEL = &H800000 
Private Const CF_NOSIMULATIONS = &H1000& 
Private Const CF_NOSIZESEL = &H200000 
Private Const CF_NOSTYLESEL = &H100000 
Private Const CF_OEMTEXT = 7 
Private Const CF_OWNERDISPLAY = &H80 
Private Const CF_PALETTE = 9 
Private Const CF_PENDATA = 10 
Private Const CF_SCRIPTSONLY = CF_ANSIONLY 
Private Const CF_SELECTSCRIPT = &H400000 
Private Const CF_SHOWHELP = &H4& 
Private Const CF_SYLK = 4 
Private Const CF_TEXT = 1 
Private Const CF_TIFF = 6 
Private Const CF_TTONLY = &H40000 
Private Const CF_UNICODETEXT = 13 
Private Const CF_USESTYLE = &H80& 
Private Const CF_WAVE = 12 
Private Const CF_WYSIWYG = &H8000 
Private Const CFERR_CHOOSEFONTCODES = &H2000 
Private Const CFERR_MAXLESSTHANMIN = &H2002 
Private Const CFERR_NOFONTS = &H2001 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:40   回复此发言    
 
--------------------------------------------------------------------------------
 
97 Windows 公共对话框的源代码,包含文件、打印机、颜色、字体、游览  
 Private Const CC_ANYCOLOR = &H100 
Private Const CC_CHORD = 4 
Private Const CC_CIRCLES = 1 
Private Const CC_ELLIPSES = 8 
Private Const CC_ENABLEHOOK = &H10 
Private Const CC_ENABLETEMPLATE = &H20 
Private Const CC_ENABLETEMPLATEHANDLE = &H40 
Private Const CC_FULLOPEN = &H2 
Private Const CC_INTERIORS = 128 
Private Const CC_NONE = 0 
Private Const CC_PIE = 2 
Private Const CC_PREVENTFULLOPEN = &H4 
Private Const CC_RGBINIT = &H1 
Private Const CC_ROUNDRECT = 256 ' 
Private Const CC_SHOWHELP = &H8 
Private Const CC_SOLIDCOLOR = &H80 
Private Const CC_STYLED = 32 
Private Const CC_WIDE = 16 
Private Const CC_WIDESTYLED = 64 
Private Const CCERR_CHOOSECOLORCODES = &H5000 
Private Const LOGPIXELSY = 90 
Private Const CCHDEVICENAME = 32 
Private Const CCHFORMNAME = 32 
Private Const SIMULATED_FONTTYPE = &H8000 
Private Const PRINTER_FONTTYPE = &H4000 
Private Const SCREEN_FONTTYPE = &H2000 
Private Const BOLD_FONTTYPE = &H100 
Private Const ITALIC_FONTTYPE = &H200 
Private Const REGULAR_FONTTYPE = &H400 
Private Const WM_CHOOSEFONT_GETLOGFONT = (&H400 + 1) 
Private Const LBSELCHSTRING = "commdlg_LBSelChangedNotify" 
Private Const SHAREVISTRING = "commdlg_ShareViolation" 
Private Const FILEOKSTRING = "commdlg_FileNameOK" 
Private Const COLOROKSTRING = "commdlg_ColorOK" 
Private Const SETRGBSTRING = "commdlg_SetRGBColor" 
Private Const FINDMSGSTRING = "commdlg_FindReplace" 
Private Const HELPMSGSTRING = "commdlg_help" 
Private Const CD_LBSELNOITEMS = -1 
Private Const CD_LBSELCHANGE = 0 
Private Const CD_LBSELSUB = 1 
Private Const CD_LBSELADD = 2 
Private Const NOERROR = 0 
Private Const CSIDL_DESKTOP = &H0 
Private Const CSIDL_PROGRAMS = &H2 
Private Const CSIDL_CONTROLS = &H3 
Private Const CSIDL_PRINTERS = &H4 
Private Const CSIDL_PERSONAL = &H5 
Private Const CSIDL_FAVORITES = &H6 
Private Const CSIDL_STARTUP = &H7 
Private Const CSIDL_RECENT = &H8 
Private Const CSIDL_SENDTO = &H9 
Private Const CSIDL_BITBUCKET = &HA 
Private Const CSIDL_STARTMENU = &HB 
Private Const CSIDL_DESKTOPDIRECTORY = &H10 
Private Const CSIDL_DRIVES = &H11 
Private Const CSIDL_NETWORK = &H12 
Private Const CSIDL_NETHOOD = &H13 
Private Const CSIDL_FONTS = &H14 
Private Const CSIDL_TEMPLATES = &H15 
Private Const BIF_RETURNONLYFSDIRS = &H1 
Private Const BIF_DONTGOBELOWDOMAIN = &H2 
Private Const BIF_STATUSTEXT = &H4 
Private Const BIF_RETURNFSANCESTORS = &H8 
Private Const BIF_BROWSEFORCOMPUTER = &H1000 
Private Const BIF_BROWSEFORPRINTER = &H2000 
Private Const HWND_BROADCAST = &HFFFF& 
Private Const WM_WININICHANGE = &H1A 
'// 
'// SetDefaultPrinter Function 
'// 
'// Description: 
'// Sets the user's default printer to the printer represented by the passed printer object. 
'// 
'// Syntax: 
'// BOOL = SetDefaultPrinter(object) 
'// 
'// Example: 
'// Dim objNewPrinter As Printer 
'// Set objNewPrinter = Printers(2) 
'// SetDefaultPrinter objNewPrinter 
'// 
Public Function SetDefaultPrinter(objPrn As Printer) As Boolean 
 Dim x As Long, szTmp As String 
  
 szTmp = objPrn.DeviceName & "," & objPrn.DriverName & "," & objPrn.Port 
 x = WriteProfileString("windows", "device", szTmp) 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:40   回复此发言    
 
--------------------------------------------------------------------------------
 
98 Windows 公共对话框的源代码,包含文件、打印机、颜色、字体、游览  
  x = SendMessageByString(HWND_BROADCAST, WM_WININICHANGE, 0&, "windows") 
  
End Function 
'// 
'// GetDefaultPrinter Function 
'// 
'// Description: 
'// Retuns the device name of the default printer. 
'// 
'// Syntax: 
'// StrVar = GetDefaultPrinter() 
'// 
'// Example: 
'// szDefPrinter = GetDefaultPrinter 
'// 
Public Function GetDefaultPrinter() As String 
 Dim x As Long, szTmp As String, dwBuf As Long 
 dwBuf = 1024 
 szTmp = Space(dwBuf + 1) 
 x = GetProfileString("windows", "device", "", szTmp, dwBuf) 
 GetDefaultPrinter = Trim(Left(szTmp, x)) 
End Function 
'// 
'// ResetDefaultPrinter Function 
'// 
'// Description: 
'// Resets the default printer to the passed device name. 
'// 
'// Syntax: 
'// BOOL = ResetDefaultPrinter(StrVar) 
'// 
'// Example: 
'// szDefPrinter = GetDefaultPrinter() 
'// If Not ResetDefaultPrinter(szDefPrinter) Then 
'// MsgBox "Could not reset default printer.", vbExclamation 
'// End If 
'// 
Public Function ResetDefaultPrinter(szBuf As String) As Boolean 
 Dim x As Long 
  
 x = WriteProfileString("windows", "device", szBuf) 
 x = SendMessageByString(HWND_BROADCAST, WM_WININICHANGE, 0&, "windows") 
End Function 
'// 
'// BrowseFolder Function 
'// 
'// Description: 
'// Allows the user to interactively browse and select a folder found in the file system. 
'// 
'// Syntax: 
'// StrVar = BrowseFolder(hWnd, StrVar) 
'// 
'// Example: 
'// szFilename = BrowseFolder(Me.hWnd, "Browse for application folder:") 
'// 
Public Function BrowseFolder(hWnd As Long, szDialogTitle As String) As String 
 Dim x As Long, BI As BROWSEINFO, dwIList As Long, szPath As String, wPos As Integer 
  
 BI.hOwner = hWnd 
 BI.lpszTitle = szDialogTitle 
 BI.ulFlags = BIF_RETURNONLYFSDIRS 
 dwIList = SHBrowseForFolder(BI) 
 szPath = Space$(512) 
 x = SHGetPathFromIDList(ByVal dwIList, ByVal szPath) 
 If x Then 
 wPos = InStr(szPath, Chr(0)) 
 BrowseFolder = Left$(szPath, wPos - 1) 
 Else 
 BrowseFolder = "" 
 End If 
End Function 
'// 
'// DialogConnectToPrinter Function 
'// 
'// Description: 
'// Allows users to interactively selection and connect to local and network printers. 
'// 
'// Syntax: 
'// DialogConnectToPrinter 
'// 
'// Example: 
'// DialogConnectToPrinter 
'// 
Public Function DialogConnectToPrinter() As Boolean 
 Shell "rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL AddPrinter", vbNormalFocus 
  
End Function 
'// 
'// ByteToString Function 
'// 
'// Description: 
'// Converts an array of bytes into a string 
'// 
'// Syntax: 
'// StrVar = ByteToString(ARRAY) 
'// 
'// Example: 
'// szBuf = BytesToString(aChars(10)) 
'// 
Private Function ByteToString(aBytes() As Byte) As String 
 Dim dwBytePoint As Long, dwByteVal As Long, szOut As String 
  
 dwBytePoint = LBound(aBytes) 
  
 While dwBytePoint <= UBound(aBytes) 
  
 dwByteVal = aBytes(dwBytePoint) 
  
 If dwByteVal = 0 Then 
 ByteToString = szOut 
 Exit Function 
 Else 
 szOut = szOut & Chr$(dwByteVal) 
 End If 
  
 dwBytePoint = dwBytePoint + 1 
  
 Wend 
  
 ByteToString = szOut 
  
End Function 
'// 
'// DialogColor Function 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:40   回复此发言    
 
--------------------------------------------------------------------------------
 
99 Windows 公共对话框的源代码,包含文件、打印机、颜色、字体、游览  
 '// 
'// Description: 
'// Displays the Color common dialog box and sets a passed controls foreground color. 
'// 
'// Syntax: 
'// BOOL = DialogColor(hWnd, CONTROL) 
'// 
'// Example: 
'// Dim yn as Boolean 
'// yn = DialogColor(Me.hWnd, txtEditor) 
'// 
Public Function DialogColor(hWnd As Long, c As Control) As Boolean 
 Dim x As Long, CS As COLORSTRUC, CustColor(16) As Long 
  
 CS.lStructSize = Len(CS) 
 CS.hWnd = hWnd 
 CS.hInstance = App.hInstance 
 CS.Flags = CC_SOLIDCOLOR 
 CS.lpCustColors = String$(16 * 4, 0) 
 x = ChooseColor(CS) 
 If x = 0 Then 
 DialogColor = False 
 Else 
 DialogColor = True 
 c.ForeColor = CS.rgbResult 
 End If 
  
End Function 
'// 
'// DialogFile Function 
'// 
'// Description: 
'// Displays the File Open/Save As common dialog boxes. 
'// 
'// Syntax: 
'// StrVar = DialogFile(hWnd, IntVar, StrVar, StrVar, StrVar, StrVar, StrVar) 
'// 
'// Example: 
'// szFilename = DialogFile(Me.hWnd, 1, "Open", "MyFileName.doc", "Documents" & Chr(0) & "*.doc" & Chr(0) & "All files" & Chr(0) & "*.*", App.Path, "doc") 
'// 
'// Please note that the szFilter var works a bit differently 
'// from the filter property associated with the common dialog 
'// control. Instead of separating the differents parts of the 
'// string with pipe chars, |, you should use null chars, Chr(0), 
'// as separators. 
Public Function DialogFile(hWnd As Long, wMode As Integer, szDialogTitle As String, szFilename As String, szFilter As String, szDefDir As String, szDefExt As String) As String 
 Dim x As Long, OFN As OPENFILENAME, szFile As String, szFileTitle As String 
  
 OFN.lStructSize = Len(OFN) 
 OFN.hWnd = hWnd 
 OFN.lpstrTitle = szDialogTitle 
 OFN.lpstrFile = szFilename & String$(250 - Len(szFilename), 0) 
 OFN.nMaxFile = 255 
 OFN.lpstrFileTitle = String$(255, 0) 
 OFN.nMaxFileTitle = 255 
 OFN.lpstrFilter = szFilter 
 OFN.nFilterIndex = 1 
 OFN.lpstrInitialDir = szDefDir 
 OFN.lpstrDefExt = szDefExt 
 If wMode = 1 Then 
 OFN.Flags = OFN_HIDEREADONLY Or OFN_PATHMUSTEXIST Or OFN_FILEMUSTEXIST 
 x = GetOpenFileName(OFN) 
 Else 
 OFN.Flags = OFN_HIDEREADONLY Or OFN_OVERWRITEPROMPT Or OFN_PATHMUSTEXIST 
 x = GetSaveFileName(OFN) 
 End If 
  
 If x <> 0 Then 
  
 '// If InStr(OFN.lpstrFileTitle, Chr$(0)) > 0 Then 
 '// szFileTitle = Left$(OFN.lpstrFileTitle, InStr(OFN.lpstrFileTitle, Chr$(0)) - 1) 
 '// End If 
 If InStr(OFN.lpstrFile, Chr$(0)) > 0 Then 
 szFile = Left$(OFN.lpstrFile, InStr(OFN.lpstrFile, Chr$(0)) - 1) 
 End If 
 '// OFN.nFileOffset is the number of characters from the beginning of the 
 '// full path to the start of the file name 
 '// OFN.nFileExtension is the number of characters from the beginning of the 
 '// full path to the file's extention, including the (.) 
 '// MsgBox "File Name is " & szFileTitle & Chr$(13) & Chr$(10) & "Full path and file is " & szFile, , "Open" 
  
 '// DialogFile = szFile & "|" & szFileTitle 
 DialogFile = szFile 
  
 Else 
  
 DialogFile = "" 
  
 End If 
  
End Function 
'// 
'// DialogFont Function 
'// 
'// Description: 
'// Displays the Font common dialog box and sets a passed controls font properties. 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:40   回复此发言    
 
--------------------------------------------------------------------------------
 
100 Windows 公共对话框的源代码,包含文件、打印机、颜色、字体、游览  
 '// 
'// Syntax: 
'// BOOL = DialogFont(hWnd, CONTROL) 
'// 
'// Example: 
'// Dim yn as Boolean 
'// yn = DialogFont(Me.hWnd, txtEditor) 
'// 
Public Function DialogFont(hWnd As Long, c As Control) As Boolean 
 Dim LF As LOGFONT, FS As FONTSTRUC 
 Dim lLogFontAddress As Long, lMemHandle As Long 
  
 If c.Font.Bold Then LF.lfWeight = FW_BOLD 
 If c.Font.Italic = True Then LF.lfItalic = 1 
 If c.Font.Underline = True Then LF.lfUnderline = 1 
  
 FS.lStructSize = Len(FS) 
  
 lMemHandle = GlobalAlloc(GHND, Len(LF)) 
 If lMemHandle = 0 Then 
 DialogFont = False 
 Exit Function 
 End If 
  
 lLogFontAddress = GlobalLock(lMemHandle) 
 If lLogFontAddress = 0 Then 
 DialogFont = False 
 Exit Function 
 End If 
  
 CopyMemory ByVal lLogFontAddress, LF, Len(LF) 
 FS.lpLogFont = lLogFontAddress 
 FS.iPointSize = c.Font.Size * 10 
 FS.Flags = CF_SCREENFONTS Or CF_EFFECTS 
  
 If ChooseFont(FS) = 1 Then 
  
 CopyMemory LF, ByVal lLogFontAddress, Len(LF) 
  
 If LF.lfWeight >= FW_BOLD Then 
 c.Font.Bold = True 
 Else 
 c.Font.Bold = False 
 End If 
  
 If LF.lfItalic = 1 Then 
 c.Font.Italic = True 
 Else 
 c.Font.Italic = False 
 End If 
  
 If LF.lfUnderline = 1 Then 
 c.Font.Underline = True 
 Else 
 c.Font.Underline = False 
 End If 
  
 c.Font.Name = ByteToString(LF.lfFaceName()) 
 c.Font.Size = CLng(FS.iPointSize / 10) 
  
 DialogFont = True 
  
 Else 
  
 DialogFont = False 
  
 End If 
  
End Function 
'// 
'// DialogPrint Function 
'// 
'// Description: 
'// Displays the Print common dialog box and returns a structure containing user entered 
'// information from the common dialog box. 
'// 
'// Syntax: 
'// PRINTPROPS = DialogPrint(hWnd, BOOL, DWORD) 
'// 
'// Example: 
'// Dim PP As PRINTPROPS 
'// PP = DialogPrint(Me.hWnd, True, PD_PAGENUMS or PD_SELECTION or PD_SHOWHELP) 
'// 
Public Function DialogPrint(hWnd As Long, bPages As Boolean, Flags As Long) As PRINTPROPS 
 Dim DM As DEVMODE, PD As PRINTDLGSTRUC 
 Dim lpDM As Long, wNull As Integer, szDevName As String 
  
 PD.lStructSize = Len(PD) 
 PD.hWnd = hWnd 
 PD.hDevMode = 0 
 PD.hDevNames = 0 
 PD.hDC = 0 
 PD.Flags = Flags 
 PD.nFromPage = 0 
 PD.nToPage = 0 
 PD.nMinPage = 0 
 If bPages Then PD.nMaxPage = bPages - 1 
 PD.nCopies = 0 
 DialogPrint.Cancel = True 
  
 If PrintDlg(PD) Then 
  
 lpDM = GlobalLock(PD.hDevMode) 
 CopyMemory DM, ByVal lpDM, Len(DM) 
 lpDM = GlobalUnlock(PD.hDevMode) 
  
 DialogPrint.Cancel = False 
 DialogPrint.Device = Left$(DM.dmDeviceName, InStr(DM.dmDeviceName, Chr(0)) - 1) 
 DialogPrint.FromPage = 0 
 DialogPrint.ToPage = 0 
 DialogPrint.All = True 
 If PD.Flags And PD_PRINTTOFILE Then DialogPrint.File = True Else DialogPrint.File = False 
 If PD.Flags And PD_COLLATE Then DialogPrint.Collate = True Else DialogPrint.Collate = False 
 If PD.Flags And PD_PAGENUMS Then 
 DialogPrint.Pages = True 
 DialogPrint.All = False 
 DialogPrint.FromPage = PD.nFromPage 
 DialogPrint.ToPage = PD.nToPage 
 Else 
 DialogPrint.Pages = False 
 End If 
 If PD.Flags And PD_SELECTION Then 
 DialogPrint.Selection = True 
 DialogPrint.All = False 
 Else 
 DialogPrint.Pages = False 
 End If 
  
 If PD.nCopies = 1 Then 
 DialogPrint.Copies = DM.dmCopies 
 End If 
  
 DialogPrint.DM = DM 
  
 End If 
  
End Function 
'// 
'// DialogPrintSetup Function 
'// 
'// Description: 
'// Displays the Print Setup common dialog box. 
'// 
'// Syntax: 
'// BOOL = DialogPrintSetup(hWnd) 
'// 
'// Example: 
'// If DialogPrintSetup(Me.hWnd) Then 
'// End If 
'// 
Public Function DialogPrintSetup(hWnd As Long) As Boolean 
 Dim x As Long, PD As PRINTDLGSTRUC 
 PD.lStructSize = Len(PD) 
 PD.hWnd = hWnd 
 PD.Flags = PD_PRINTSETUP 
 x = PrintDlg(PD) 
  
End Function  
 
101 把焦点定位到任何已运行的窗口。  
 ' ********************************************************************* 
' Copyright ?995-97 Karl E. Peterson, All Rights Reserved 
' ********************************************************************* 
' You are free to use this code within your own applications, but you 
' are expressly forbidden from selling or otherwise distributing this 
' source code without prior written consent. 
' ********************************************************************* 
Option Explicit 
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long 
Private Sub cmdActivate_Click() 
 Dim nRet As Long 
 Dim Title As String 
 ' 
 ' Search using method user chose. 
 ' 
 nRet = AppActivatePartial(Trim(txtTitle.Text), _ 
 Val(frmMethod.Tag), CBool(chkCase.Value)) 
 If nRet Then 
 lblResults.Caption = "Found: &&H" & Hex$(nRet) 
 Title = Space$(256) 
 nRet = GetWindowText(nRet, Title, Len(Title)) 
 If nRet Then 
 lblResults.Caption = lblResults.Caption & _ 
 ", """ & Left$(Title, nRet) & """" 
 End If 
 Else 
 lblResults.Caption = "Search Failed" 
 End If 
End Sub 
Private Sub Form_Load() 
 ' 
 ' Setup controls. 
 ' 
 txtTitle.Text = "" 
 lblResults.Caption = "" 
 optMethod(0).Value = True 
End Sub 
Private Sub optMethod_Click(Index As Integer) 
 ' 
 ' Store selected Index, which just happens to 
 ' coincide with method Enum, into frame's Tag. 
 ' 
 frmMethod.Tag = Index 
End Sub 
--------------- 
' ********************************************************************* 
' Copyright ?995-98 Karl E. Peterson, All Rights Reserved 
' ********************************************************************* 
' You are free to use this code within your own applications, but you 
' are expressly forbidden from selling or otherwise distributing this 
' source code without prior written consent. 
' ********************************************************************* 
Option Explicit 
' 
' Required Win32 API Declarations 
' 
Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long 
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long 
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long 
Private Declare Function IsIconic Lib "user32" (ByVal hWnd As Long) As Long 
Private Declare Function IsWindowVisible Lib "user32" (ByVal hWnd As Long) As Long 
Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long 
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long 
' 
' Constants used with APIs 
' 
Private Const SW_RESTORE = 9 
' 
' Private variables needed to support enumeration 
' 
Private m_hWnd As Long 
Private m_Method As FindWindowPartialTypes 
Private m_CaseSens As Boolean 
Private m_Visible As Boolean 
Private m_AppTitle As String 
' 
' Constants used by FindWindowPartial 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:41   回复此发言    
 
--------------------------------------------------------------------------------
 
102 把焦点定位到任何已运行的窗口。  
 ' 
Public Enum FindWindowPartialTypes 
 FwpStartsWith = 0 
 FwpContains = 1 
 FwpMatches = 2 
End Enum 
Public Function AppActivatePartial(AppTitle As String, Optional Method As FindWindowPartialTypes = FwpStartsWith, Optional CaseSensitive As Boolean = False) As Long 
 Dim hWndApp As Long 
 ' 
 ' Retrieve window handle for first top-level window 
 ' that starts with or contains the passed string. 
 ' 
 hWndApp = FindWindowPartial(AppTitle, Method, CaseSensitive, True) 
 If hWndApp Then 
 ' 
 ' Switch to it, restoring if need be. 
 ' 
 If IsIconic(hWndApp) Then 
 Call ShowWindow(hWndApp, SW_RESTORE) 
 End If 
 Call SetForegroundWindow(hWndApp) 
 AppActivatePartial = hWndApp 
 End If 
End Function 
Public Function FindWindowPartial(AppTitle As String, _ 
 Optional Method As FindWindowPartialTypes = FwpStartsWith, _ 
 Optional CaseSensitive As Boolean = False, _ 
 Optional MustBeVisible As Boolean = False) As Long 
 ' 
 ' Reset all search parameters. 
 ' 
 m_hWnd = 0 
 m_Method = Method 
 m_CaseSens = CaseSensitive 
 m_AppTitle = AppTitle 
 ' 
 ' Upper-case search string if case-insensitive. 
 ' 
 If m_CaseSens = False Then 
 m_AppTitle = UCase$(m_AppTitle) 
 End If 
 ' 
 ' Fire off enumeration, and return m_hWnd when done. 
 ' 
 Call EnumWindows(AddressOf EnumWindowsProc, MustBeVisible) 
 FindWindowPartial = m_hWnd 
End Function 
Private Function EnumWindowsProc(ByVal hWnd As Long, ByVal lParam As Long) As Long 
 Static WindowText As String 
 Static nRet As Long 
 ' 
 ' Make sure we meet visibility requirements. 
 ' 
 If lParam Then 'window must be visible 
 If IsWindowVisible(hWnd) = False Then 
 EnumWindowsProc = True 
 End If 
 End If 
 ' 
 ' Retrieve windowtext (caption) 
 ' 
 WindowText = Space$(256) 
 nRet = GetWindowText(hWnd, WindowText, Len(WindowText)) 
 If nRet Then 
 ' 
 ' Clean up window text and prepare for comparison. 
 ' 
 WindowText = Left$(WindowText, nRet) 
 If m_CaseSens = False Then 
 WindowText = UCase$(WindowText) 
 End If 
 ' 
 ' Use appropriate method to determine if 
 ' current window's caption either starts 
 ' with, contains, or matches passed string. 
 ' 
 Select Case m_Method 
 Case FwpStartsWith 
 If InStr(WindowText, m_AppTitle) = 1 Then 
 m_hWnd = hWnd 
 End If 
 Case FwpContains 
 If InStr(WindowText, m_AppTitle) <> 0 Then 
 m_hWnd = hWnd 
 End If 
 Case FwpMatches 
 If WindowText = m_AppTitle Then 
 m_hWnd = hWnd 
 End If 
 End Select 
 End If 
 ' 
 ' Return True to continue enumeration if we haven't 
 ' found what we're looking for. 
 ' 
 EnumWindowsProc = (m_hWnd = 0) 
End Function  
 
  
 作者: 61.142.212.*  2005-10-28 21:41   回复此发言    
 
--------------------------------------------------------------------------------
 
103 另一个实现窗口背景的渐变。  
 Option Explicit 
Dim fadeStyle As Integer 
Private Sub FadeForm(frmIn As Form, fadeStyle As Integer) 
 'fadeStyle = 0 produces diagonal gradient 
 'fadeStyle = 1 produces vertical gradient 
 'fadeStyle = 2 produces horizontal gradient 
 'any other value produces solid medium-blue background 
 Static ColorBits As Long 
 Static RgnCnt As Integer 
 Dim NbrPlanes As Long 
 Dim BitsPerPixel As Long 
 Dim AreaHeight As Long 
 Dim AreaWidth As Long 
 Dim BlueLevel As Long 
 Dim prevScaleMode As Integer 
 Dim IntervalY As Long 
 Dim IntervalX As Long 
 Dim i As Integer 
 Dim r As Long 
 Dim ColorVal As Long 
 Dim FillArea As RECT 
 Dim hBrush As Long 
 'init code - performed only on the first pass through this routine. 
 If ColorBits = 0 Then 
 'determine number of color bits supported. 
 BitsPerPixel = GetDeviceCaps(frmIn.hDC, BITSPIXEL) 
 NbrPlanes = GetDeviceCaps(frmIn.hDC, PLANES) 
 ColorBits = (BitsPerPixel * NbrPlanes) 
 'Calculate the number of regions that the screen will be divided o. 
 'This is optimized for the current display's color depth. Why waste 
 'time rendering 256 shades if you can only discern 32 or 64 of them? 
 Select Case ColorBits 
 Case 32: RgnCnt = 256 '16M colors: 8 bits for blue 
 Case 24: RgnCnt = 256 '16M colors: 8 bits for blue 
 Case 16: RgnCnt = 256 '64K colors: 5 bits for blue 
 Case 15: RgnCnt = 32 '32K colors: 5 bits for blue 
 Case 8: RgnCnt = 64 '256 colors: 64 dithered blues 
 Case 4: RgnCnt = 64 '16 colors : 64 dithered blues 
 Case Else: ColorBits = 4 
 RgnCnt = 64 '16 colors assumed: 64 dithered blues 
 End Select 
 End If 'if solid then set and bail out 
  
 If fadeStyle = 3 Then 
 frmIn.BackColor = &H7F0000 ' med blue 
 Exit Sub 
 End If 
  
 prevScaleMode = frmIn.ScaleMode 'save the current scalemode 
 frmIn.ScaleMode = 3 'set to pixel 
 AreaHeight = frmIn.ScaleHeight 'calculate sizes 
 AreaWidth = frmIn.ScaleWidth 
 frmIn.ScaleMode = prevScaleMode 'reset to saved value 
 ColorVal = 256 / RgnCnt 'color diff between regions 
 IntervalY = AreaHeight / RgnCnt '# vert pixels per region 
 IntervalX = AreaWidth / RgnCnt '# horz pixels per region 
 'fill the client area from bottom/right 
 'to top/left except for top/left region 
 FillArea.Left = 0 
 FillArea.Top = 0 
 FillArea.Right = AreaWidth 
 FillArea.Bottom = AreaHeight 
 BlueLevel = 0 
 For i = 0 To RgnCnt - 1 
 'create a brush of the appropriate blue colour 
 hBrush = CreateSolidBrush(RGB(0, 0, BlueLevel)) 
 If fadeStyle = 0 Then 'diagonal gradient 
 FillArea.Top = FillArea.Bottom - IntervalY 
 FillArea.Left = 0 
 r = FillRect(frmIn.hDC, FillArea, hBrush) 
 FillArea.Top = 0 
 FillArea.Left = FillArea.Right - IntervalX 
 r = FillRect(frmIn.hDC, FillArea, hBrush) 
 FillArea.Bottom = FillArea.Bottom - IntervalY 
 FillArea.Right = FillArea.Right - IntervalX 
 ElseIf fadeStyle = 1 Then 'horizontal gradient 
 FillArea.Top = FillArea.Bottom - IntervalY 
 r = FillRect(frmIn.hDC, FillArea, hBrush) 
 FillArea.Bottom = FillArea.Bottom - IntervalY 
 Else 
 'vertical gradient 
 FillArea.Left = FillArea.Right - IntervalX 
 r = FillRect(frmIn.hDC, FillArea, hBrush) 
 FillArea.Right = FillArea.Right - IntervalX 
 End If 
 'done with that brush, so delete 
 r = DeleteObject(hBrush) 
 'increment the value by the appropriate 
 'steps for the display colour depth 
 BlueLevel = BlueLevel + ColorVal 
 Next 'Fill any the remaining top/left holes of the client area with solid blue 
 FillArea.Top = 0 
 FillArea.Left = 0 
 hBrush = CreateSolidBrush(RGB(0, 0, 255)) 
 r = FillRect(frmIn.hDC, FillArea, hBrush) 
 r = DeleteObject(hBrush) 
 Me.Refresh 
 End Sub 
Private Sub Form_Load() 
fadeStyle = 0 
mnuStyle(fadeStyle).Checked = True 
End Sub 
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) 
If Button = 2 Then PopupMenu zmnuStyle 
End Sub 
Private Sub Form_Resize() 
If WindowState <> 1 Then 
FadeForm Me, fadeStyle 
End If 
End Sub 
Private Sub mnuStyle_Click(Index As Integer) 
'track the current selection 
Static prevStyle As Integer 
 'uncheck the last selection 
 mnuStyle(prevStyle).Checked = False 
 'set the variable indicating the style 
 fadeStyle = Index 
 'draw the new style 
 FadeForm Me, fadeStyle 
 'update the current selection 
 mnuStyle(fadeStyle).Checked = True 
 prevStyle = fadeStyle 
End Sub 
-------------- 
Option Explicit 
Public Const PLANES = 14 ' Number of planes 
Public Const BITSPIXEL = 12 ' Number of bits per pixel 
Type RECT 
 Left As Long 
 Top As Long 
 Right As Long 
 Bottom As Long 
End Type 
Declare Function CreateSolidBrush Lib "gdi32" _ 
 (ByVal crColor As Long) As Long 
  
 Declare Function DeleteObject Lib "gdi32" _ 
 (ByVal hObject As Long) As Long 
  
 Declare Function GetDeviceCaps Lib "gdi32" _ 
 (ByVal hDC As Long, ByVal nIndex As Long) As Long 
Declare Function FillRect Lib "user32" _ 
(ByVal hDC As Long, lpRect As RECT, _ 
 ByVal hBrush As Long) As Long  
 
  
 作者: 61.142.212.*  2005-10-28 21:42   回复此发言    
 
--------------------------------------------------------------------------------
 
104 检测当前按键状态(非常不错)  
 Option Explicit 
Private Sub Command1_Click() 
 Picture1.Picture = Image1.Picture 
End Sub 
Private Sub Command2_Click() 
 Unload Me 
End Sub 
Private Sub Command3_Click() 
 Picture1.Picture = LoadPicture("") 
End Sub 
Private Sub Command4_Click() 
 Dim dl As Long 
 Form2.Show 
End Sub 
Private Sub Form_Load() 
 Dim i As Integer 
  
 Move (Screen.Width - Form1.Width) \ 2, (Screen.Height - Form1.Height) \ 2 
End Sub 
Private Sub Form_Unload(Cancel As Integer) 
 End 
End Sub 
Private Sub Timer1_Timer() 
 Dim i As Integer 
 Dim Key(0 To 255) As Byte 
 Dim dl As Long 
 Dim KeyCode As Long 
 Dim KeyName As String * 256 
 List1.Clear 
 dl& = GetKeyboardState(Key(0)) '获取当前按键状态 
 For i = 0 To 254 
 If Key(i) And &H80 Then 
 KeyCode& = MapVirtualKey(i, 0) 
 dl& = GetKeyNameText(KeyCode * &H10000, KeyName, 255) 
 List1.AddItem "[ " & Left(KeyName, dl&) & " ]键,虚拟键码为(十进制)∶" & CStr(i) & Chr(13) & Chr(10) 
 End If 
 Next 
End Sub 
Private Sub Timer2_Timer() 
 Dim Key As Integer 
 Dim NowKey As Long 
  
 NowKey = 0 
 If HotKey = 0 Then Exit Sub 
 Key% = GetKeyState(VK_SHIFT) 
 If Key And &H4000 Then NowKey = NowKey Or HOTKEYF_SHIFT 
 Key% = GetKeyState(VK_CONTROL) 
 If Key And &H4000 Then NowKey = NowKey Or HOTKEYF_CONTROL 
 Key% = GetKeyState(VK_MENU) 
 If Key And &H4000 Then NowKey = NowKey Or HOTKEYF_ALT 
 Key% = GetKeyState(HotKey_Cild) 
 If Key And &H4000 And HotKey = NowKey Then 
 Command1_Click 
 End If 
End Sub 
----------- 
Option Explicit 
Private isALT As Byte 
Private isCONTROL As Byte 
Private isSHIFT As Byte 
Private Sub Command1_Click(Index As Integer) 
 If Index = 0 Then 
 If Check2.Value = 1 Then 
 HotKey = 0 
 If Check1(0).Value = 1 Then HotKey = HotKey Or HOTKEYF_CONTROL 
 If Check1(1).Value = 1 Then HotKey = HotKey Or HOTKEYF_ALT 
 If Check1(2).Value = 1 Then HotKey = HotKey Or HOTKEYF_SHIFT 
 HotKey_Cild = Asc(Combo1.Text) 
 Else 
 HotKey = 0 
 End If 
 End If 
 Unload Me 
End Sub 
Private Sub Form_Load() 
 Dim i As Integer 
 Move (Screen.Width - Form2.Width) \ 2, (Screen.Height - Form2.Height) \ 2 
  
 Combo1.Clear 
 For i = 48 To 57 
 Combo1.AddItem Chr(i) 
 Next 
 For i = 65 To 90 
 Combo1.AddItem Chr(i) 
 Next 
  
 If HotKey = 0 Then 
 Combo1.ListIndex = 0 
 Else 
 Check2.Value = 1 
 Combo1.Text = Chr(HotKey_Cild) 
 If HotKey And HOTKEYF_CONTROL Then Check1(0).Value = 1 
 If HotKey And HOTKEYF_ALT Then Check1(1).Value = 1 
 If HotKey And HOTKEYF_SHIFT Then Check1(2).Value = 1 
 End If 
  
 Call SetWindowWord(hwnd, GWL_HWNDPARENT, Form1.hwnd) 
 Form1.Enabled = False 
End Sub 
Private Sub Form_Unload(Cancel As Integer) 
  
 Form1.Enabled = True 
End Sub 
-------------- 
Option Explicit 
Public Declare Function GetKeyboardState& Lib "user32" (pbKeyState As Byte) 
Public Declare Function GetKeyNameText& Lib "user32" Alias "GetKeyNameTextA" (ByVal lParam As Long, ByVal lpBuffer As String, ByVal nSize As Long) 
Public Declare Function MapVirtualKey& Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) 
Public Declare Function GetAsyncKeyState% Lib "user32" (ByVal vKey As Long) 
Public Declare Function SetWindowWord& Lib "user32" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal wNewWord As Long) 
Public Declare Function GetKeyState% Lib "user32" (ByVal nVirtKey As Long) 
Public Const GWL_HWNDPARENT& = (-8) 
Public Const HOTKEYF_SHIFT = &H1 
Public Const HOTKEYF_CONTROL = &H2 
Public Const HOTKEYF_ALT = &H4 
Public Const VK_CONTROL& = &H11 
Public Const VK_SHIFT& = &H10 
Public Const VK_MENU& = &H12 
 
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long 
Public HotKey As Long 
Public HotKey_Cild As Long  
 
  
 作者: 61.142.212.*  2005-10-28 21:44   回复此发言    
 
--------------------------------------------------------------------------------
 
105 利用Windows的未公开函数SHChangeNotifyRegister实现文件目录操作  
 Option Explicit 
' Brought to you by Brad Martinez 
' http://members.aol.com/btmtz/vb 
' http://www.mvps.org/ccrp 
' Code was written in and formatted for 8pt MS San Serif 
' ==================================================================== 
' Demonstrates how to receive shell change notifications (ala "what happens when the 
' SHChangeNotify API is called?") 
' Interpretation of the shell's undocumented functions SHChangeNotifyRegister (ordinal 2) 
' and SHChangeNotifyDeregister (ordinal 4) would not have been possible without the 
' assistance of James Holderness. For a complete (and probably more accurate) overview 
' of shell change notifcations, please refer to James' "Shell Notifications" page at 
' http://www.geocities.com/SiliconValley/4942/ 
' ==================================================================== 
Private m_hSHNotify As Long ' the one and only shell change notification handle for the desktop folder 
Private m_pidlDesktop As Long ' the desktop's pidl 
' User defined notiication message sent to the specified window's window proc. 
Public Const WM_SHNOTIFY = &H401 
' ==================================================================== 
Public Type PIDLSTRUCT 
 ' Fully qualified pidl (relative to the desktop folder) of the folder to monitor changes in. 
 ' 0 can also be specifed for the desktop folder. 
 pidl As Long 
 ' Value specifying whether changes in the folder's subfolders trigger a change notification 
 ' event (it's actually a Boolean, but we'll go Long because of VB's DWORD struct alignment). 
 bWatchSubFolders As Long 
End Type 
Declare Function SHChangeNotifyRegister Lib "shell32" Alias "#2" _ 
 (ByVal hWnd As Long, _ 
 ByVal uFlags As SHCN_ItemFlags, _ 
 ByVal dwEventID As SHCN_EventIDs, _ 
 ByVal uMsg As Long, _ 
 ByVal cItems As Long, _ 
 lpps As PIDLSTRUCT) As Long 
' hWnd - Handle of the window to receive the window message specified in uMsg. 
' uFlags - Flag that indicates the meaning of the dwItem1 and dwItem2 members of the 
' SHNOTIFYSTRUCT (which is pointed to by the window procedure's wParam 
' value when the specifed window message is received). This parameter can 
' be one of the SHCN_ItemFlags enum values below. 
' This interpretaion may be inaccurate as it appears pdils are almost alway returned 
' in the SHNOTIFYSTRUCT. See James' site for more info... 
' dwEventId - Combination of SHCN_EventIDs enum values that specifies what events the 
' specified window will be notified of. See below. 
  
' uMsg - Window message to be used to identify receipt of a shell change notification. 
' The message should *not* be a value that lies within the specifed window's 
' message range ( i.e. BM_ messages for a button window) or that window may 
' not receive all (if not any) notifications sent by the shell!!! 
' cItems - Count of PIDLSTRUCT structures in the array pointed to by the lpps param. 
' lpps - Pointer to an array of PIDLSTRUCT structures indicating what folder(s) to monitor 
' changes in, and whether to watch the specified folder's subfolder. 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:46   回复此发言    
 
--------------------------------------------------------------------------------
 
106 利用Windows的未公开函数SHChangeNotifyRegister实现文件目录操作  
 
' If successful, returns a notification handle which must be passed to SHChangeNotifyDeregister 
' when no longer used. Returns 0 otherwise. 
' Once the specified message is registered with SHChangeNotifyRegister, the specified 
' window's function proc will be notified by the shell of the specified event in (and under) 
' the folder(s) speciifed in apidl. On message receipt, wParam points to a SHNOTIFYSTRUCT 
' and lParam contains the event's ID value. 
' The values in dwItem1 and dwItem2 are event specific. See the description of the values 
' for the wEventId parameter of the documented SHChangeNotify API function. 
Type SHNOTIFYSTRUCT 
 dwItem1 As Long 
 dwItem2 As Long 
End Type 
' ...? 
'Declare Function SHChangeNotifyUpdateEntryList Lib "shell32" Alias "#5" _ 
' (ByVal hNotify As Long, _ 
' ByVal Unknown As Long, _ 
' ByVal cItem As Long, _ 
' lpps As PIDLSTRUCT) As Boolean 
' 
'Declare Function SHChangeNotifyReceive Lib "shell32" Alias "#5" _ 
' (ByVal hNotify As Long, _ 
' ByVal uFlags As SHCN_ItemFlags, _ 
' ByVal dwItem1 As Long, _ 
' ByVal dwItem2 As Long) As Long 
' Closes the notification handle returned from a call to SHChangeNotifyRegister. 
' Returns True if succeful, False otherwise. 
Declare Function SHChangeNotifyDeregister Lib "shell32" Alias "#4" (ByVal hNotify As Long) As Boolean 
' ==================================================================== 
' This function should be called by any app that changes anything in the shell. 
' The shell will then notify each "notification registered" window of this action. 
Declare Sub SHChangeNotify Lib "shell32" _ 
 (ByVal wEventId As SHCN_EventIDs, _ 
 ByVal uFlags As SHCN_ItemFlags, _ 
 ByVal dwItem1 As Long, _ 
 ByVal dwItem2 As Long) 
' Shell notification event IDs 
Public Enum SHCN_EventIDs 
 SHCNE_RENAMEITEM = &H1 ' (D) A nonfolder item has been renamed. 
 SHCNE_CREATE = &H2 ' (D) A nonfolder item has been created. 
 SHCNE_DELETE = &H4 ' (D) A nonfolder item has been deleted. 
 SHCNE_MKDIR = &H8 ' (D) A folder item has been created. 
 SHCNE_RMDIR = &H10 ' (D) A folder item has been removed. 
 SHCNE_MEDIAINSERTED = &H20 ' (G) Storage media has been inserted into a drive. 
 SHCNE_MEDIAREMOVED = &H40 ' (G) Storage media has been removed from a drive. 
 SHCNE_DRIVEREMOVED = &H80 ' (G) A drive has been removed. 
 SHCNE_DRIVEADD = &H100 ' (G) A drive has been added. 
 SHCNE_NETSHARE = &H200 ' A folder on the local computer is being shared via the network. 
 SHCNE_NETUNSHARE = &H400 ' A folder on the local computer is no longer being shared via the network. 
 SHCNE_ATTRIBUTES = &H800 ' (D) The attributes of an item or folder have changed. 
 SHCNE_UPDATEDIR = &H1000 ' (D) The contents of an existing folder have changed, but the folder still exists and has not been renamed. 
 SHCNE_UPDATEITEM = &H2000 ' (D) An existing nonfolder item has changed, but the item still exists and has not been renamed. 
 SHCNE_SERVERDISCONNECT = &H4000 ' The computer has disconnected from a server. 
 SHCNE_UPDATEIMAGE = &H8000& ' (G) An image in the system image list has changed. 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:46   回复此发言    
 
--------------------------------------------------------------------------------
 
107 利用Windows的未公开函数SHChangeNotifyRegister实现文件目录操作  
  SHCNE_DRIVEADDGUI = &H10000 ' (G) A drive has been added and the shell should create a new window for the drive. 
 SHCNE_RENAMEFOLDER = &H20000 ' (D) The name of a folder has changed. 
 SHCNE_FREESPACE = &H40000 ' (G) The amount of free space on a drive has changed. 
#If (WIN32_IE >= &H400) Then 
 SHCNE_EXTENDED_EVENT = &H4000000 ' (G) Not currently used. 
#End If ' WIN32_IE >= &H0400 
 SHCNE_ASSOCCHANGED = &H8000000 ' (G) A file type association has changed. 
 SHCNE_DISKEVENTS = &H2381F ' Specifies a combination of all of the disk event identifiers. (D) 
 SHCNE_GLOBALEVENTS = &HC0581E0 ' Specifies a combination of all of the global event identifiers. (G) 
 SHCNE_ALLEVENTS = &H7FFFFFFF 
 SHCNE_INTERRUPT = &H80000000 ' The specified event occurred as a result of a system interrupt. 
 ' It is stripped out before the clients of SHCNNotify_ see it. 
End Enum 
#If (WIN32_IE >= &H400) Then ' ??? 
 Public Const SHCNEE_ORDERCHANGED = &H2 ' dwItem2 is the pidl of the changed folder 
#End If 
' Notification flags 
' uFlags & SHCNF_TYPE is an ID which indicates what dwItem1 and dwItem2 mean 
Public Enum SHCN_ItemFlags 
 SHCNF_IDLIST = &H0 ' LPITEMIDLIST 
 SHCNF_PATHA = &H1 ' path name 
 SHCNF_PRINTERA = &H2 ' printer friendly name 
 SHCNF_DWORD = &H3 ' DWORD 
 SHCNF_PATHW = &H5 ' path name 
 SHCNF_PRINTERW = &H6 ' printer friendly name 
 SHCNF_TYPE = &HFF 
 ' Flushes the system event buffer. The function does not return until the system is 
 ' finished processing the given event. 
 SHCNF_FLUSH = &H1000 
 ' Flushes the system event buffer. The function returns immediately regardless of 
 ' whether the system is finished processing the given event. 
 SHCNF_FLUSHNOWAIT = &H2000 
#If UNICODE Then 
 SHCNF_PATH = SHCNF_PATHW 
 SHCNF_PRINTER = SHCNF_PRINTERW 
#Else 
 SHCNF_PATH = SHCNF_PATHA 
 SHCNF_PRINTER = SHCNF_PRINTERA 
#End If 
End Enum 
' 
' Registers the one and only shell change notification. 
Public Function SHNotify_Register(hWnd As Long) As Boolean 
 Dim ps As PIDLSTRUCT 
  
 ' If we don't already have a notification going... 
 If (m_hSHNotify = 0) Then 
  
 ' Get the pidl for the desktop folder. 
 m_pidlDesktop = GetPIDLFromFolderID(0, CSIDL_DESKTOP) 
 If m_pidlDesktop Then 
  
 ' Fill the one and only PIDLSTRUCT, we're watching 
 ' desktop and all of the it's subfolders, everything... 
 ps.pidl = m_pidlDesktop 
 ps.bWatchSubFolders = True 
  
 ' Register the notification, specifying that we want the dwItem1 and dwItem2 
 ' members of the SHNOTIFYSTRUCT to be pidls. We're watching all events. 
 m_hSHNotify = SHChangeNotifyRegister(hWnd, SHCNF_TYPE Or SHCNF_IDLIST, _ 
 SHCNE_ALLEVENTS Or SHCNE_INTERRUPT, _ 
 WM_SHNOTIFY, 1, ps) 
 Debug.Print Hex(SHCNF_TYPE Or SHCNF_IDLIST) 
 Debug.Print Hex(SHCNE_ALLEVENTS Or SHCNE_INTERRUPT) 
 Debug.Print m_hSHNotify 
 SHNotify_Register = CBool(m_hSHNotify) 
  
 Else 
 ' If something went wrong... 
 Call CoTaskMemFree(m_pidlDesktop) 
  
 End If ' m_pidlDesktop 
 End If ' (m_hSHNotify = 0) 
  
End Function 
' Unregisters the one and only shell change notification. 
Public Function SHNotify_Unregister() As Boolean 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:46   回复此发言    
 
--------------------------------------------------------------------------------
 
108 利用Windows的未公开函数SHChangeNotifyRegister实现文件目录操作  
   
 ' If we have a registered notification handle. 
 If m_hSHNotify Then 
 ' Unregister it. If the call is successful, zero the handle's variable, 
 ' free and zero the the desktop's pidl. 
 If SHChangeNotifyDeregister(m_hSHNotify) Then 
 m_hSHNotify = 0 
 Call CoTaskMemFree(m_pidlDesktop) 
 m_pidlDesktop = 0 
 SHNotify_Unregister = True 
 End If 
 End If 
End Function 
' Returns the event string associated with the specified event ID value. 
Public Function SHNotify_GetEventStr(dwEventID As Long) As String 
 Dim sEvent As String 
  
 Select Case dwEventID 
 Case SHCNE_RENAMEITEM: sEvent = "SHCNE_RENAMEITEM" ' = &H1" 
 Case SHCNE_CREATE: sEvent = "SHCNE_CREATE" ' = &H2" 
 Case SHCNE_DELETE: sEvent = "SHCNE_DELETE" ' = &H4" 
 Case SHCNE_MKDIR: sEvent = "SHCNE_MKDIR" ' = &H8" 
 Case SHCNE_RMDIR: sEvent = "SHCNE_RMDIR" ' = &H10" 
 Case SHCNE_MEDIAINSERTED: sEvent = "SHCNE_MEDIAINSERTED" ' = &H20" 
 Case SHCNE_MEDIAREMOVED: sEvent = "SHCNE_MEDIAREMOVED" ' = &H40" 
 Case SHCNE_DRIVEREMOVED: sEvent = "SHCNE_DRIVEREMOVED" ' = &H80" 
 Case SHCNE_DRIVEADD: sEvent = "SHCNE_DRIVEADD" ' = &H100" 
 Case SHCNE_NETSHARE: sEvent = "SHCNE_NETSHARE" ' = &H200" 
 Case SHCNE_NETUNSHARE: sEvent = "SHCNE_NETUNSHARE" ' = &H400" 
 Case SHCNE_ATTRIBUTES: sEvent = "SHCNE_ATTRIBUTES" ' = &H800" 
 Case SHCNE_UPDATEDIR: sEvent = "SHCNE_UPDATEDIR" ' = &H1000" 
 Case SHCNE_UPDATEITEM: sEvent = "SHCNE_UPDATEITEM" ' = &H2000" 
 Case SHCNE_SERVERDISCONNECT: sEvent = "SHCNE_SERVERDISCONNECT" ' = &H4000" 
 Case SHCNE_UPDATEIMAGE: sEvent = "SHCNE_UPDATEIMAGE" ' = &H8000&" 
 Case SHCNE_DRIVEADDGUI: sEvent = "SHCNE_DRIVEADDGUI" ' = &H10000" 
 Case SHCNE_RENAMEFOLDER: sEvent = "SHCNE_RENAMEFOLDER" ' = &H20000" 
 Case SHCNE_FREESPACE: sEvent = "SHCNE_FREESPACE" ' = &H40000" 
  
#If (WIN32_IE >= &H400) Then 
 Case SHCNE_EXTENDED_EVENT: sEvent = "SHCNE_EXTENDED_EVENT" ' = &H4000000" 
#End If ' WIN32_IE >= &H0400 
  
 Case SHCNE_ASSOCCHANGED: sEvent = "SHCNE_ASSOCCHANGED" ' = &H8000000" 
  
 Case SHCNE_DISKEVENTS: sEvent = "SHCNE_DISKEVENTS" ' = &H2381F" 
 Case SHCNE_GLOBALEVENTS: sEvent = "SHCNE_GLOBALEVENTS" ' = &HC0581E0" 
 Case SHCNE_ALLEVENTS: sEvent = "SHCNE_ALLEVENTS" ' = &H7FFFFFFF" 
 Case SHCNE_INTERRUPT: sEvent = "SHCNE_INTERRUPT" ' = &H80000000" 
 End Select 
  
 SHNotify_GetEventStr = sEvent 
End Function 
--------------------  
 
  
 作者: 61.142.212.*  2005-10-28 21:46   回复此发言    
 
--------------------------------------------------------------------------------
 
109 回复 107:利用Windows的未公开函数SHChangeNotifyRegister实现文  
 Option Explicit 
' Brought to you by Brad Martinez 
' http://members.aol.com/btmtz/vb 
' http://www.mvps.org/ccrp 
' Code was written in and formatted for 8pt MS San Serif 
' ==================================================================== 
Declare Function FlashWindow Lib "user32" (ByVal hWnd As Long, ByVal bInvert As Long) As Long 
Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal dwLength As Long) 
' Frees memory allocated by the shell (pidls) 
Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal pv As Long) 
Public Const MAX_PATH = 260 
' Defined as an HRESULT that corresponds to S_OK. 
Public Const NOERROR = 0 
' Retrieves the location of a special (system) folder. 
' Returns NOERROR if successful or an OLE-defined error result otherwise. 
Declare Function SHGetSpecialFolderLocation Lib "shell32.dll" _ 
 (ByVal hwndOwner As Long, _ 
 ByVal nFolder As SHSpecialFolderIDs, _ 
 pidl As Long) As Long 
' Special folder values for SHGetSpecialFolderLocation and 
' SHGetSpecialFolderPath (Shell32.dll v4.71) 
Public Enum SHSpecialFolderIDs 
 CSIDL_DESKTOP = &H0 
 CSIDL_INTERNET = &H1 
 CSIDL_PROGRAMS = &H2 
 CSIDL_CONTROLS = &H3 
 CSIDL_PRINTERS = &H4 
 CSIDL_PERSONAL = &H5 
 CSIDL_FAVORITES = &H6 
 CSIDL_STARTUP = &H7 
 CSIDL_RECENT = &H8 
 CSIDL_SENDTO = &H9 
 CSIDL_BITBUCKET = &HA 
 CSIDL_STARTMENU = &HB 
 CSIDL_DESKTOPDIRECTORY = &H10 
 CSIDL_DRIVES = &H11 
 CSIDL_NETWORK = &H12 
 CSIDL_NETHOOD = &H13 
 CSIDL_FONTS = &H14 
 CSIDL_TEMPLATES = &H15 
 CSIDL_COMMON_STARTMENU = &H16 
 CSIDL_COMMON_PROGRAMS = &H17 
 CSIDL_COMMON_STARTUP = &H18 
 CSIDL_COMMON_DESKTOPDIRECTORY = &H19 
 CSIDL_APPDATA = &H1A 
 CSIDL_PRINTHOOD = &H1B 
 CSIDL_ALTSTARTUP = &H1D ' ' DBCS 
 CSIDL_COMMON_ALTSTARTUP = &H1E ' ' DBCS 
 CSIDL_COMMON_FAVORITES = &H1F 
 CSIDL_INTERNET_CACHE = &H20 
 CSIDL_COOKIES = &H21 
 CSIDL_HISTORY = &H22 
End Enum 
' Converts an item identifier list to a file system path. 
' Returns TRUE if successful or FALSE if an error occurs, for example, 
' if the location specified by the pidl parameter is not part of the file system. 
Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" _ 
 (ByVal pidl As Long, _ 
 ByVal pszPath As String) As Long 
' Retrieves information about an object in the file system, such as a file, 
' a folder, a directory, or a drive root. 
Declare Function SHGetFileInfoPidl Lib "shell32" Alias "SHGetFileInfoA" _ 
 (ByVal pidl As Long, _ 
 ByVal dwFileAttributes As Long, _ 
 psfib As SHFILEINFOBYTE, _ 
 ByVal cbFileInfo As Long, _ 
 ByVal uFlags As SHGFI_flags) As Long 
' If pidl is invalid, SHGetFileInfoPidl can very easily blow up when filling the 
' szDisplayName and szTypeName string members of the SHFILEINFO struct 
Public Type SHFILEINFOBYTE ' sfib 
 hIcon As Long 
 iIcon As Long 
 dwAttributes As Long 
 szDisplayName(1 To MAX_PATH) As Byte 
 szTypeName(1 To 80) As Byte 
End Type 
Declare Function SHGetFileInfo Lib "shell32" Alias "SHGetFileInfoA" _ 
 (ByVal pszPath As String, _ 
 ByVal dwFileAttributes As Long, _ 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:46   回复此发言    
 
--------------------------------------------------------------------------------
 
110 回复 107:利用Windows的未公开函数SHChangeNotifyRegister实现文  
  psfi As SHFILEINFO, _ 
 ByVal cbFileInfo As Long, _ 
 ByVal uFlags As SHGFI_flags) As Long 
Public Type SHFILEINFO ' shfi 
 hIcon As Long 
 iIcon As Long 
 dwAttributes As Long 
 szDisplayName As String * MAX_PATH 
 szTypeName As String * 80 
End Type 
Enum SHGFI_flags 
 SHGFI_LARGEICON = &H0 ' sfi.hIcon is large icon 
 SHGFI_SMALLICON = &H1 ' sfi.hIcon is small icon 
 SHGFI_OPENICON = &H2 ' sfi.hIcon is open icon 
 SHGFI_SHELLICONSIZE = &H4 ' sfi.hIcon is shell size (not system size), rtns BOOL 
 SHGFI_PIDL = &H8 ' pszPath is pidl, rtns BOOL 
 SHGFI_USEFILEATTRIBUTES = &H10 ' pretent pszPath exists, rtns BOOL 
 SHGFI_ICON = &H100 ' fills sfi.hIcon, rtns BOOL, use DestroyIcon 
 SHGFI_DISPLAYNAME = &H200 ' isf.szDisplayName is filled, rtns BOOL 
 SHGFI_TYPENAME = &H400 ' isf.szTypeName is filled, rtns BOOL 
 SHGFI_ATTRIBUTES = &H800 ' rtns IShellFolder::GetAttributesOf SFGAO_* flags 
 SHGFI_ICONLOCATION = &H1000 ' fills sfi.szDisplayName with filename 
 ' containing the icon, rtns BOOL 
 SHGFI_EXETYPE = &H2000 ' rtns two ASCII chars of exe type 
 SHGFI_SYSICONINDEX = &H4000 ' sfi.iIcon is sys il icon index, rtns hImagelist 
 SHGFI_LINKOVERLAY = &H8000 ' add shortcut overlay to sfi.hIcon 
 SHGFI_SELECTED = &H10000 ' sfi.hIcon is selected icon 
End Enum 
' 
' Returns an absolute pidl (realtive to the desktop) from a special folder's ID. 
' (calling proc is responsible for freeing the pidl) 
' hOwner - handle of window that will own any displayed msg boxes 
' nFolder - special folder ID 
Public Function GetPIDLFromFolderID(hOwner As Long, nFolder As SHSpecialFolderIDs) As Long 
 Dim pidl As Long 
 If SHGetSpecialFolderLocation(hOwner, nFolder, pidl) = NOERROR Then 
 GetPIDLFromFolderID = pidl 
 End If 
End Function 
' If successful returns the specified absolute pidl's displayname, 
' returns an empty string otherwise. 
Public Function GetDisplayNameFromPIDL(pidl As Long) As String 
 Dim sfib As SHFILEINFOBYTE 
 If SHGetFileInfoPidl(pidl, 0, sfib, Len(sfib), SHGFI_PIDL Or SHGFI_DISPLAYNAME) Then 
 GetDisplayNameFromPIDL = GetStrFromBufferA(StrConv(sfib.szDisplayName, vbUnicode)) 
 End If 
End Function 
' Returns a path from only an absolute pidl (relative to the desktop) 
Public Function GetPathFromPIDL(pidl As Long) As String 
 Dim sPath As String * MAX_PATH 
 If SHGetPathFromIDList(pidl, sPath) Then ' rtns TRUE (1) if successful, FALSE (0) if not 
 GetPathFromPIDL = GetStrFromBufferA(sPath) 
 End If 
End Function 
' Returns the string before first null char encountered (if any) from an ANSII string. 
Public Function GetStrFromBufferA(sz As String) As String 
 If InStr(sz, vbNullChar) Then 
 GetStrFromBufferA = Left$(sz, InStr(sz, vbNullChar) - 1) 
 Else 
 ' If sz had no null char, the Left$ function 
 ' above would return a zero length string (""). 
 GetStrFromBufferA = sz 
 End If 
End Function  
 
  
 作者: 61.142.212.*  2005-10-28 21:46   回复此发言    
 
--------------------------------------------------------------------------------
 
111 回复 110:利用Windows的未公开函数SHChangeNotifyRegister实现文  
 Option Explicit 
' Brought to you by Brad Martinez 
' http://members.aol.com/btmtz/vb 
' http://www.mvps.org/ccrp 
' Code was written in and formatted for 8pt MS San Serif 
Private Const WM_NCDESTROY = &H82 
Private Declare Function GetProp Lib "user32" Alias "GetPropA" (ByVal hWnd As Long, ByVal lpString As String) As Long 
Private Declare Function SetProp Lib "user32" Alias "SetPropA" (ByVal hWnd As Long, ByVal lpString As String, ByVal hData As Long) As Long 
Private Declare Function RemoveProp Lib "user32" Alias "RemovePropA" (ByVal hWnd As Long, ByVal lpString As String) As Long 
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long 
Private Const GWL_WNDPROC = (-4) 
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 
Private Const OLDWNDPROC = "OldWndProc" 
' 
Public Function SubClass(hWnd As Long) As Boolean 
 Dim lpfnOld As Long 
 Dim fSuccess As Boolean 
  
 If (GetProp(hWnd, OLDWNDPROC) = 0) Then 
 lpfnOld = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WndProc) 
 If lpfnOld Then 
 fSuccess = SetProp(hWnd, OLDWNDPROC, lpfnOld) 
 End If 
 End If 
  
 If fSuccess Then 
 SubClass = True 
 Else 
 If lpfnOld Then Call UnSubClass(hWnd) 
 MsgBox "Unable to successfully subclass &H" & Hex(hWnd), vbCritical 
 End If 
  
End Function 
Public Function UnSubClass(hWnd As Long) As Boolean 
 Dim lpfnOld As Long 
  
 lpfnOld = GetProp(hWnd, OLDWNDPROC) 
 If lpfnOld Then 
 If RemoveProp(hWnd, OLDWNDPROC) Then 
 UnSubClass = SetWindowLong(hWnd, GWL_WNDPROC, lpfnOld) 
 End If 
 End If 
End Function 
Public Function WndProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 
  
 Select Case uMsg 
 Case WM_SHNOTIFY 
 Call Form1.NotificationReceipt(wParam, lParam) 
  
 Case WM_NCDESTROY 
 Call UnSubClass(hWnd) 
 MsgBox "Unubclassed &H" & Hex(hWnd), vbCritical, "WndProc Error" 
  
 End Select 
  
 WndProc = CallWindowProc(GetProp(hWnd, OLDWNDPROC), hWnd, uMsg, wParam, lParam) 
  
End Function  
 
  
 作者: 61.142.212.*  2005-10-28 21:46   回复此发言    
 
--------------------------------------------------------------------------------
 
112 回复 111:利用Windows的未公开函数SHChangeNotifyRegister实现文  
 Option Explicit 
' 
' Brought to you by Brad Martinez 
' http://members.aol.com/btmtz/vb 
' http://www.mvps.org/ccrp 
' 
' Code was written in and formatted for 8pt MS San Serif 
' 
' ==================================================================== 
' Demonstrates how to receive shell change notifications (ala "what happens when the 
' SHChangeNotify API is called?") 
' 
' Interpretation of the shell's undocumented functions SHChangeNotifyRegister (ordinal 2) 
' and SHChangeNotifyDeregister (ordinal 4) would not have been possible without the 
' assistance of James Holderness. For a complete (and probably more accurate) overview 
' of shell change notifcations, please refer to James' "Shell Notifications" page at 
' http://www.geocities.com/SiliconValley/4942/ 
' ==================================================================== 
' 
Private Sub Form_Load() 
 If SubClass(hWnd) Then 
 If IsIDE Then 
 Text1.Text = vbCrLf & _ 
 "一个 Windows的文件目录操作即时监视程序," & vbCrLf & "可以监视在Explore中的重命名、新建、删除文" & _ 
 vbCrLf & "件或目录;改变文件关联;插入、取出CD和添加" & vbCrLf & "删除网络共享都可以被该程序记录下来。" 
 End If 
 Call SHNotify_Register(hWnd) 
 'Else 
 ' Text1 = "Uh..., it's supposed to work... :-)" 
 End If 
 Move Screen.Width - Width, Screen.Height - Height 
End Sub 
Private Function IsIDE() As Boolean 
 On Error GoTo Out 
 Debug.Print 1 / 0 
Out: 
 IsIDE = Err 
End Function 
Private Sub Form_Unload(Cancel As Integer) 
 Call SHNotify_Unregister 
 Call UnSubClass(hWnd) 
End Sub 
Private Sub Form_Resize() 
 On Error GoTo Out 
 Text1.Move 0, 0, ScaleWidth, ScaleHeight 
Out: 
End Sub 
Public Sub NotificationReceipt(wParam As Long, lParam As Long) 
 Dim sOut As String 
 Dim shns As SHNOTIFYSTRUCT 
  
 sOut = SHNotify_GetEventStr(lParam) & vbCrLf 
  
 ' Fill the SHNOTIFYSTRUCT from it's pointer. 
 MoveMemory shns, ByVal wParam, Len(shns) 
  
 ' lParam is the ID of the notication event, one of the SHCN_EventIDs. 
 Select Case lParam 
  
 ' ================================================================ 
 ' For the SHCNE_FREESPACE event, dwItem1 points to what looks like a 10 byte 
 ' struct. The first two bytes are the size of the struct, and the next two members 
 ' equate to SHChangeNotify's dwItem1 and dwItem2 params. The dwItem1 member 
 ' is a bitfield indicating which drive(s) had it's (their) free space changed. The bitfield 
 ' is identical to the bitfield returned from a GetLogicalDrives call, i.e, bit 0 = A:\, bit 
 ' 1 = B:\, 2, = C:\, etc. Since VB does DWORD alignment when MoveMemory'ing 
 ' to a struct, we'll extract the bitfield directly from it's memory location. 
 Case SHCNE_FREESPACE 
 Dim dwDriveBits As Long 
 Dim wHighBit As Integer 
 Dim wBit As Integer 
  
 MoveMemory dwDriveBits, ByVal shns.dwItem1 + 2, 4 
 ' Get the zero based position of the highest bit set in the bitmask 
 ' (essentially determining the value's highest complete power of 2). 
 ' Use floating point division (we want the exact values from the Logs) 
 ' and remove the fractional value (the fraction indicates the value of 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:46   回复此发言    
 
--------------------------------------------------------------------------------
 
113 回复 111:利用Windows的未公开函数SHChangeNotifyRegister实现文  
  ' the last incomplete power of 2, which means the bit isn't set). 
 wHighBit = Int(Log(dwDriveBits) / Log(2)) 
  
 For wBit = 0 To wHighBit 
 ' If the bit is set... 
 If (2 ^ wBit) And dwDriveBits Then 
  
 ' The bit is set, get it's drive string 
 sOut = sOut & Chr$(vbKeyA + wBit) & ":\" & vbCrLf 
 End If 
 Next 
  
 ' ================================================================ 
 ' shns.dwItem1 also points to a 10 byte struct. The struct's second member (after the 
 ' struct's first WORD size member) points to the system imagelist index of the image 
 ' that was updated. 
 Case SHCNE_UPDATEIMAGE 
 Dim iImage As Long 
  
 MoveMemory iImage, ByVal shns.dwItem1 + 2, 4 
 sOut = sOut & "Index of image in system imagelist: " & iImage & vbCrLf 
  
 ' ================================================================ 
 ' Everything else except SHCNE_ATTRIBUTES is the pidl(s) of the changed item(s). 
 ' For SHCNE_ATTRIBUTES, neither item is used. See the description of the values 
 ' for the wEventId parameter of the SHChangeNotify API function for more info. 
 Case Else 
 Dim sDisplayname As String 
  
 If shns.dwItem1 Then 
 sDisplayname = GetDisplayNameFromPIDL(shns.dwItem1) 
 If Len(sDisplayname) Then 
 sOut = sOut & "first item displayname: " & sDisplayname & vbCrLf 
 sOut = sOut & "first item path: " & GetPathFromPIDL(shns.dwItem1) & vbCrLf 
 Else 
 sOut = sOut & "first item is invalid" & vbCrLf 
 End If 
 End If 
  
 If shns.dwItem2 Then 
 sDisplayname = GetDisplayNameFromPIDL(shns.dwItem2) 
 If Len(sDisplayname) Then 
 sOut = sOut & "second item displayname: " & sDisplayname & vbCrLf 
 sOut = sOut & "second item path: " & GetPathFromPIDL(shns.dwItem2) & vbCrLf 
 Else 
 sOut = sOut & "second item is invalid" & vbCrLf 
 End If 
 End If 
  
 End Select 
  
 Text1 = Text1 & sOut & vbCrLf 
 Text1.SelStart = Len(Text1) 
 tmrFlashMe = True 
End Sub 
Private Sub tmrFlashMe_Timer() ' initial settings: Interval = 1, Enabled = False 
 Static nCount As Integer 
  
 If nCount = 0 Then tmrFlashMe.Interval = 200 
 nCount = nCount + 1 
 Call FlashWindow(hWnd, True) 
  
 ' Reset everything after 3 flash cycles 
 If nCount = 6 Then 
 nCount = 0 
 tmrFlashMe.Interval = 1 
 tmrFlashMe = False 
 End If 
End Sub  
 
  
 作者: 61.142.212.*  2005-10-28 21:46   回复此发言    
 
--------------------------------------------------------------------------------
 
114 外壳程序的例子  
 Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long 
Private Sub cmdOpen_Click() 
'check that the file in the text box exists 
If Dir(txtFile) = "" Then 
 Call MsgBox("The file in the text box does not exist.", vbExclamation) 
 Exit Sub 
End If 
'open the file with the default program 
Call ShellExecute(hwnd, "Open", txtFile, "", App.Path, 1) 
'Note: This is the equivalent of 
'right clicking on a file in Windows95 
'and selecting "Open" 
' 
'If you would like to do something 
'else to the file rather than opening 
'it, right click on a file and see 
'what options are in the menu. Then 
'change the "Open" in the code above to 
'read what the menu item says. 
' 
'Note: This code is great for opening 
'web document into the default 
'browser. To open http://www.jelsoft.com 
'into the default browser the following 
'code would be used: 
' 
'Call ShellExecute(hwnd,"Open","http://www.jelsoft.com","",app.path,1) 
' 
'For more demos, please visit Jelsoft VB-World at 
'http://www.jelsoft.com 
' 
'If you have a question or a query, please 
'send an email to vbw@jelsoft.com. 
End Sub 
Private Sub cmdWebSite_Click() 
'open up VB-World in the default browser. 
Call ShellExecute(hwnd, "Open", "http://www.jelsoft.com/vbw/", "", App.Path, 1) 
End Sub  
 
  
 作者: 61.142.212.*  2005-10-28 21:47   回复此发言    
 
--------------------------------------------------------------------------------
 
115 用程序终止另一个进程  
 Option Explicit 
Private Sub CmdEndTask_Click() 
 TerminateTask TaskText.Text 
End Sub 
---------- 
Option Explicit 
Declare Function EnumWindows Lib "user32" (ByVal wndenmprc As Long, ByVal lParam As Long) As Long 
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long 
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long 
Public Const WM_CLOSE = &H10 
Private Target As String 
' Check a returned task to see if we should 
' kill it. 
Public Function EnumCallback(ByVal app_hWnd As Long, ByVal param As Long) As Long 
Dim buf As String * 256 
Dim title As String 
Dim length As Long 
 ' Get the window's title. 
 length = GetWindowText(app_hWnd, buf, Len(buf)) 
 title = Left$(buf, length) 
 ' See if this is the target window. 
 If InStr(title, Target) <> 0 Then 
 ' Kill the window. 
 SendMessage app_hWnd, WM_CLOSE, 0, 0 
 End If 
  
 ' Continue searching. 
 EnumCallback = 1 
End Function 
' Ask Windows for the list of tasks. 
Public Sub TerminateTask(app_name As String) 
 Target = app_name 
 EnumWindows AddressOf EnumCallback, 0 
End Sub  
 
  
 作者: 61.142.212.*  2005-10-28 21:49   回复此发言    
 
--------------------------------------------------------------------------------
 
116 一个任务列表和切换程序演示  
 Option Explicit 
'WIN16/32 Directive 
#If Win16 Then 
 Declare Function ShowWindow Lib "User" (ByVal hWnd As Integer, ByVal flgs As Integer) As Integer 
 Declare Function GetWindow Lib "User" (ByVal hWnd As Integer, ByVal wCmd As Integer) As Integer 
 Declare Function GetWindowWord Lib "User" (ByVal hWnd As Integer, ByVal wIndx As Integer) As Integer 
 Declare Function GetWindowLong Lib "User" (ByVal hWnd As Integer, ByVal wIndx As Integer) As Long 
 Declare Function GetWindowText Lib "User" (ByVal hWnd As Integer, ByVal lpSting As String, ByVal nMaxCount As Integer) As Integer 
 Declare Function GetWindowTextLength Lib "User" (ByVal hWnd As Integer) As Integer 
 Declare Function SetWindowPos Lib "User" (ByVal hWnd As Integer, ByVal insaft As Integer, ByVal x%, ByVal y%, ByVal cx%, ByVal cy%, ByVal flgs As Integer) As Integer 
#Else 
 Private Declare Function ShowWindow Lib "User32" (ByVal hWnd As Long, ByVal flgs As Long) As Long 
 Private Declare Function GetWindow Lib "User32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long 
 Private Declare Function GetWindowWord Lib "User32" (ByVal hWnd As Long, ByVal wIndx As Long) As Long 
 Private Declare Function GetWindowLong Lib "User32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal wIndx As Long) As Long 
 Private Declare Function GetWindowText Lib "User32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpSting As String, ByVal nMaxCount As Long) As Long 
 Private Declare Function GetWindowTextLength Lib "User32" Alias "GetWindowTextLengthA" (ByVal hWnd As Long) As Long 
 Private Declare Function SetWindowPos Lib "User32" (ByVal hWnd As Long, ByVal insaft As Long, ByVal x%, ByVal y%, ByVal cx%, ByVal cy%, ByVal flgs As Long) As Long 
#End If 
Const WS_MINIMIZE = &H20000000 ' Style bit 'is minimized' 
Const HWND_TOP = 0 ' Move to top of z-order 
Const SWP_NOSIZE = &H1 ' Do not re-size window 
Const SWP_NOMOVE = &H2 ' Do not reposition window 
Const SWP_SHOWWINDOW = &H40 ' Make window visible/active 
Const GW_HWNDFIRST = 0 ' Get first Window handle 
Const GW_HWNDNEXT = 2 ' Get next window handle 
Const GWL_STYLE = (-16) ' Get Window's style bits 
Const SW_RESTORE = 9 ' Restore window 
Dim IsTask As Long ' Style bits for normal task 
' The following bits will be combined to define properties 
' of a 'normal' task top-level window. Any window with ' these set will be 
' included in the list: 
Const WS_VISIBLE = &H10000000 ' Window is not hidden 
Const WS_BORDER = &H800000 ' Window has a border 
' Other bits that are normally set include: 
Const WS_CLIPSIBLINGS = &H4000000 ' can clip windows 
Const WS_THICKFRAME = &H40000 ' Window has thick border 
Const WS_GROUP = &H20000 ' Window is top of group 
Const WS_TABSTOP = &H10000 ' Window has tabstop 
Sub cmdExit_Click() 
Unload Me ' Get me out of here! 
'Set Me = Nothing ' Kill Form reference for good measure 
End Sub 
Sub cmdRefresh_Click() 
FindAllApps ' Update list of tasks 
End Sub 
 Sub cmdSwitch_Click() 
 Dim hWnd As Long ' handle to window 
 Dim x As Long ' work area 
 Dim lngWW As Long ' Window Style bits 
 If lstApp.ListIndex < 0 Then Beep: Exit Sub 
 ' Get window handle from listbox array 
 hWnd = lstApp.ItemData(lstApp.ListIndex) 
 ' Get style bits for window 
 lngWW = GetWindowLong(hWnd, GWL_STYLE) 
 ' If minimized do a restore 
 If lngWW And WS_MINIMIZE Then 
 x = ShowWindow(hWnd, SW_RESTORE) 
 End If 
 ' Move window to top of z-order/activate; no move/resize 
 x = SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, _ 
 SWP_NOMOVE Or SWP_NOSIZE Or SWP_SHOWWINDOW) 
 End Sub 
Sub FindAllApps() 
Dim hwCurr As Long 
Dim intLen As Long 
Dim strTitle As String 
' process all top-level windows in master window list 
lstApp.Clear 
hwCurr = GetWindow(Me.hWnd, GW_HWNDFIRST) ' get first window 
Do While hwCurr ' repeat for all windows 
 If hwCurr <> Me.hWnd And TaskWindow(hwCurr) Then 
 intLen = GetWindowTextLength(hwCurr) + 1 ' Get length 
 strTitle = Space$(intLen) ' Get caption 
 intLen = GetWindowText(hwCurr, strTitle, intLen) 
 If intLen > 0 Then ' If we have anything, add it 
 lstApp.AddItem strTitle 
' and let's save the window handle in the itemdata array 
 lstApp.ItemData(lstApp.NewIndex) = hwCurr 
 End If 
 End If 
 hwCurr = GetWindow(hwCurr, GW_HWNDNEXT) 
Loop 
End Sub 
Sub Form_Load() 
IsTask = WS_VISIBLE Or WS_BORDER ' Define bits for normal task 
FindAllApps ' Update list 
End Sub 
 Sub Form_Paint() 
 FindAllApps ' Update List 
 End Sub 
Sub Label1_Click() 
FindAllApps ' Update list 
End Sub 
 Sub lstApp_DblClick() 
 cmdSwitch.Value = True 
 End Sub 
Function TaskWindow(hwCurr As Long) As Long 
Dim lngStyle As Long 
lngStyle = GetWindowLong(hwCurr, GWL_STYLE) 
If (lngStyle And IsTask) = IsTask Then TaskWindow = True 
End Function  
 
  
 作者: 61.142.212.*  2005-10-28 21:50   回复此发言    
 
--------------------------------------------------------------------------------
 
117 允许你让EXE文件在用户第一次使用时输入用户名和序列号, 并将信息  
 Private Sub Command1_Click() 
 FiletoImplant$ = SourcePath.Tag + "SICONVRT.EXE" '.EXE file to brand 
 NumChars% = 30 'Maximum # of chars per string 
 NumStrings% = 3 'Number of strings to implant 
  
 For i = 1 To NumStrings% 'Implant the strings 
 ImplantString$ = UserText(i - 1).Text 'User input 
 SearchString$ = String$(NumChars%, 87 + i) 'Start with X 
 Branded% = Implant(FiletoImplant$, ImplantString$, SearchString$, NumChars%) 
 If Branded% <> True Then 
 MsgBox "This copy is already registered to another user.", 48, UserDlg.Caption 
 UserText(0).SetFocus 
 UserText(0).SelStart = 0 
 UserText(0).SelLength = Len(UserText(0).Text) 
 End If 
 Next i 
 outButton.Tag = "continue" 'Move on to next step 
 UserDlg.Hide 
End Sub 
Private Sub Command2_Click() 
 outButton.Tag = "exit" 
 UserDlg.Hide 
End Sub 
Private Function Implant(FiletoImplant As String, ImplantString As String, SearchString As String, NumChars As Integer) As Integer 
'Brands .EXE file with user information. 
'FiletoImplant - .EXE file to be implanted 
'ImplantString - string to be implanted (e.g., user name) 
'SearchString - string in the .EXE file to be replaced by ImplantString 
' (e.g., Const UserName$ = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") 
'NumChars - number of characters in SearchString 
'Function returns TRUE if successful, FALSE if not 
 Const BlockSize = 32768 'size of block read from disk 
 Dim FileData As String 'string to hold block read from disk 
 Dim NumBlocks As Integer 'number of complete blocks in .EXE file 
 Dim LeftOver As Integer 'amount left in partial block 
 Dim FileLength As Long 'length of .EXE file 
 Dim BlockPosn As Integer 'block number to be checked 
  
 Open FiletoImplant For Binary As #1 
 FileLength = LOF(1) 
 NumBlocks = FileLength \ BlockSize 
 LeftOver = FileLength Mod BlockSize 
 FileData = String$(BlockSize, 32) 
 BlockPosn = 0 
  
 For Index = 1 To NumBlocks 'search the .EXE file for special 
 Get #1, , FileData 'string and record location 
 Posn& = InStr(FileData, SearchString) 
 If Posn& > 0 Then 'found it! 
 BlockPosn = Index 
 Seek 1, Posn& + ((BlockPosn - 1) * BlockSize) 
 Exit For 
 End If 
 Next Index 
  
 If BlockPosn = 0 Then 'didn't find it in regular blocks 
 FileData = "" 'so look in leftovers 
 FileData = String$(LeftOver, 32) 
 Get #1, , FileData 
 Posn& = InStr(FileData, SearchString) 
 If Posn& = 0 Then 'string still not found 
 Close #1 
 Implant = False 'exit function, return FALSE 
 Exit Function 
 End If 
 Seek 1, Posn& 'found it in leftovers! 
 End If 
 temp$ = Space$(NumChars) 'temp space for user info 
 LSet temp$ = ImplantString 
 Put #1, , temp$ 'brand the .EXE file with user info 
 Close #1 'close file if all strings implanted 
 Implant = True 'end the function 
End Function  
 
  
 作者: 61.142.212.*  2005-10-28 21:51   回复此发言    
 
--------------------------------------------------------------------------------
 
118 取得运行另一个程序并抓取文本  
 Option Explicit 
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long 
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount 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 
Private Const WM_GETTEXT = &HD 
Private Const WM_GETTEXTLENGTH = &HE 
Private Const GW_CHILD = 5 
Private Const GW_HWNDNEXT = 2 
Private Const GW_HWNDFIRST = 0 
' *********************************************** 
' Return information about this window and its 
' children. 
' *********************************************** 
Public Function WindowInfo(window_hwnd As Long) 
Dim txt As String 
Dim buf As String 
Dim buflen As Long 
Dim child_hwnd As Long 
Dim children() As Long 
Dim num_children As Integer 
Dim i As Integer 
 ' Get the class name. 
 buflen = 256 
 buf = Space$(buflen - 1) 
 buflen = GetClassName(window_hwnd, buf, buflen) 
 buf = Left$(buf, buflen) 
 txt = "Class: " & buf & vbCrLf 
 ' hWnd. 
 txt = txt & " hWnd: " & _ 
 Format$(window_hwnd) & vbCrLf 
  
 ' Associated text. 
 txt = txt & " Text: [" & _ 
 WindowText(window_hwnd) & "]" & vbCrLf 
 ' Make a list of the child windows. 
 num_children = 0 
 child_hwnd = GetWindow(window_hwnd, GW_CHILD) 
 Do While child_hwnd <> 0 
 num_children = num_children + 1 
 ReDim Preserve children(1 To num_children) 
 children(num_children) = child_hwnd 
  
 child_hwnd = GetWindow(child_hwnd, GW_HWNDNEXT) 
 Loop 
  
 ' Get information on the child windows. 
 For i = 1 To num_children 
 txt = txt & WindowInfo(children(i)) 
 Next i 
 WindowInfo = txt 
End Function 
' ************************************************ 
' Return the text associated with the window. 
' ************************************************ 
Public Function WindowText(window_hwnd As Long) As String 
Dim txtlen As Long 
Dim txt As String 
 WindowText = "" 
 If window_hwnd = 0 Then Exit Function 
  
 txtlen = SendMessage(window_hwnd, WM_GETTEXTLENGTH, 0, 0) 
 If txtlen = 0 Then Exit Function 
  
 txtlen = txtlen + 1 
 txt = Space$(txtlen) 
 txtlen = SendMessage(window_hwnd, WM_GETTEXT, txtlen, ByVal txt) 
 WindowText = Left$(txt, txtlen) 
End Function 
Private Sub CmdFindText_Click() 
Dim app_name As String 
Dim parent_hwnd As Long 
 app_name = AppText.Text 
 parent_hwnd = FindWindow(vbNullString, app_name) 
 If parent_hwnd = 0 Then 
 MsgBox "Application not found." 
 Exit Sub 
 End If 
 ResultsText.Text = app_name & vbCrLf & _ 
 vbCrLf & WindowInfo(parent_hwnd) 
End Sub 
Private Sub Form_Resize() 
Dim wid As Single 
Dim hgt As Single 
Dim t As Single 
 wid = ScaleWidth 
 t = CmdFindText.Top + CmdFindText.Height 
 hgt = ScaleHeight - t 
 ResultsText.Move 0, t, wid, hgt 
End Sub  
 
  
 作者: 61.142.212.*  2005-10-28 21:52   回复此发言    
 
--------------------------------------------------------------------------------
 
119 Shell等待的示例  
 Option Explicit 
' ShellWat sample by Matt Hart - mhart@taascforce.com 
' http://www.webczar.com/defcon/mh/vbhelp.html 
' http://www.webczar.com/defcon/mh 
' 
' Shows how to shell to another program, and wait until it finishes 
' before continuing. 
Private Declare Function WaitForSingleObject Lib "kernel32" _ 
 (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long 
Private Declare Function CloseHandle Lib "kernel32" _ 
 (ByVal hObject As Long) As Long 
  
Private Declare Function OpenProcess Lib "kernel32" _ 
 (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _ 
 ByVal dwProcessId As Long) As Long 
Private Const INFINITE = -1& 
Private Const SYNCHRONIZE = &H100000 
Private Sub Command1_Click() 
 Dim iTask As Long, ret As Long, pHandle As Long 
 iTask = Shell("notepad.exe", vbNormalFocus) 
 pHandle = OpenProcess(SYNCHRONIZE, False, iTask) 
 ret = WaitForSingleObject(pHandle, INFINITE) 
 ret = CloseHandle(pHandle) 
 MsgBox "Process Finished!" 
End Sub  
 
  
 作者: 61.142.212.*  2005-10-28 21:53   回复此发言    
 
--------------------------------------------------------------------------------
 
120 恋爱专家 - 主要体现在背景音乐的播放和资源文件中声音的播放以及  
 Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" _ 
 (lpszSoundName As Any, ByVal uFlags As Long) As Long 
  
 Const SND_ASYNC = &H1 
 Const SND_NODEFAULT = &H2 
 'Const SND_LOOP = &H8 
 Const SND_MEMORY = &H4 
 'Const SND_NOSTOP = &H10 
Dim SoundBuffer() As Byte 
'Dim BackSound() As Byte 
Dim wFlags As Long 
Dim Increase As Long 
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As Any, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long 
Private Sub About1_Click() 
Beep 
frmAbout.Show 1 
End Sub 
Private Sub Command1_Click() 
If List1.Selected(0) Then 
 If Text2.Text = "" Or Text3.Text = "" Or Text4(0).Text = "" Or Text4(1).Text = "" Or Text4(2).Text = "" Or Text4(3).Text = "" Then 
 MsgBox "不要这么心急!还没添完", vbOKOnly, "错误" 
 Exit Sub 
 End If 
 Text1.Locked = False 
 Text1.Text = "Dear " + Text3.Text + Chr(13) + Chr(10) + "我的宝贝,你可知道," + Chr(13) + Chr(10) + _ 
 "我是多么的爱你?" + Chr(13) + Chr(10) + _ 
 "你那" + Text4(0).Text + "的头发,它是那样的令人陶醉," + Chr(13) + Chr(10) + _ 
 "更不用说你那对" + Text4(1).Text + "的眼睛," + Chr(13) + Chr(10) + _ 
 "它让我如此的痴迷, _" + Chr(13) + Chr(10) + _ 
 "就好象一汪秋水频频荡漾,又似夜晚的繁星点点闪亮。" + Chr(13) + Chr(10) + _ 
 "但最令我疯狂的,还是你那" + Text4(2).Text + "," + Chr(13) + Chr(10) + _ 
 "它总是充满了诱惑,让我产生犯罪的念头," + Chr(13) + Chr(10) + _ 
 "每当我有意或无意间轻触到它的时候,我的全身便燃起了熊熊烈火。" + Chr(13) + Chr(10) + _ 
 "请饶恕我的口不择言,我是如此疯狂地爱着你。" + Chr(13) + Chr(10) + _ 
 "如果你认为我仅仅是爱你的外表,那么你错了," + Chr(13) + Chr(10) + _ 
 "你是如此的" + Text4(3).Text + "," + Chr(13) + Chr(10) + _ 
 "这些才是我爱你的真正原因?" + Chr(13) + Chr(10) + _ 
 "啊,我的宝贝,救救我这颗已被神箭射穿的心灵吧!" + Chr(13) + Chr(10) + _ 
 "让我们珍惜这份情缘," + Chr(13) + Chr(10) + _ 
 "携起手来," + Chr(13) + Chr(10) + _ 
 "一起走向永远,永远......" + Chr(13) + Chr(10) + _ 
 " 爱你的: " + _ 
 Text2.Text 
 Command3.Enabled = True 
 Save.Enabled = True 
 Exit Sub 
End If 
If List1.Selected(1) Then 
 If Text2.Text = "" Or Text3.Text = "" Or Text5(0).Text = "" Or Text5(1).Text = "" Or Text5(2).Text = "" Then 
 MsgBox "不要这么心急!还没添完", vbOKOnly, "错误" 
 Exit Sub 
 End If 
 Text1.Locked = False 
 Text1.Text = "亲爱的" + Text3.Text + Chr(13) + Chr(10) + "你仿佛有一种魔力," + Chr(13) + Chr(10) + "使我每次见到你都会感到自己的心在狂跳不止," + Chr(13) + Chr(10) + "我知道你根本没有意识到我的存在," + Chr(13) + Chr(10) + "但你的容颜," + Chr(13) + Chr(10) + "已在我逐渐变冷的心中点燃了熊熊烈火," + Chr(13) + Chr(10) + "好几次我想鼓起勇气想你表明心中的感受," + Chr(13) + Chr(10) + "区被你那一双" + Text5(0).Text + "眼睛压了回去," + Chr(13) + Chr(10) + "我是如此的害怕看你的双眼," + Chr(13) + Chr(10) + "只好把话留在心里?" + Chr(13) + Chr(10) + "我努力的强迫自己不去想你," + Chr(13) + Chr(10) + "不要打扰你平静的生活," + Chr(13) + Chr(10) + "尽管如此,当我闭上双眼," + Chr(13) + Chr(10) + "你的身影又浮现在我的眼前?" + Chr(13) + Chr(10) + "我挥手让他散去," + Chr(13) + Chr(10) + "他却纹丝不动," + Chr(13) + Chr(10) + "我终于明白," + Chr(13) + Chr(10) + _ 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:55   回复此发言    
 
--------------------------------------------------------------------------------
 
121 恋爱专家 - 主要体现在背景音乐的播放和资源文件中声音的播放以及  
  "你对于我来说不只是一阵过眼云烟," + Chr(13) + Chr(10) + _ 
 "而是深深的印在了我的每一个角落?" + Chr(13) + Chr(10) + _ 
 "在我的心中,有一件为你敞开们的小屋," + Chr(13) + Chr(10) + _ 
 "它的名字叫'爱' ," + Chr(13) + Chr(10) + _ 
 "我始终把他藏在那最温暖的角落," + Chr(13) + Chr(10) + _ 
 "等待着你能住在里面我期望有一天," + Chr(13) + Chr(10) + _ 
 "你也能把你的心扉向我敞开," + Chr(13) + Chr(10) + _ 
 "不要让我的梦想一个美丽的泡泡一样破灭," + Chr(13) + Chr(10) + "美丽的东西都是应该" + Text5(1).Text + ",对吗?" + Chr(13) + Chr(10) + "让我的梦想变成现实吧!" + Chr(13) + Chr(10) + "不要让他在折磨我," + Chr(13) + Chr(10) + "我会付出我的一切,关心你,爱护你," + Chr(13) + Chr(10) + "让你这朵美丽的花朵," + Text5(2) + Chr(13) + Chr(10) + "哪怕是有狂风暴雨,," + Chr(13) + Chr(10) + "我的温暖都会在你身边!," + Chr(13) + Chr(10) + " 爱你的:" + Text2.Text 
 Command3.Enabled = True 
 Save.Enabled = True 
 Exit Sub 
End If 
If List1.Selected(2) Then 
 If Text2.Text = "" Or Text3.Text = "" Or Text6(0).Text = "" Or Text6(1).Text = "" Or Text6(2).Text = "" Or Text6(3).Text = "" Then 
 MsgBox "不要这么心急!还没添完", vbOKOnly, "错误" 
 Exit Sub 
 End If 
 Text1.Locked = False 
 Text1.Text = "亲爱的" + Text3.Text + Chr(13) + Chr(10) + "我的身体里有一百座的核子反应炉" + Chr(13) + Chr(10) + "只要一想到你就像" + Text6(0).Text + "般" + Chr(13) + Chr(10) + "心形的眼珠即时著了火 '泡'你是我今晚的任务" + Chr(13) + Chr(10) + "围绕围绕著你跑了360个400米 我是个真爱的超人 你是地球" + Chr(13) + Chr(10) + "我是我是我是苍蝇你是果冻 完美地跌倒最重要 我为你俯冲" + Chr(13) + Chr(10) + "荷尔蒙是威力最大的爆炸 把你的理智我的害羞都冲垮" + Chr(13) + Chr(10) + "可不可以靠近过来说说爱 要知道冷漠是最没礼貌的落後态度" + Chr(13) + Chr(10) + "让我让我对你发射我最强烈的温柔 烧烧的痞子电磁波" + Chr(13) + Chr(10) + "恋爱是青春嘴里的一颗糖 我来替你剥开外面的包装" + Chr(13) + Chr(10) + "抱著我如果你尴尬很紧张 我用最美的Pose带你到" + Text6(1).Text + Chr(13) + Chr(10) + "噢!让我让我对你发射我最强烈的温柔 喔!烧烧的痞子电磁波" + Chr(13) + Chr(10) + "啊!发呆是最危险的自虐狂 寂寞是最邪恶的地狱谷耶!" + Chr(13) + Chr(10) + "让我们离开无 聊聊的" + Text6(2).Text + _ 
 "飞到电影院看《" + Text6(3) + "》!" + Chr(13) + Chr(10) + "让我让我对你发射我最强烈的温柔 烧烧的痞子电磁波" + Chr(13) + Chr(10) + _ 
 "呵呵呵!呵呵呵!呵呵呵呵呵!" + Chr(13) + Chr(10) + _ 
 " 爱你的:" + Text2.Text 
 Command3.Enabled = True 
 Save.Enabled = True 
 Exit Sub 
End If 
 
If List1.Selected(3) Then 
 If Text2.Text = "" Or Text3.Text = "" Or Text7(0).Text = "" Or Text7(1).Text = "" Or Text7(2).Text = "" Or Text7(3).Text = "" Or Text7(4).Text = "" Or Text7(5).Text = "" Or Text7(6).Text = "" Or Text7(7).Text = "" Or Text7(8).Text = "" Then 
 MsgBox "不要这么心急!还没添完", vbOKOnly, "错误" 
 Exit Sub 
 End If 
 Text1.Locked = False 
 Text1.Text = "亲爱的" + Text3.Text + Chr(13) + Chr(10) + "我们的感情,在十一届三中全会以来党的一系列正确方针政策的指引下在党的亲切关怀下,在领导的亲自过问下," + Text7(0).Text + "年来正沿着健康的道路蓬勃发展,这主要表现在:" + Chr(13) + Chr(10) + "一、我们共通话" + Text7(1).Text + _ 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:55   回复此发言    
 
--------------------------------------------------------------------------------
 
122 恋爱专家 - 主要体现在背景音乐的播放和资源文件中声音的播放以及  
  "次。平均每" + Str(Val(Text7(0).Text) / Val(Text7(1).Text)) + "天一次。其中,我给你打了" + Text7(2).Text + "次,占" + Format(Val(Text7(2).Text) / Val(Text7(1).Text), "0%") + ";你给我打了" + Str(Val(Text7(1).Text) - Val(Text7(2).Text)) + "次,占" + Format(1 - Val(Text7(2).Text) / Val(Text7(1).Text), "0%") + ";每次通话最长的达" + Text7(3).Text + "分钟,最短的也有" + Text7(4).Text + "分钟......" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
 "二、我们约会共" + Text7(5).Text + "次,平均每" + Str(Val(Text7(0).Text) / Val(Text7(5).Text)) + "天一次。其中我主动约你" + Text7(6).Text + "次,占" + Format(Val(Text7(6).Text) / Val(Text7(5).Text), "0%") + ";你约我" + Str(Val(Text7(5).Text) - Val(Text7(6).Text)) + "次,占" + Format(1 - Val(Text7(6).Text) / Val(Text7(5).Text), "0%") + " ;每次约会最长的达" + Text7(7).Text + "小时,最短的也有" + Text7(8).Text + "小时......" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
 "以上充分证明了一年的交往我们已形成了爱情的共识,我们爱情的主流是互相了解、互相关心、互相帮助,是平等互利的。" + Chr(13) + Chr(10) + "当做任何事物都是一分为二的,缺点的存在是不可避免的," + Chr(13) + Chr(10) + "我们两人虽然都是积极的,但是从以上的数据发展还不太平衡,积极性还存在一定的差距,这是前进中的缺点。" + Chr(10) + Chr(13) + "我相信在新的一年里,我们一定回发扬成绩,克服缺点,再接再厉,携手前进,开创我们爱情的新局面......" + Chr(13) + Chr(10) + _ 
 "因此,我提出三点意见供你参考:" + Chr(13) + Chr(10) + _ 
 "一是要围绕一个'爱'字......" + Chr(13) + Chr(10) + _ 
 "二是要狠抓一个'亲'字......" + Chr(13) + Chr(10) + _ 
 "三是要落实一个'合'字......" + Chr(13) + Chr(10) + _ 
 "让我们宏扬团结拼搏坚韧不拔的精神,共同振兴我们的爱情,争取我们的爱情达到一个新的高度,登上一个新台阶。" + Chr(13) + Chr(10) + "本着'我们的婚事我们办,办好婚事为我们'的精神共创辉煌。" + Chr(13) + Chr(10) + _ 
 " 爱你的:" + Text2.Text 
  
 Command3.Enabled = True 
 Save.Enabled = True 
 Exit Sub 
End If 
 
End Sub 
Private Sub Command2_Click() 
Text1.Text = "" 
Text1.Locked = True 
If List1.Selected(0) Then 
 For i = 0 To 3 
 Text4(i).Text = "" 
 Next i 
End If 
If List1.Selected(1) Then 
 For i = 0 To 2 
 Text5(i).Text = "" 
 Next i 
End If 
If List1.Selected(2) Then 
 For i = 0 To 3 
 Text6(i).Text = "" 
 Next i 
End If 
If List1.Selected(3) Then 
 For i = 0 To 8 
 Text7(i).Text = "" 
 Next i 
End If 
Command3.Enabled = False 
Save.Enabled = False 
End Sub 
Private Sub Command3_Click() 
On Error Resume Next 
filehandle = FreeFile 
'CommonDialog1.Filter = "Text Files|*.txt|All Files (*.*)|*.*" 
'CommonDialog1.ShowSave 
'If CommonDialog1.FileName <> "" Then 
' Open CommonDialog1.FileName For Output As #filehandle 
' Print #filehandle, Text1.Text 
' Close #filehandle 
'End If 
'Exit Sub 
'Err: 
 'MsgBox "因为控件没有发现,所以文件保存为在程序同路径下 LoveExpert.txt文件", vbOKOnly, "抱歉!" 
 MsgBox "文件保存为在程序同路径下 LoveExpert.txt文件", vbOKOnly, "文件保存结果!" 
 Open App.Path + "\LoveExpert.txt" For Append As #filehandle 
 Print #filehandle, Text1.Text 
 Close #filehandle 
End Sub 
Private Sub Exit_Click() 
Unload Me 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:55   回复此发言    
 
--------------------------------------------------------------------------------
 
123 恋爱专家 - 主要体现在背景音乐的播放和资源文件中声音的播放以及  
 End Sub 
Private Sub Form_Load() 
On Error Resume Next 
If App.PrevInstance = True Then 
 Beep 
 End 
End If 
Form1.Visible = True 
SoundBuffer = LoadResData(101, "CUSTOM") 
wFlags = SND_ASYNC Or SND_NODEFAULT Or SND_MEMORY 'Or SND_NOSTOP 
'BackSound = LoadResData(102, "CUSTOM") 
mciSendString "close MyWav", vbNullString, 0, 0 
mciSendString "open " & App.Path & "\why.mid alias MyWav", vbNullString, 0, 0 
mciSendString "play MyWav FROM 0", vbNullString, 0, 0 
i = Month(Date) 
Select Case i 
 Case 1 
 Label2.Caption = "一月" 
 Label4.Caption = "水仙花" 
 Label6.Caption = "尊敬" 
 Case 2 
 Label2.Caption = "二月" 
 Label4.Caption = "紫罗兰" 
 Label6.Caption = "诚实,谦让" 
 Case 3 
 Label2.Caption = "三月" 
 Label4.Caption = "郁金香" 
 Label6.Caption = "爱的倾诉" 
 Case 4 
 Label2.Caption = "四月" 
 Label4.Caption = "康乃馨" 
 Label6.Caption = "纯粹的爱情" 
 Case 5 
 Label2.Caption = "五月" 
 Label4.Caption = "蔷薇" 
 Label6.Caption = "美、爱,恋情" 
 Case 6 
 Label2.Caption = "六月" 
 Label4.Caption = "杷子" 
 Label6.Caption = "我的幸福" 
 Case 7 
 Label2.Caption = "七月" 
 Label4.Caption = "剑兰" 
 Label6.Caption = "谨慎,坚固" 
 Case 8 
 Label2.Caption = "八月" 
 Label4.Caption = "大莉花" 
 Label6.Caption = "华丽" 
 Case 9 
 Label2.Caption = "九月" 
 Label4.Caption = "龙胆花" 
 Label6.Caption = "在你伤心时我尤其爱你" 
 Case 10 
 Label2.Caption = "十月" 
 Label4.Caption = "大波斯菊" 
 Label6.Caption = "少女的纯洁与爱情" 
 Case 11 
 Label2.Caption = "十一月" 
 Label4.Caption = "菊花" 
 Label6.Caption = "高尚,清高" 
 Case 12 
 Label2.Caption = "十二月" 
 Label4.Caption = "卡特丽亚" 
 Label6.Caption = "美人" 
End Select 
List1.AddItem "传统型" 
List1.AddItem "无敌型" 
List1.AddItem "思春型" 
List1.AddItem "革命数码型" 
List1.Selected(0) = True 
Frame7.ForeColor = &HFF& 
End Sub 
Private Sub Form_Unload(Cancel As Integer) 
On Error Resume Next 
mciSendString "close MyWav", vbNullString, 0, 0 
frmAbout.Show 
End Sub 
Private Sub Knoledge1_Click() 
Call Label8_Click 
Frame7.Visible = True 
Frame7.Caption = "情人节的由来" 
Text8.Text = " 情人节的来历" + Chr(13) + Chr(10) + _ 
 " 中国人现在用近乎狂热的热情过起了圣诞节一样,情人节也已经悄悄渗透到了无数年轻人的心目当中,成为中国传统节日之外的又一个重要节日。情人节的来历和意义可能并不一定为大多数人所知。下面所要介绍的,不过是众多关于情人节的传说中的一个。" + Chr(13) + Chr(10) + " 在古罗马时期,二月十四日是为表示对约娜的尊敬而设的节日。约娜是罗马众神的皇后,罗马人同时将她尊奉为妇女和婚姻之神。接下来的二月十五日则被称为“卢帕撒拉节”,是用来对约娜治下的其他众神表示尊敬的节日。" + Chr(13) + Chr(10) + " 在古罗马,年轻人和少女的生活是被严格分开的。然而,在卢帕撒拉节,小伙子们可以选择一个自己心爱的姑娘的名字刻在花瓶上。这样,过节的时候,小伙子就可以与自己选择的姑娘一起跳舞,庆祝节日。如果被选中的姑娘也对小伙子有意的话,他们便可一直配对,而且最终他们会坠入爱河并一起步入教堂结婚。后人为此而将每年的二月十四日定为情人节。" + Chr(13) + Chr(10) + _ 
 " 在西方,情人节不但是表达情意的最佳时刻,也是向自己心爱的人求婚的最佳时刻。在这一点上,情人节体现出的,不正是古罗马人设计这个节日的本意吗?  公元三世纪时,古罗马有一位暴君叫 克劳多斯(Claudius)。离暴君的宫殿不远,有一座非常漂亮的神庙。修士瓦沦丁(Valentine)   就住在这里。罗马人非常崇敬他,男女老幼,不论贫富贵贱,总会群集在他的周围,在祭坛的熊熊圣火前,聆听瓦沦丁的祈祷。" + Chr(13) + Chr(10) + "古罗马的战事一直连绵不断,暴君克劳多斯征召了大批公民前往战场,人们怨声载道。男人们不愿意离开家庭,小伙子们不忍与情人分开。克劳多斯暴跳如雷,他传令人们不许举行婚礼,甚至连所有已订了婚的也马上要解除婚约。许多年轻人就这样告别爱人,悲愤地走向战场。年轻的姑娘们也由于失去爱侣,抑郁神伤。   瓦沦丁对暴君的虐行感到非常难过。当一对情侣来到神庙请求他的帮助时,瓦沦帝尼在神圣的祭坛前为它们悄悄地举行了婚礼。人们一传十,十传百,很多人来到这里,在瓦沦丁的帮助下结成伴侣。" + Chr(13) + Chr(10) + _ 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:55   回复此发言    
 
--------------------------------------------------------------------------------
 
124 恋爱专家 - 主要体现在背景音乐的播放和资源文件中声音的播放以及  
  " 消息终于传进了宫殿,传到了暴君的耳里。克劳多斯又一次暴跳如雷,他命令士兵们冲进神庙,将瓦沦丁从一对正在举行婚礼的新人身旁拖走,投入地牢。人们苦苦哀求暴君的劾免,但都徒劳而返。瓦沦丁终于在地牢里受尽折磨而死。悲伤的朋友们将他安葬于圣普拉 教堂。那一天是2月14日,那一年是公元270年。   另外的版本似乎没有这一个精彩。传说中瓦沦丁是最早的基督徒之一,那个时代做一名基督徒意味着危险和死亡。为掩护其他殉教者,瓦沦丁被抓住,投入了监牢。在那里他治愈了典狱长女儿失明的双眼。当暴君听到着一奇迹时,他感到非常害怕,于是将瓦沦丁斩首示众。据传说,在行刑的那一天早晨,瓦沦丁给典狱长的女儿写了一封情意绵绵的告别信,落款是:From your Valentine (寄自你的瓦沦丁)   历史学家们更愿意刨根揪底,他们关于情人节的演绎似乎令人信服。其实远远早于公元270年,当罗马城刚刚奠基时,周围还是一片荒野,成群的狼四处游荡。在罗马人崇拜的众神中,畜牧神卢波库斯(Lupercus)掌管着对牧羊人和羊群的保护。每年二月中,罗马人会举行盛大的典礼来庆祝牧神节。那时的日历与现在相比,要稍微晚一些,所以牧神节实际上是对即将来临的春天的庆祝。" + Chr(13) + Chr(10) + _ 
 " 也有人说这个节日是庆祝 法乌努斯" + Chr(13) + Chr(10) + _ 
 " 神(Faunus),它类似于古希腊人身羊足,头上有角的潘神( Pan ),主管畜牧和农业。   牧神节的起源实在是过于久远了,连公元前一世纪的学者们都无法确认。但是这一节日的重要性是不容置疑的。   例如史料记载,安东尼(Mark Antony)就是在公元前44年的牧神节上将王冠授与凯撒(Julius Caesar)的。" + Chr(13) + Chr(10) + "每年的二月十五日,修士们会聚集在罗马城中巴沦丁Palantine)山上的一个洞穴旁,据说在这里,古罗马城的奠基者 (Romilus andRemus)被一只母狼扶育长大。在节日的各项庆典中,有一项是年轻的贵族们,手持羊皮鞭,在街道上奔跑。年轻妇女们会聚集在街道两旁,祈望羊皮鞭抽打到她们头上。人们相信这样会使她们更容易生儿育女。在拉丁语中,羊皮鞭被叫做 februa,鞭打叫做 fabruatio, 实际上都含有'纯洁'的意思。二月的名字(February)就是由此而来。" + Chr(13) + Chr(10) + _ 
 " 随着罗马势力在欧洲的扩张,牧神节的习俗被带到了现在的法国和英国等地。人们最乐此不疲的一项节日活动类似于摸彩。年轻女子们的名字被放置于盒子内,然后年轻男子上前抽取。抽中的一对男女成为情人,时间是一年或更长。   基督教的兴起使人们纪念众神的习俗逐渐淡漠。教士们不希望人们放弃节日的欢乐,于是将牧神节(Lupercalia)改成瓦沦丁节( Valentine's Day),并移至二月十四日。这样,关于瓦沦丁修士的传说和古老的节日就被自然地结合在一起。这一节日在中世纪的英国最为流行。未婚男女的名字被抽出后,他们会互相交换礼物,女子在这一年内成为男子的Valentine。   在男子的衣袖上会绣上女子的名字,照顾和保护该女子于是成为该男子的神圣职责。" + Chr(13) + Chr(10) + _ 
 " 有史可查的现代意义上的瓦沦丁情人是在十五世纪早期。法国年轻的奥尔良大公在阿根科特(Agincourt)战役中被英军俘虏,然后被关在伦敦塔中很多年。他写给妻子很多首情诗,大约60首保存至今。用鲜花做瓦沦丁节的信物在大约两百年后出现。法王亨利四世(Henry IV)的一个女儿在瓦沦丁节举行了一个盛大的晚会。所有女士从选中她做Valentine的男士那里获得一束鲜花。   就这样,延续着古老的意大利,法国和英国习俗,我们得以在每年的二月十四日向自己的朋友传递爱的信息。鲜花,心形糖果,用花边和摺穗掩盖了送物人名字的信物,不仅仅是代表着一份份真挚的爱,更是对敢于反抗暴政的瓦沦丁修士的最好缅怀。" 
End Sub 
Private Sub Knoledge2_Click() 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:55   回复此发言    
 
--------------------------------------------------------------------------------
 
125 恋爱专家 - 主要体现在背景音乐的播放和资源文件中声音的播放以及  
 Call Label8_Click 
Frame7.Visible = True 
Frame7.Caption = "巧克力爱情物语" 
Text8.Text = " 巧克力爱情物语" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
 " 正如花有花语,巧克力也有自己的爱情物语,送不同的巧克力表示不同的意义,不妨仔细看看:" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
 " 牛奶巧克力 表示你觉得对方很纯品,很乖巧,是个可爱的小精灵。" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
 " 黑巧克力 表示你觉得对方有个性,很神秘,深不可测。" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
 " 白巧克力 表示你觉得对方超凡脱俗,不食人间烟火。" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
 " 果仁巧克力 表示你觉得与对方一起很温馨,很想随时陪伴左右。" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
 " 心型巧克力 表示“我心属于你”。" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
 " 卡通巧克力 表示你很欣赏对方的天真烂漫?" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
 " 带玩具的巧克力 表示你与对方的关系正介于情人和朋友之间?" 
  
End Sub 
Private Sub Knoledge3_Click() 
Call Label8_Click 
Frame7.Visible = True 
Frame7.Caption = "送花的数目含义" 
Text8.Text = " 送花的数目含义 " + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
 "1 朵 唯一的爱" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
 "2 朵 你侬我侬" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
 "3 朵 我爱你" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
"4 朵 誓言与承诺" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
"5 朵 无悔" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "6 朵 顺利" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "7 朵 喜相逢" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "8 朵 弥补" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
"9 朵 长相守" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "10 朵 完美的你(你)" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
"11 朵 一心一意;最美" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "12 朵 比翼双飞" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
"13 朵 暗恋" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "17 朵 好聚好散" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
"20 朵 两情相悦" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "21 朵 最爱" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
"22 朵 双双对对" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "24 朵 无时无刻想著你" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
"33 朵 我爱你;三生三世" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "36 朵 我心属於你" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
"44 朵 至死不渝" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "50 朵 无悔的爱" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
"56 朵 吾爱" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "57 朵 吾爱吾妻" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
"66 朵 细水长流" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "77 朵 求婚" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
"88 朵 用心弥补" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "99 朵 天长地久" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
"100 朵 白头偕老;爱你一万年" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "101 朵 直到永远" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "108 朵 无尽的爱 " + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "144 朵 爱你生生世世" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:55   回复此发言    
 
--------------------------------------------------------------------------------
 
126 恋爱专家 - 主要体现在背景音乐的播放和资源文件中声音的播放以及  
 "365 朵 天天想你 " + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "999 朵 天长地久" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
"1001 朵 直到永远 " 
End Sub 
 
Private Sub Knoledge5_Click() 
Call Label8_Click 
Frame7.Visible = True 
Frame7.Caption = "花代表的心思" 
Text8.Text = " 花 语" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
"三色篓:思慕、想念我 雏 菊:愉快、纤细、幸福 矢车菊:幸福" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "福禄考:一致同意 瓜叶菊:快活 矮牵牛:(白)存在、(紫)情" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "蕾香蓟: 相信得到答覆 花菱草: 不要拒绝我 美人樱: 诱惑" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "勿忘草:永志勿望 霞 草:(红)期待的喜悦 六佬刎:可怜、同情" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "报春花:初恋、希望 鼠尾草:(白)精力充沛(红)心在燃烧、(紫)智慧" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "松叶菊: 情息 天竺葵: 诈欺?不实 西番莲: 圣爱" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "曼陀罗:诈情、骗受 滨 蓟:孤独 海石竹:体谅、贴心" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "香 蒌: 贞淑?芍 药: 善羞?愤怒 福寿草: 回想 君子兰: 高贵" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "华 草: 服从 非洲菊: 神秘 金莲花: 不稳定?心绪不宁" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "郁金香:爱的表现" + _ 
"鸢 尾: 使者?爱的传达 风信子: 游戏?内心的喜悦 " + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "白头翁:(白)真实、(红)恋爱、(黄)绝交、(紫)信澄 小苍兰:纯洁" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "娄斗菜:(白)愚钝、(红)挂虑、(紫)胜利 德国鸢尾:神圣" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "孤挺花:多话、多嘴 百 合:尊敬、纯洁 陆莲花:迷人的魅力" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "高雪轮: 骗子 风铃草: 诚信 虞美人: 抚慰" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "翟 麦: 野心 根节兰: 长寿 康乃馨: 伤心" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "黑种草:清新的爱 海 棠:善感 松虫草:追念" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "蝴蝶花:反抗 荷 花:君子 黑百合:诅咒" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "扶 桑:热情 牵牛花:稍纵即逝 石 蒜:冷清、孤独" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "木 莲: 高尚 毛地黄: 晃言 加得利亚兰: 神秘?高贵" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "石 榴:风饶 亚 麻:优美朴实 野蔷薇:自由" + _ 
"旋 花:恩赐 忍 冬:背弃 茴 香:思念" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "熏衣草:清雅、女人味 柳穿鱼:纤细 卷 耳:快乐" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "橙 花:爱慕 海 芋:纯洁 莲 翘:别碰我" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "梨 花:纯情 罂 粟:华丽、高贵 桃 花:爱慕" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "凤尾眷:思念 杏 花:拜访我 铁线莲:雅致" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "秋水仙: 遗忘 酢酱草: 我不会放弃您?欢悦 燕子花: 幸运到来" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "紫 藤:热恋、欢迎 社鹃花:爱的快乐、节制 茶 花:(红)谦逊、美德、可爱" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "金省花: 谦逊?卑下 隶棠花: 高洁 山东窗: 待续?耐久" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "金鱼草:傲慢 雪 柳:殊胜 金缕梅:咒文、灵感" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "紫丁香:(紫)初恋的感激(红)爱苗滋生、纯真 桔梗花:柔情、嫉妒" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:55   回复此发言    
 
--------------------------------------------------------------------------------
 
127 恋爱专家 - 主要体现在背景音乐的播放和资源文件中声音的播放以及  
 "百日草: 思念亡友 香石竹: 热心 万寿菊: 自卑" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "鸡冠花:不死 飞燕草:正义、自由 茑 萝:好管闲事" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "千日红: 不朽?不灭 凤仙花: 纪念 彩叶苋: 绝恋" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "金鸡菊:竞争心 麦杆菊:永久不变 蜀 葵:热恋、单纯" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "红 花: 差别?区别 金针花: 宣告?妩媚 玻璃菊: 闺女?追想" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "蓬莴菊:占有恋人,真实的爱 千屈菜:悲哀 大岩洞:绝望。" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "球根海棠:亲切、单相思 火炬花:思念之苦 鹿 葱:肉体的快乐" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "铃 兰:幸福 纯洁、纤细、处女的骄做 萍蓬草:崇高" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "百于莲:恋爱的造访、恋爱的通讯 睡 莲:淡泊 姜 兰:无聊" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "溪 荪: 愤慨 玉蝉花: 爱的音讯 洋玉兰: 自然的爱?威严" + _ 
"八仙花:自私 紫 薇:雄辩 桅子花:闲雅、清静、幸福者" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "夹竹桃:(桃)咒骂、 竹 :志节、节操 榆 :尊严、爱国心" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "柳: 追悼?死亡 柏: 死亡?阴影 桑: 不寻常" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "橄 榄:智慧、和平 月 桂:胜利 法国梧桐:天才" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "圣 柳:犯罪 唐 桧:大胆、无远虑 长春藤:诡计" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "橡 :权威 文 竹:哀戚 武 竹:飘逸" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "青 苔:谦逊 棕 桐:荣耀 菩 提:安宁" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "蒲公英: 勇气 马鞭草: 正义?期待 翠茱花: 祝你幸福" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "雷丝花: 纯洁?幸运 古代稀: 虚荣 千舌草: 初恋" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "天人菊:团结 孔雀草:嫉妒、悲爱 石 竹:急切、莽撞" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "金盏花:期望 翠 菊:远虑 紫罗兰:忠实" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
"蒲包花: 富贵 香碗豆: 俊美?回忆 叶牡丹: 利益" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "紫茉莉:臆测、猜忌 黄蜀葵:单恋、信任 昙 花:夜之美人" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "吊钟花:趣味、嗜好 紫 苑:反省、追想 龙 胆:正义、清高" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "虎耳草: 情爱 红蜀葵: 温和 月见草: 美人?魔法" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "美人蕉:坚实 葱 兰:期待,洁白的爱 番红花:青春的快乐" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "水 仙:自尊 仙客来:疑惑、猜忌 瑞 香:欢乐、不死" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "金银花:献爱,诚爱 梅 花:高洁 素 馨:幸福、亲切" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "夹竹桃:(桃)咒骂、(黄)深刻的友情 紫 葳:女性、名誉" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "玫 瑰:美、爱、恋(白)恋的心声、诚心敬爱(红)美丽、贞节、模范。(黄)不贞、嫉妒" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "羽扇豆: 母性爱?妩媚 长春花: 追忆 向日葵: 崇拜?敬慕" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + _ 
"大波斯菊:(白)纯洁(红)多情 山 查:希望 紫 荆:背叛、疑惑" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "洋桔梗:富放感情、感动 牡 丹:富贵 樱 花:欢乐" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "蜡 梅:慈爱心 茶 梅:(红)清雅、谦让、(白)理想的爱" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "球 葱:无限悲哀 雪 片:纯洁 串铃花:悲恋" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "东 菊:别离 球 葱:无限悲哀 串铃花:悲恋" + Chr(13) + Chr(10) + Chr(13) + Chr(10) + "金栗兰: 隐约之美 金栗兰: 隐约" 
 
 
  
 作者: 61.142.212.*  2005-10-28 21:55   回复此发言    
 
--------------------------------------------------------------------------------
 
128 恋爱专家 - 主要体现在背景音乐的播放和资源文件中声音的播放以及  
 
End Sub 
Private Sub Label7_Click() 
On Error Resume Next 
If Shape1(1).Top >= 4680 Then 
 Exit Sub 
End If 
Timer1.Enabled = False 
Frame4.Visible = True 
'mciSendString "close MyWav", vbNullString, 0, 0 
sndPlaySound SoundBuffer(0), wFlags 
While Shape1(1).Top < 4680 
  
 Label8.Top = Label8.Top + 50 
 Shape1(1).Top = Shape1(1).Top + 50 
  
 Frame5.Top = Shape1(1).Top + Shape1(1).Height 
Wend 
Save.Enabled = True 
NewFile.Enabled = True 
Frame7.Visible = False 
mciSendString "close BackSound", vbNullString, 0, 0 
End Sub 
Private Sub Label8_Click() 
On Error Resume Next 
If Shape1(1).Top <= Shape1(0).Top + Shape1(0).Height + 20 Then 
 Exit Sub 
End If 
sndPlaySound SoundBuffer(0), wFlags 
While Shape1(1).Top > Shape1(0).Top + Shape1(0).Height + 20 
  
 Label8.Top = Label8.Top - 50 
 Shape1(1).Top = Shape1(1).Top - 50 
  
 Frame5.Top = Shape1(1).Top + Shape1(1).Height 
Wend 
Frame4.Visible = False 
Save.Enabled = False 
NewFile.Enabled = False 
Timer1.Enabled = True 
Frame7.Visible = True 
'DoEvents 
'mciSendString "close MyWav", vbNullString, 0, 0 
'mciSendString "open e:\music\why.mid alias MyWav", vbNullString, 0, 0 
'mciSendString "play MyWav", vbNullString, 0, 0 
 
End Sub 
Private Sub List1_Click() 
For i = 0 To 3 
 If List1.Selected(i) Then 
 Frame2(i).Visible = True 
 Else 
 Frame2(i).Visible = False 
 End If 
Next i 
End Sub 
Private Sub New_Click() 
Text1.Text = "" 
Text1.Locked = True 
Text2.Text = "" 
Text3.Text = "" 
 For i = 0 To 3 
 Text4(i).Text = "" 
 Next i 
 For i = 0 To 2 
 Text5(i).Text = "" 
 Next i 
 For i = 0 To 3 
 Text6(i).Text = "" 
 Next i 
 For i = 0 To 8 
 Text7(i).Text = "" 
 Next i 
End Sub 
Private Sub NewFile_Click() 
Text1.Locked = True 
Text1.Text = "" 
Text2.Text = "" 
Text3.Text = "" 
For i = 0 To 3 
 Text4(i).Text = "" 
Next i 
For i = 0 To 2 
 Text5(i).Text = "" 
Next i 
For i = 0 To 3 
 Text6(i).Text = "" 
Next i 
For i = 0 To 8 
 Text7(i).Text = "" 
Next i 
Command3.Enabled = False 
Save.Enabled = False 
 
End Sub 
Private Sub Save_Click() 
Call Command3_Click 
End Sub 
Private Sub Text1_Change() 
If Text1.Locked = True Then 
 Text1.Text = "" 
End If 
End Sub 
Private Sub Text1_GotFocus() 
If Text1.Text <> "" Then 
 Text1.Locked = False 
Else 
 Text1.Locked = True 
End If 
End Sub 
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer) 
If Shift = 2 Then 
 If KeyCode = 65 Or KeyCode = 97 Then 
 Text1.SelStart = 0 
 Text1.SelLength = Len(Text1.Text) 
 End If 
  
 If KeyCode = 67 Or KeyCode = 99 Then 
 Clipboard.Clear 
 Clipboard.SetText (Text1.SelText) 
 End If 
  
 If KeyCode = 86 Or KeyCode = 118 Then 
 Text1.Text = Left(Text1.Text, Text1.SelStart + Text1.SelLength + 2) + Clipboard.GetText + Mid(Text1.Text, Text1.SelStart + Text1.SelLength + Len(Clipboard.GetText) - 3, Len(Text1.Text) - Text1.SelStart + Text1.SelLength) 
 End If 
  
 If KeyCode = 88 Or KeyCode = 120 Then 
 Text1.Text = Left(Text1.Text, Text1.SelStart) + Mid(Text1.Text, Text1.SelStart + Text1.SelLength + 3, Len(Text1.Text) - Text1.SelStart - Text1.SelLength) 
 End If 
End If 
End Sub 
Private Sub Text2_KeyPress(KeyAscii As Integer) 
If KeyAscii = 13 Then 
 SendKeys "{TAB}" 
 KeyAscii = 0 
End If 
End Sub 
Private Sub Text3_KeyPress(KeyAscii As Integer) 
If KeyAscii = 13 Then 
 SendKeys "{TAB}" 
 KeyAscii = 0 
End If 
End Sub 
Private Sub Text4_KeyPress(Index As Integer, KeyAscii As Integer) 
If KeyAscii = 13 Then 
 SendKeys "{TAB}" 
 KeyAscii = 0 
End If 
End Sub 
Private Sub Text5_KeyPress(Index As Integer, KeyAscii As Integer) 
If KeyAscii = 13 Then 
 SendKeys "{TAB}" 
 KeyAscii = 0 
End If 
End Sub 
Private Sub Text6_Change(Index As Integer) 
If KeyAscii = 13 Then 
 SendKeys "{TAB}" 
 KeyAscii = 0 
End If 
End Sub 
Private Sub Text6_KeyPress(Index As Integer, KeyAscii As Integer) 
If KeyAscii = 13 Then 
 SendKeys "{TAB}" 
 KeyAscii = 0 
End If 
End Sub 
Private Sub Text7_KeyPress(Index As Integer, KeyAscii As Integer) 
If KeyAscii = 13 Then 
 SendKeys "{TAB}" 
 KeyAscii = 0 
End If 
End Sub 
Private Sub Timer1_Timer() 
Dim S As String 
If Shape1(1).Top < 4680 Then 
 If Label39(0).ForeColor <= &H1010FF Then 
 Increase = &H80800 
 ElseIf Label39(0).ForeColor >= &HEFEFFF Then 
 Increase = -&H80800 
 End If 
 Label39(0).ForeColor = Label39(0).ForeColor + Increase 
 Label39(1).ForeColor = Label39(1).ForeColor - Increase 
End If 
  
S = String(256, Chr(0)) 
mciSendString "status MyWav mode", S, Len(S), 0 
If Left(S, 7) = "stopped" Or Left(S, 2) = "停止" Then 
 mciSendString "seek MyWav to start", vbNullString, 0, 0 
 mciSendString "play MyWav", vbNullString, 0, 0 
End If 
End Sub  
 
  
 作者: 61.142.212.*  2005-10-28 21:55   回复此发言    
 
--------------------------------------------------------------------------------
 
129 回复 122:恋爱专家 - 主要体现在背景音乐的播放和资源  
 Private Sub cmdOK_Click() 
Unload Me 
End Sub 
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 
Label2.Font.Underline = False 
Label4.Font.Underline = False 
Label2.ForeColor = &H80000012 
Label4.ForeColor = &H80000012 
End Sub 
Private Sub Label2_Click() 
Shell "C:\Program Files\Internet Explorer\IEXPLORE.EXE mailto:zhyu_zhyu@163.net", vbHide 
End Sub 
Private Sub Label2_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 
Label2.Font.Underline = True 
Label4.Font.Underline = False 
Label2.ForeColor = &HFF& 
Label4.ForeColor = &H80000012 
End Sub 
Private Sub Label4_Click() 
Shell "C:\Program Files\Internet Explorer\IEXPLORE.EXE http://kiss21.126.com", vbMaximizedFocus 
End Sub 
Private Sub Label4_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 
Label4.Font.Underline = True 
Label2.Font.Underline = False 
Label4.ForeColor = &HFF& 
Label2.ForeColor = &H80000012 
End Sub  
 
  
 作者: 61.142.212.*  2005-10-28 21:55   回复此发言    
 
--------------------------------------------------------------------------------
 
130 使用API产生动态鼠标的例程  
 Private Const GCL_HCURSOR = -12 
Private Declare Function ClipCursor Lib "user32" (lpRect As Any) As Long 
Private Declare Function DestroyCursor Lib "user32" (ByVal hCursor As Any) As Long 
Private Declare Function LoadCursorFromFile Lib "user32" Alias "LoadCursorFromFileA" (ByVal lpFileName As String) As Long 
Private Declare Function SetClassLong Lib "user32" Alias "SetClassLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long 
Private Declare Function GetClassLong Lib "user32" Alias "GetClassLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long 
Private Sub Command1_Click() 
Dim mhBaseCursor As Long, mhAniCursor As Long 
Dim lResult As Long 
mhAniCursor = LoadCursorFromFile(Dir1.Path & "\" & File1.FileName) 
lResult = SetClassLong((hwnd), GCL_HCURSOR, mhAniCursor) 
' 下面可以再加需要显示动态鼠标的控件 
lResult = SetClassLong((Me.File1.hwnd), GCL_HCURSOR, mhAniCursor) 
End Sub 
Private Sub Command2_Click() 
Dim mhBaseCursor As Long, mhAniCursor As Long 
Dim lResult As Long 
lResult = GetClassLong((hwnd), GCL_HCURSOR) 
mhAniCursor = DestroyCursor(lResult) 
End Sub 
Private Sub Command3_Click() 
 Unload Me 
End Sub 
Private Sub Command4_Click() 
 frmabout.Show 1 
End Sub 
Private Sub Dir1_Change() 
 File1.Path = Dir1.Path 
End Sub 
Private Sub Drive1_Change() 
 Dir1.Path = Drive1.Drive 
End Sub 
Private Sub Form_Load() 
Drive1.Drive = "c:" 
End Sub 
Private Sub Form_Unload(Cancel As Integer) 
 Command2_Click 
End Sub 
------------\ 
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long 
Private Sub Command1_Click() 
 Unload Me 
End Sub 
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 
 Label1.ForeColor = vbBlue 
 Label4.ForeColor = vbBlue 
End Sub 
Private Sub Label1_Click() 
 Call ShellExecute(hwnd, "Open", "http://xlh.126.com", "", App.Path, 1) 
End Sub 
Private Sub Label1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 
 Label1.ForeColor = vbRed 
End Sub 
Private Sub Label4_Click() 
 Call ShellExecute(hwnd, "Open", "mailto:lhxie@126.com", "", App.Path, 1) 
End Sub 
Private Sub Label4_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 
 Label4.ForeColor = vbRed 
End Sub  
 
  
 作者: 61.142.212.*  2005-10-28 22:00   回复此发言    
 
--------------------------------------------------------------------------------
 
131 看着超级玛莉不停的追赶着你的鼠标,是不是很有意思呢?(推荐)  
 Option Explicit 
Public Pic As New cut_Pic 
Private Sub Form_Load() 
Pic.Ini Form1, P(0), P2, 5, 10 
Pic.Sound = True 
End Sub 
Private Sub P2_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) 
'突出式功能表 
If Button = 2 Then Form1.PopupMenu Form2.A, 2 
End Sub 
Private Sub Timer1_Timer() 
Pic.cutPic 
End Sub 
--------- 
Option Explicit 
Private Sub A1_Click() 
A1.Checked = Not A1.Checked 
Form1.Pic.Auto = Not Form1.Pic.Auto 
End Sub 
Private Sub A2_Click() 
A2.Checked = Not A2.Checked 
Form1.Pic.Sound = Not Form1.Pic.Sound 
End Sub 
Private Sub A33_Click(Index As Integer) 
Form1.Pic.Ini Form1, Form1.P(Index), Form1.P2, 5, 10 
End Sub 
Private Sub A4_Click() 
Copyright.Show 
End Sub 
Private Sub A5_Click() 
Dim I As Integer 
For I = Forms.Count - 1 To 0 Step -1 
 Unload Forms(I) 
Next I 
End 
End Sub 
Private Sub Form_Load() 
Dim hMenu As Long 
Dim hSubMenu As Long 
Dim lngID As Long 
Dim I As Integer 
 hMenu = GetMenu(Form2.hwnd) 
 hSubMenu = GetSubMenu(hMenu, 0) ' 
 hSubMenu = GetSubMenu(hSubMenu, 2) 'Ω 
For I = 0 To 7 
 lngID = GetMenuItemID(hSubMenu, I) 
  
 ' ノImage妮┦肚纥钩絏 
 Pic(I).Picture = Pic(I).Image 
 Call ModifyMenu(hMenu, lngID, 4, lngID, CLng(Pic(I).Picture)) 
Next I 
End Sub 
---------- 
Option Explicit 
Declare Function BitBlt Lib "GDI32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long 
Declare Function StretchBlt Lib "GDI32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long 
Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long 
Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long 
Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long 
Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long 
Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long 
Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long 
Declare Function ModifyMenu Lib "user32" Alias "ModifyMenuA" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpString As Any) As Long 
Declare Function SetWindowPos Lib "user32" (ByVal H%, ByVal hb%, ByVal X%, ByVal Y%, ByVal cx%, ByVal cy%, ByVal F%) As Integer 
Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (lpszSoundName As Any, ByVal uFlags As Long) As Long 
Type POINTAPI 
 X As Long 
 Y As Long 
End Type 
Option Explicit 
Declare Function BitBlt Lib "GDI32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long 
Declare Function StretchBlt Lib "GDI32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long 
 
 
  
 作者: 61.142.212.*  2005-10-28 22:02   回复此发言    
 
--------------------------------------------------------------------------------
 
132 看着超级玛莉不停的追赶着你的鼠标,是不是很有意思呢?(推荐)  
 
Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long 
Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long 
Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long 
Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long 
Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long 
Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long 
Declare Function ModifyMenu Lib "user32" Alias "ModifyMenuA" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpString As Any) As Long 
Declare Function SetWindowPos Lib "user32" (ByVal H%, ByVal hb%, ByVal X%, ByVal Y%, ByVal cx%, ByVal cy%, ByVal F%) As Integer 
Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (lpszSoundName As Any, ByVal uFlags As Long) As Long 
Type POINTAPI 
 X As Long 
 Y As Long 
End Type 
------- 
'************************************************ 
'** 程式设计:饶明惠(蛇夫) ** 
'** 职 业:阿兵哥 ** 
'** E-Mail :snakes@ms8.url.com.tw ** 
'************************************************ 
Option Explicit 
Private in_Form As Form 
Private in_srcPic As PictureBox, in_desPic As PictureBox 
Private in_Piece As Integer 
Private Gini_Width As Integer, Gini_Height As Integer 
Private in_FormX As Integer, in_FormY As Integer 
Private in_MoveDistance As Integer 
Private GiniX As Integer, GiniY As Integer, GiniY1 As Integer 
Private Direct As Integer 
Private scrpixelX As Integer, scrpixelY As Integer 
Private Wav() As Byte 
Private in_Auto As Boolean 
Private in_Sound As Boolean 
Private CheckGoal As Boolean '检查是否已到了目的 
Private CheckMove As Boolean '检查是否有移动 
'**********************************本类别为切割Gini图用************************** 
Sub Ini(out_Form As Form, out_srcPic As PictureBox, out_desPic As PictureBox, out_Piece As Integer, out_MoveDistance As Integer) 
Set in_Form = out_Form 
Set in_srcPic = out_srcPic 
Set in_desPic = out_desPic 
'in_Form.ScaleMode = vbPixels 
in_srcPic.ScaleMode = vbPixels 
in_desPic.ScaleMode = vbPixels 
'计算Gini图的宽、高 
in_Piece = out_Piece 
Gini_Width = in_srcPic.ScaleWidth / in_Piece 
Gini_Height = in_srcPic.ScaleHeight / 2 '输入图片为两倍Gini图高 
'表单的宽、高与Gini图相同,但转成twips 
in_Form.Width = Gini_Width * Screen.TwipsPerPixelX 
in_Form.Height = Gini_Height * Screen.TwipsPerPixelY 
in_desPic.Width = in_Form.Width 
in_desPic.Height = in_Form.Height 
in_MoveDistance = out_MoveDistance 
scrpixelX = Screen.TwipsPerPixelX 
scrpixelY = Screen.TwipsPerPixelY 
'置于最顶层 
Call SetWindowPos(in_Form.hwnd, -1, 0, 0, 0, 0, 3) 
'载入资源 
Wav = LoadResData(111, "WAVE") 
  
Randomize Timer 
End Sub 
Sub cutPic() 
Dim Index As Integer 
Static Mouse As POINTAPI 
If in_Auto = False Then 
 '取得滑鼠位置 
 Call GetCursorPos(Mouse) 
Else 
 If CheckGoal = True Then '随机取得新目标 
 With Screen 
 Mouse.X = Int((.Width / .TwipsPerPixelX) * Rnd) 
 Mouse.Y = Int((.Height / .TwipsPerPixelY) * Rnd) 
 
 
  
 作者: 61.142.212.*  2005-10-28 22:02   回复此发言    
 
--------------------------------------------------------------------------------
 
133 看着超级玛莉不停的追赶着你的鼠标,是不是很有意思呢?(推荐)  
  End With 
 CheckGoal = False 
 End If 
End If 
'运算后给予相对的Gini图和方向 
If Mouse.X > ((in_Form.Left / scrpixelX) + Gini_Width) Then 
 If Mouse.Y < (in_Form.Top / scrpixelY) Then '右上 
 Direct = 0: Index = 1 
 ElseIf Mouse.Y > ((in_Form.Top / scrpixelY) + (Gini_Height)) Then '右下 
 Direct = 0: Index = 3 
 Else '右 
 Direct = 0: Index = 2 
 End If 
 CheckMove = True 
ElseIf Mouse.X < (in_Form.Left / scrpixelX) Then 
 If Mouse.Y < (in_Form.Top / scrpixelY) Then '左上 
 Direct = 1: Index = 1 
 ElseIf Mouse.Y > ((in_Form.Top / scrpixelY) + (Gini_Height)) Then '左下 
 Direct = 1: Index = 3 
 Else '左 
 Direct = 1: Index = 2 
 End If 
 CheckMove = True 
Else 
 If Mouse.Y < (in_Form.Top / scrpixelY) Then '上 
 Direct = 0: Index = 0 
 ElseIf Mouse.Y > ((in_Form.Top / scrpixelY) + (Gini_Height)) Then '下 
 Direct = 0: Index = 4 
 Else 
 '到了目的地 
 CheckGoal = True 
 If CheckMove = True Then 
 If in_Sound = True Then Call sndPlaySound(Wav(0), 5) '音效 
 CheckMove = False 
 End If 
 Exit Sub 
 End If 
 CheckMove = True 
End If 
'输入图片第一列为 Gini 遮罩图 
' 第二列为 Gini 图 
'计算Gini图位置 
GiniX = Gini_Width * (Index Mod in_Piece) 
GiniY = Gini_Height * (Index \ in_Piece) 
GiniY1 = Gini_Height * ((in_Piece + Index) \ in_Piece) 
'转换表单与萤幕的单位为 pixel 关系 
If ((in_Form.Left / scrpixelX) + (Gini_Width / 2)) < Mouse.X Then 
 in_FormX = in_FormX + in_MoveDistance '往右走 
ElseIf ((in_Form.Left / scrpixelX)) > Mouse.X Then 
 in_FormX = in_FormX - in_MoveDistance '往左走 
End If 
If ((in_Form.Top / scrpixelY) + (Gini_Height / 2)) < Mouse.Y Then 
 in_FormY = in_FormY + in_MoveDistance '往下走 
ElseIf ((in_Form.Top / scrpixelY)) > Mouse.Y Then 
 in_FormY = in_FormY - in_MoveDistance '往上走 
End If 
in_srcPic.AutoRedraw = True 
in_desPic.AutoRedraw = True 
in_Form.AutoRedraw = True 
'还原萤幕背景 = in_Form的内容 
in_desPic.Visible = False 
DoEvents 
Dim ScrhDC As Long 
'取得萤幕资源 
ScrhDC = GetDC(0) 
'备份萤幕背景 
Call BitBlt(in_Form.hdc, 0, 0, Gini_Width, Gini_Height, ScrhDC, in_FormX, in_FormY, vbSrcCopy) 
'copy萤幕背景作为 in_desPic的背景 
Call BitBlt(in_desPic.hdc, 0, 0, Gini_Width, Gini_Height, ScrhDC, in_FormX, in_FormY, vbSrcCopy) 
'释放萤幕资源 
Call ReleaseDC(0, ScrhDC) 
'正常copy Gini图 
If Direct = 0 Then 
Call StretchBlt(in_desPic.hdc, 0, 0, Gini_Width, Gini_Height, in_srcPic.hdc, GiniX, GiniY, Gini_Width, Gini_Height, vbSrcAnd) 
Call StretchBlt(in_desPic.hdc, 0, 0, Gini_Width, Gini_Height, in_srcPic.hdc, GiniX, GiniY1, Gini_Width, Gini_Height, vbSrcPaint) 
'水平反转Gini图 
ElseIf Direct = 1 Then 
Call StretchBlt(in_desPic.hdc, Gini_Width, 0, -Gini_Width, Gini_Height, in_srcPic.hdc, GiniX, GiniY, Gini_Width, Gini_Height, vbSrcAnd) 
Call StretchBlt(in_desPic.hdc, Gini_Width, 0, -Gini_Width, Gini_Height, in_srcPic.hdc, GiniX, GiniY1, Gini_Width, Gini_Height, vbSrcPaint) 
End If 
in_desPic.Visible = True 
'移动表单 
in_Form.Move in_FormX * scrpixelX, in_FormY * scrpixelY 
in_srcPic.AutoRedraw = False 
in_desPic.AutoRedraw = False 
in_Form.AutoRedraw = False 
End Sub 
Public Property Get Auto() As Boolean 
Auto = in_Auto 
End Property 
Public Property Let Auto(ByVal out_Auto As Boolean) 
in_Auto = out_Auto 
End Property 
Public Property Get Sound() As Boolean 
Sound = in_Sound 
End Property 
Public Property Let Sound(ByVal out_Sound As Boolean) 
in_Sound = out_Sound 
End Property 
Private Sub Class_Initialize() 
CheckGoal = True 
End Sub 
-------  
 
  
 作者: 61.142.212.*  2005-10-28 22:02   回复此发言    
 
--------------------------------------------------------------------------------
 
134 回复:把焦点定位到任何已运行的窗口。  
 '* 
'* Author: E. J. Bantz Jr. 
'* Copyright: None, use and distribute freely ... 
'* E-Mail: ej@bantz.com 
'* Web: http://ej.bantz.com/video 
'// ------------------------------------------------------------------ 
'// Windows API Constants / Types / Declarations 
'// ------------------------------------------------------------------ 
Public Const WM_USER = &H400 
Type POINTAPI 
 x As Long 
 y As Long 
End Type 
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Long) As Long 
Declare Function SendMessageS Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As String) As Long 
'// ------------------------------------------------------------------ 
'// Window Messages WM_CAP... which can be sent to an AVICAP window 
'// ------------------------------------------------------------------ 
'// Defines start of the message range 
Public Const WM_CAP_START = WM_USER 
Public Const WM_CAP_GET_CAPSTREAMPTR = WM_CAP_START + 1 
Public Const WM_CAP_SET_CALLBACK_ERROR = WM_CAP_START + 2 
Public Const WM_CAP_SET_CALLBACK_STATUS = WM_CAP_START + 3 
Public Const WM_CAP_SET_CALLBACK_YIELD = WM_CAP_START + 4 
Public Const WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START + 5 
Public Const WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START + 6 
Public Const WM_CAP_SET_CALLBACK_WAVESTREAM = WM_CAP_START + 7 
Public Const WM_CAP_GET_USER_DATA = WM_CAP_START + 8 
Public Const WM_CAP_SET_USER_DATA = WM_CAP_START + 9 
  
Public Const WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10 
Public Const WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11 
Public Const WM_CAP_DRIVER_GET_NAME = WM_CAP_START + 12 
Public Const WM_CAP_DRIVER_GET_VERSION = WM_CAP_START + 13 
Public Const WM_CAP_DRIVER_GET_CAPS = WM_CAP_START + 14 
Public Const WM_CAP_FILE_SET_CAPTURE_FILE = WM_CAP_START + 20 
Public Const WM_CAP_FILE_GET_CAPTURE_FILE = WM_CAP_START + 21 
Public Const WM_CAP_FILE_ALLOCATE = WM_CAP_START + 22 
Public Const WM_CAP_FILE_SAVEAS = WM_CAP_START + 23 
Public Const WM_CAP_FILE_SET_INFOCHUNK = WM_CAP_START + 24 
Public Const WM_CAP_FILE_SAVEDIB = WM_CAP_START + 25 
Public Const WM_CAP_EDIT_COPY = WM_CAP_START + 30 
Public Const WM_CAP_SET_AUDIOFORMAT = WM_CAP_START + 35 
Public Const WM_CAP_GET_AUDIOFORMAT = WM_CAP_START + 36 
Public Const WM_CAP_DLG_VIDEOFORMAT = WM_CAP_START + 41 
Public Const WM_CAP_DLG_VIDEOSOURCE = WM_CAP_START + 42 
Public Const WM_CAP_DLG_VIDEODISPLAY = WM_CAP_START + 43 
Public Const WM_CAP_GET_VIDEOFORMAT = WM_CAP_START + 44 
Public Const WM_CAP_SET_VIDEOFORMAT = WM_CAP_START + 45 
Public Const WM_CAP_DLG_VIDEOCOMPRESSION = WM_CAP_START + 46 
Public Const WM_CAP_SET_PREVIEW = WM_CAP_START + 50 
Public Const WM_CAP_SET_OVERLAY = WM_CAP_START + 51 
Public Const WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52 
Public Const WM_CAP_SET_SCALE = WM_CAP_START + 53 
Public Const WM_CAP_GET_STATUS = WM_CAP_START + 54 
Public Const WM_CAP_SET_SCROLL = WM_CAP_START + 55 
Public Const WM_CAP_GRAB_FRAME = WM_CAP_START + 60 
 
 
  
 作者: 61.142.212.*  2005-10-28 22:07   回复此发言    
 
--------------------------------------------------------------------------------
 
135 回复:把焦点定位到任何已运行的窗口。  
 Public Const WM_CAP_GRAB_FRAME_NOSTOP = WM_CAP_START + 61 
Public Const WM_CAP_SEQUENCE = WM_CAP_START + 62 
Public Const WM_CAP_SEQUENCE_NOFILE = WM_CAP_START + 63 
Public Const WM_CAP_SET_SEQUENCE_SETUP = WM_CAP_START + 64 
Public Const WM_CAP_GET_SEQUENCE_SETUP = WM_CAP_START + 65 
Public Const WM_CAP_SET_MCI_DEVICE = WM_CAP_START + 66 
Public Const WM_CAP_GET_MCI_DEVICE = WM_CAP_START + 67 
Public Const WM_CAP_STOP = WM_CAP_START + 68 
Public Const WM_CAP_ABORT = WM_CAP_START + 69 
Public Const WM_CAP_SINGLE_FRAME_OPEN = WM_CAP_START + 70 
Public Const WM_CAP_SINGLE_FRAME_CLOSE = WM_CAP_START + 71 
Public Const WM_CAP_SINGLE_FRAME = WM_CAP_START + 72 
Public Const WM_CAP_PAL_OPEN = WM_CAP_START + 80 
Public Const WM_CAP_PAL_SAVE = WM_CAP_START + 81 
Public Const WM_CAP_PAL_PASTE = WM_CAP_START + 82 
Public Const WM_CAP_PAL_AUTOCREATE = WM_CAP_START + 83 
Public Const WM_CAP_PAL_MANUALCREATE = WM_CAP_START + 84 
'// Following added post VFW 1.1 
Public Const WM_CAP_SET_CALLBACK_CAPCONTROL = WM_CAP_START + 85 
'// Defines end of the message range 
Public Const WM_CAP_END = WM_CAP_SET_CALLBACK_CAPCONTROL 
'// ------------------------------------------------------------------ 
'// Structures 
'// ------------------------------------------------------------------ 
Type CAPDRIVERCAPS 
 wDeviceIndex As Long ' // Driver index in system.ini 
 fHasOverlay As Long ' // Can device overlay? 
 fHasDlgVideoSource As Long ' // Has Video source dlg? 
 fHasDlgVideoFormat As Long ' // Has Format dlg? 
 fHasDlgVideoDisplay As Long ' // Has External out dlg? 
 fCaptureInitialized As Long ' // Driver ready to capture? 
 fDriverSuppliesPalettes As Long ' // Can driver make palettes? 
 hVideoIn As Long ' // Driver In channel 
 hVideoOut As Long ' // Driver Out channel 
 hVideoExtIn As Long ' // Driver Ext In channel 
 hVideoExtOut As Long ' // Driver Ext Out channel 
End Type 
Type CAPSTATUS 
 uiImageWidth As Long '// Width of the image 
 uiImageHeight As Long '// Height of the image 
 fLiveWindow As Long '// Now Previewing video? 
 fOverlayWindow As Long '// Now Overlaying video? 
 fScale As Long '// Scale image to client? 
 ptScroll As POINTAPI '// Scroll position 
 fUsingDefaultPalette As Long '// Using default driver palette? 
 fAudioHardware As Long '// Audio hardware present? 
 fCapFileExists As Long '// Does capture file exist? 
 dwCurrentVideoFrame As Long '// # of video frames cap'td 
 dwCurrentVideoFramesDropped As Long '// # of video frames dropped 
 dwCurrentWaveSamples As Long '// # of wave samples cap'td 
 dwCurrentTimeElapsedMS As Long '// Elapsed capture duration 
 hPalCurrent As Long '// Current palette in use 
 fCapturingNow As Long '// Capture in progress? 
 dwReturn As Long '// Error value after any operation 
 wNumVideoAllocated As Long '// Actual number of video buffers 
 wNumAudioAllocated As Long '// Actual number of audio buffers 
End Type 
Type CAPTUREPARMS 
 dwRequestMicroSecPerFrame As Long '// Requested capture rate 
 fMakeUserHitOKToCapture As Long '// Show "Hit OK to cap" dlg? 
 wPercentDropForError As Long '// Give error msg if > (10%) 
 
 
  
 作者: 61.142.212.*  2005-10-28 22:07   回复此发言    
 
--------------------------------------------------------------------------------
 
136 回复:把焦点定位到任何已运行的窗口。  
  fYield As Long '// Capture via background task? 
 dwIndexSize As Long '// Max index size in frames (32K) 
 wChunkGranularity As Long '// Junk chunk granularity (2K) 
 fUsingDOSMemory As Long '// Use DOS buffers? 
 wNumVideoRequested As Long '// # video buffers, If 0, autocalc 
 fCaptureAudio As Long '// Capture audio? 
 wNumAudioRequested As Long '// # audio buffers, If 0, autocalc 
 vKeyAbort As Long '// Virtual key causing abort 
 fAbortLeftMouse As Long '// Abort on left mouse? 
 fAbortRightMouse As Long '// Abort on right mouse? 
 fLimitEnabled As Long '// Use wTimeLimit? 
 wTimeLimit As Long '// Seconds to capture 
 fMCIControl As Long '// Use MCI video source? 
 fStepMCIDevice As Long '// Step MCI device? 
 dwMCIStartTime As Long '// Time to start in MS 
 dwMCIStopTime As Long '// Time to stop in MS 
 fStepCaptureAt2x As Long '// Perform spatial averaging 2x 
 wStepCaptureAverageFrames As Long '// Temporal average n Frames 
 dwAudioBufferSize As Long '// Size of audio bufs (0 = default) 
 fDisableWriteCache As Long '// Attempt to disable write cache 
End Type 
Type CAPINFOCHUNK 
 fccInfoID As Long '// Chunk ID, "ICOP" for copyright 
 lpData As Long '// pointer to data 
 cbData As Long '// size of lpData 
End Type 
Type VIDEOHDR 
 lpData As Long '// address of video buffer 
 dwBufferLength As Long '// size, in bytes, of the Data buffer 
 dwBytesUsed As Long '// see below 
 dwTimeCaptured As Long '// see below 
 dwUser As Long '// user-specific data 
 dwFlags As Long '// see below 
 dwReserved(3) As Long '// reserved; do not use} 
End Type 
'// The two functions exported by AVICap 
Declare Function capCreateCaptureWindowA Lib "avicap32.dll" ( _ 
 ByVal lpszWindowName As String, _ 
 ByVal dwStyle As Long, _ 
 ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Integer, _ 
 ByVal hWndParent As Long, ByVal nID As Long) As Long 
Declare Function capGetDriverDescriptionA Lib "avicap32.dll" ( _ 
 ByVal wDriver As Integer, _ 
 ByVal lpszName As String, _ 
 ByVal cbName As Long, _ 
 ByVal lpszVer As String, _ 
 ByVal cbVer As Long) As Boolean 
'// ------------------------------------------------------------------ 
'// String IDs from status and error callbacks 
'// ------------------------------------------------------------------ 
Public Const IDS_CAP_BEGIN = 300 '/* "Capture Start" */ 
Public Const IDS_CAP_END = 301 '/* "Capture End" */ 
Public Const IDS_CAP_INFO = 401 '/* "%s" */ 
Public Const IDS_CAP_OUTOFMEM = 402 '/* "Out of memory" */ 
Public Const IDS_CAP_FILEEXISTS = 403 '/* "File '%s' exists -- overwrite it?" */ 
Public Const IDS_CAP_ERRORPALOPEN = 404 '/* "Error opening palette '%s'" */ 
Public Const IDS_CAP_ERRORPALSAVE = 405 '/* "Error saving palette '%s'" */ 
Public Const IDS_CAP_ERRORDIBSAVE = 406 '/* "Error saving frame '%s'" */ 
Public Const IDS_CAP_DEFAVIEXT = 407 '/* "avi" */ 
Public Const IDS_CAP_DEFPALEXT = 408 '/* "pal" */ 
Public Const IDS_CAP_CANTOPEN = 409 '/* "Cannot open '%s'" */ 
Public Const IDS_CAP_SEQ_MSGSTART = 410 '/* "Select OK to start capture\nof video sequence\nto %s." */ 
 
 
  
 作者: 61.142.212.*  2005-10-28 22:07   回复此发言    
 
--------------------------------------------------------------------------------
 
137 回复:把焦点定位到任何已运行的窗口。  
 Public Const IDS_CAP_SEQ_MSGSTOP = 411 '/* "Hit ESCAPE or click to end capture" */ 
  
Public Const IDS_CAP_VIDEDITERR = 412 '/* "An error occurred while trying to run VidEdit." */ 
Public Const IDS_CAP_READONLYFILE = 413 '/* "The file '%s' is a read-only file." */ 
Public Const IDS_CAP_WRITEERROR = 414 '/* "Unable to write to file '%s'.\nDisk may be full." */ 
Public Const IDS_CAP_NODISKSPACE = 415 '/* "There is no space to create a capture file on the specified device." */ 
Public Const IDS_CAP_SETFILESIZE = 416 '/* "Set File Size" */ 
Public Const IDS_CAP_SAVEASPERCENT = 417 '/* "SaveAs: %2ld%% Hit Escape to abort." */ 
  
Public Const IDS_CAP_DRIVER_ERROR = 418 '/* Driver specific error message */ 
Public Const IDS_CAP_WAVE_OPEN_ERROR = 419 '/* "Error: Cannot open the wave input device.\nCheck sample size, frequency, and channels." */ 
Public Const IDS_CAP_WAVE_ALLOC_ERROR = 420 '/* "Error: Out of memory for wave buffers." */ 
Public Const IDS_CAP_WAVE_PREPARE_ERROR = 421 '/* "Error: Cannot prepare wave buffers." */ 
Public Const IDS_CAP_WAVE_ADD_ERROR = 422 '/* "Error: Cannot add wave buffers." */ 
Public Const IDS_CAP_WAVE_SIZE_ERROR = 423 '/* "Error: Bad wave size." */ 
  
Public Const IDS_CAP_VIDEO_OPEN_ERROR = 424 '/* "Error: Cannot open the video input device." */ 
Public Const IDS_CAP_VIDEO_ALLOC_ERROR = 425 '/* "Error: Out of memory for video buffers." */ 
Public Const IDS_CAP_VIDEO_PREPARE_ERROR = 426 '/* "Error: Cannot prepare video buffers." */ 
Public Const IDS_CAP_VIDEO_ADD_ERROR = 427 '/* "Error: Cannot add video buffers." */ 
Public Const IDS_CAP_VIDEO_SIZE_ERROR = 428 '/* "Error: Bad video size." */ 
  
Public Const IDS_CAP_FILE_OPEN_ERROR = 429 '/* "Error: Cannot open capture file." */ 
Public Const IDS_CAP_FILE_WRITE_ERROR = 430 '/* "Error: Cannot write to capture file. Disk may be full." */ 
Public Const IDS_CAP_RECORDING_ERROR = 431 '/* "Error: Cannot write to capture file. Data rate too high or disk full." */ 
Public Const IDS_CAP_RECORDING_ERROR2 = 432 '/* "Error while recording" */ 
Public Const IDS_CAP_AVI_INIT_ERROR = 433 '/* "Error: Unable to initialize for capture." */ 
Public Const IDS_CAP_NO_FRAME_CAP_ERROR = 434 '/* "Warning: No frames captured.\nConfirm that vertical sync interrupts\nare configured and enabled." */ 
Public Const IDS_CAP_NO_PALETTE_WARN = 435 '/* "Warning: Using default palette." */ 
Public Const IDS_CAP_MCI_CONTROL_ERROR = 436 '/* "Error: Unable to access MCI device." */ 
Public Const IDS_CAP_MCI_CANT_STEP_ERROR = 437 '/* "Error: Unable to step MCI device." */ 
Public Const IDS_CAP_NO_AUDIO_CAP_ERROR = 438 '/* "Error: No audio data captured.\nCheck audio card settings." */ 
Public Const IDS_CAP_AVI_DRAWDIB_ERROR = 439 '/* "Error: Unable to draw this data format." */ 
Public Const IDS_CAP_COMPRESSOR_ERROR = 440 '/* "Error: Unable to initialize compressor." */ 
Public Const IDS_CAP_AUDIO_DROP_ERROR = 441 '/* "Error: Audio data was lost during capture, reduce capture rate." */ 
  
'/* status string IDs */ 
Public Const IDS_CAP_STAT_LIVE_MODE = 500 '/* "Live window" */ 
 
 
  
 作者: 61.142.212.*  2005-10-28 22:07   回复此发言    
 
--------------------------------------------------------------------------------
 
138 回复:把焦点定位到任何已运行的窗口。  
 Public Const IDS_CAP_STAT_OVERLAY_MODE = 501 '/* "Overlay window" */ 
Public Const IDS_CAP_STAT_CAP_INIT = 502 '/* "Setting up for capture - Please wait" */ 
Public Const IDS_CAP_STAT_CAP_FINI = 503 '/* "Finished capture, now writing frame %ld" */ 
Public Const IDS_CAP_STAT_PALETTE_BUILD = 504 '/* "Building palette map" */ 
Public Const IDS_CAP_STAT_OPTPAL_BUILD = 505 '/* "Computing optimal palette" */ 
Public Const IDS_CAP_STAT_I_FRAMES = 506 '/* "%d frames" */ 
Public Const IDS_CAP_STAT_L_FRAMES = 507 '/* "%ld frames" */ 
Public Const IDS_CAP_STAT_CAP_L_FRAMES = 508 '/* "Captured %ld frames" */ 
Public Const IDS_CAP_STAT_CAP_AUDIO = 509 '/* "Capturing audio" */ 
Public Const IDS_CAP_STAT_VIDEOCURRENT = 510 '/* "Captured %ld frames (%ld dropped) %d.%03d sec." */ 
Public Const IDS_CAP_STAT_VIDEOAUDIO = 511 '/* "Captured %d.%03d sec. %ld frames (%ld dropped) (%d.%03d fps). %ld audio bytes (%d,%03d sps)" */ 
Public Const IDS_CAP_STAT_VIDEOONLY = 512 '/* "Captured %d.%03d sec. %ld frames (%ld dropped) (%d.%03d fps)" */ 
Function capSetCallbackOnError(ByVal lwnd As Long, ByVal lpProc As Long) As Boolean 
 capSetCallbackOnError = SendMessage(lwnd, WM_CAP_SET_CALLBACK_ERROR, 0, lpProc) 
End Function 
Function capSetCallbackOnStatus(ByVal lwnd As Long, ByVal lpProc As Long) As Boolean 
 capSetCallbackOnStatus = SendMessage(lwnd, WM_CAP_SET_CALLBACK_STATUS, 0, lpProc) 
End Function 
Function capSetCallbackOnYield(ByVal lwnd As Long, ByVal lpProc As Long) As Boolean 
 capSetCallbackOnYield = SendMessage(lwnd, WM_CAP_SET_CALLBACK_YIELD, 0, lpProc) 
End Function 
Function capSetCallbackOnFrame(ByVal lwnd As Long, ByVal lpProc As Long) As Boolean 
 capSetCallbackOnFrame = SendMessage(lwnd, WM_CAP_SET_CALLBACK_FRAME, 0, lpProc) 
End Function 
Function capSetCallbackOnVideoStream(ByVal lwnd As Long, ByVal lpProc As Long) As Boolean 
 capSetCallbackOnVideoStream = SendMessage(lwnd, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, lpProc) 
End Function 
Function capSetCallbackOnWaveStream(ByVal lwnd As Long, ByVal lpProc As Long) As Boolean 
 capSetCallbackOnWaveStream = SendMessage(lwnd, WM_CAP_SET_CALLBACK_WAVESTREAM, 0, lpProc) 
End Function 
Function capSetCallbackOnCapControl(ByVal lwnd As Long, ByVal lpProc As Long) As Boolean 
 capSetCallbackOnCapControl = SendMessage(lwnd, WM_CAP_SET_CALLBACK_CAPCONTROL, 0, lpProc) 
End Function 
Function capSetUserData(ByVal lwnd As Long, ByVal lUser As Long) As Boolean 
 capSetUserData = SendMessage(lwnd, WM_CAP_SET_USER_DATA, 0, lUser) 
End Function 
Function capGetUserData(ByVal lwnd As Long) As Long 
 capGetUserData = SendMessage(lwnd, WM_CAP_GET_USER_DATA, 0, 0) 
End Function 
Function capDriverConnect(ByVal lwnd As Long, ByVal i As Integer) As Boolean 
 capDriverConnect = SendMessage(lwnd, WM_CAP_DRIVER_CONNECT, i, 0) 
End Function 
Function capDriverDisconnect(ByVal lwnd As Long) As Boolean 
 capDriverDisconnect = SendMessage(lwnd, WM_CAP_DRIVER_DISCONNECT, 0, 0) 
End Function 
Function capDriverGetName(ByVal lwnd As Long, ByVal szName As Long, ByVal wSize As Integer) As Boolean 
 capDriverGetName = SendMessage(lwnd, YOURCONSTANTMESSAGE, wSize, szName) 
 
 
  
 作者: 61.142.212.*  2005-10-28 22:07   回复此发言    
 
--------------------------------------------------------------------------------
 
139 回复:把焦点定位到任何已运行的窗口。  
 End Function 
Function capDriverGetVersion(ByVal lwnd As Long, ByVal szVer As Long, ByVal wSize As Integer) As Boolean 
 capDriverGetVersion = SendMessage(lwnd, WM_CAP_DRIVER_GET_VERSION, wSize, szVer) 
End Function 
Function capDriverGetCaps(ByVal lwnd As Long, ByVal s As Long, ByVal wSize As Integer) As Boolean 
 capDriverGetCaps = SendMessage(lwnd, WM_CAP_DRIVER_GET_CAPS, wSize, s) 
End Function 
Function capFileSetCaptureFile(ByVal lwnd As Long, szName As String) As Boolean 
 capFileSetCaptureFile = SendMessageS(lwnd, WM_CAP_FILE_SET_CAPTURE_FILE, 0, szName) 
End Function 
Function capFileGetCaptureFile(ByVal lwnd As Long, ByVal szName As Long, wSize As String) As Boolean 
 capFileGetCaptureFile = SendMessageS(lwnd, WM_CAP_FILE_SET_CAPTURE_FILE, wSize, szName) 
End Function 
Function capFileAlloc(ByVal lwnd As Long, ByVal dwSize As Long) As Boolean 
 capFileAlloc = SendMessage(lwnd, WM_CAP_FILE_ALLOCATE, 0, dwSize) 
End Function 
Function capFileSaveAs(ByVal lwnd As Long, szName As String) As Boolean 
 capFileSaveAs = SendMessageS(lwnd, WM_CAP_FILE_SAVEAS, 0, szName) 
End Function 
Function capFileSetInfoChunk(ByVal lwnd As Long, ByVal lpInfoChunk As Long) As Boolean 
 capFileSetInfoChunk = SendMessage(lwnd, WM_CAP_FILE_SET_INFOCHUNK, 0, lpInfoChunk) 
End Function 
Function capFileSaveDIB(ByVal lwnd As Long, ByVal szName As Long) As Boolean 
 capFileSaveDIB = SendMessage(lwnd, WM_CAP_FILE_SAVEDIB, 0, szName) 
End Function 
Function capEditCopy(ByVal lwnd As Long) As Boolean 
 capEditCopy = SendMessage(lwnd, WM_CAP_EDIT_COPY, 0, 0) 
End Function 
Function capSetAudioFormat(ByVal lwnd As Long, ByVal s As Long, ByVal wSize As Integer) As Boolean 
 capSetAudioFormat = SendMessage(lwnd, WM_CAP_SET_AUDIOFORMAT, wSize, s) 
End Function 
Function capGetAudioFormat(ByVal lwnd As Long, ByVal s As Long, ByVal wSize As Integer) As Long 
 capGetAudioFormat = SendMessage(lwnd, WM_CAP_GET_AUDIOFORMAT, wSize, s) 
End Function 
Function capGetAudioFormatSize(ByVal lwnd As Long) As Long 
 capGetAudioFormatSize = SendMessage(lwnd, WM_CAP_GET_AUDIOFORMAT, 0, 0) 
End Function 
Function capDlgVideoFormat(ByVal lwnd As Long) As Boolean 
 capDlgVideoFormat = SendMessage(lwnd, WM_CAP_DLG_VIDEOFORMAT, 0, 0) 
End Function 
Function capDlgVideoSource(ByVal lwnd As Long) As Boolean 
 capDlgVideoSource = SendMessage(lwnd, WM_CAP_DLG_VIDEOSOURCE, 0, 0) 
End Function 
Function capDlgVideoDisplay(ByVal lwnd As Long) As Boolean 
 capDlgVideoDisplay = SendMessage(lwnd, WM_CAP_DLG_VIDEODISPLAY, 0, 0) 
End Function 
Function capDlgVideoCompression(ByVal lwnd As Long) As Boolean 
 capDlgVideoCompression = SendMessage(lwnd, WM_CAP_DLG_VIDEOCOMPRESSION, 0, 0) 
End Function 
Function capGetVideoFormat(ByVal lwnd As Long, ByVal s As Long, ByVal wSize As Integer) As Long 
 capGetVideoFormat = SendMessage(lwnd, WM_CAP_GET_VIDEOFORMAT, wSize, s) 
End Function 
Function capGetVideoFormatSize(ByVal lwnd As Long) As Long 
 capGetVideoFormatSize = SendMessage(lwnd, WM_CAP_GET_VIDEOFORMAT, 0, 0) 
End Function 
Function capSetVideoFormat(ByVal lwnd As Long, ByVal s As Long, ByVal wSize As Integer) As Boolean 
 
 
  
 作者: 61.142.212.*  2005-10-28 22:07   回复此发言    
 
--------------------------------------------------------------------------------
 
140 回复:把焦点定位到任何已运行的窗口。  
  capSetVideoFormat = SendMessage(lwnd, WM_CAP_SET_VIDEOFORMAT, wSize, s) 
End Function 
Function capPreview(ByVal lwnd As Long, ByVal f As Boolean) As Boolean 
 capPreview = SendMessage(lwnd, WM_CAP_SET_PREVIEW, f, 0) 
End Function 
Function capPreviewRate(ByVal lwnd As Long, ByVal wMS As Integer) As Boolean 
 capPreviewRate = SendMessage(lwnd, WM_CAP_SET_PREVIEWRATE, wMS, 0) 
End Function 
Function capOverlay(ByVal lwnd As Long, ByVal f As Boolean) As Boolean 
 capOverlay = SendMessage(lwnd, WM_CAP_SET_OVERLAY, f, 0) 
End Function 
Function capPreviewScale(ByVal lwnd As Long, ByVal f As Boolean) As Boolean 
 capPreviewScale = SendMessage(lwnd, WM_CAP_SET_SCALE, f, 0) 
End Function 
Function capGetStatus(ByVal lwnd As Long, ByVal s As Long, ByVal wSize As Integer) As Boolean 
 capGetStatus = SendMessage(lwnd, WM_CAP_GET_STATUS, wSize, s) 
End Function 
Function capSetScrollPos(ByVal lwnd As Long, ByVal lpP As Long) As Boolean 
 capSetScrollPos = SendMessage(lwnd, WM_CAP_SET_SCROLL, 0, lpP) 
End Function 
Function capGrabFrame(ByVal lwnd As Long) As Boolean 
 capGrabFrame = SendMessage(lwnd, WM_CAP_GRAB_FRAME, 0, 0) 
End Function 
Function capGrabFrameNoStop(ByVal lwnd As Long) As Boolean 
 capGrabFrameNoStop = SendMessage(lwnd, WM_CAP_GRAB_FRAME_NOSTOP, 0, 0) 
End Function 
Function capCaptureSequence(ByVal lwnd As Long) As Boolean 
 capCaptureSequence = SendMessage(lwnd, WM_CAP_SEQUENCE, 0, 0) 
End Function 
Function capCaptureSequenceNoFile(ByVal lwnd As Long) As Boolean 
 capCaptureSequenceNoFile = SendMessage(lwnd, WM_CAP_SEQUENCE_NOFILE, 0, 0) 
End Function 
Function capCaptureStop(ByVal lwnd As Long) As Boolean 
 capCaptureStop = SendMessage(lwnd, WM_CAP_STOP, 0, 0) 
End Function 
Function capCaptureAbort(ByVal lwnd As Long) As Boolean 
 capCaptureAbort = SendMessage(lwnd, WM_CAP_ABORT, 0, 0) 
End Function 
Function capCaptureSingleFrameOpen(ByVal lwnd As Long) As Boolean 
 capCaptureSingleFrameOpen = SendMessage(lwnd, WM_CAP_SINGLE_FRAME_OPEN, 0, 0) 
End Function 
Function capCaptureSingleFrameClose(ByVal lwnd As Long) As Boolean 
 capCaptureSingleFrameClose = SendMessage(lwnd, WM_CAP_SINGLE_FRAME_CLOSE, 0, 0) 
End Function 
Function capCaptureSingleFrame(ByVal lwnd As Long) As Boolean 
 capCaptureSingleFrame = SendMessage(lwnd, WM_CAP_SINGLE_FRAME, 0, 0) 
End Function 
Function capCaptureGetSetup(ByVal lwnd As Long, ByVal s As Long, ByVal wSize As Integer) As Boolean 
 capCaptureGetSetup = SendMessage(lwnd, WM_CAP_GET_SEQUENCE_SETUP, wSize, s) 
End Function 
Function capCaptureSetSetup(ByVal lwnd As Long, ByVal s As Long, ByVal wSize As Integer) As Boolean 
 capCaptureSetSetup = SendMessage(lwnd, WM_CAP_SET_SEQUENCE_SETUP, wSize, s) 
End Function 
Function capSetMCIDeviceName(ByVal lwnd As Long, ByVal szName As Long) As Boolean 
 capSetMCIDeviceName = SendMessage(lwnd, WM_CAP_SET_MCI_DEVICE, 0, szName) 
End Function 
Function capGetMCIDeviceName(ByVal lwnd As Long, ByVal szName As Long, ByVal wSize As Integer) As Boolean 
 capGetMCIDeviceName = SendMessage(lwnd, WM_CAP_GET_MCI_DEVICE, wSize, szName) 
End Function 
 
 
  
 作者: 61.142.212.*  2005-10-28 22:07   回复此发言    
 
--------------------------------------------------------------------------------
 
141 回复:把焦点定位到任何已运行的窗口。  
 Function capPaletteOpen(ByVal lwnd As Long, ByVal szName As Long) As Boolean 
 capPaletteOpen = SendMessage(lwnd, WM_CAP_PAL_OPEN, 0, szName) 
End Function 
Function capPaletteSave(ByVal lwnd As Long, ByVal szName As Long) As Boolean 
 capPaletteSave = SendMessage(lwnd, WM_CAP_PAL_SAVE, 0, szName) 
End Function 
Function capPalettePaste(ByVal lwnd As Long) As Boolean 
 capPalettePaste = SendMessage(lwnd, WM_CAP_PAL_PASTE, 0, 0) 
End Function 
Function capPaletteAuto(ByVal lwnd As Long, ByVal iFrames As Integer, ByVal iColor As Long) As Boolean 
 capPaletteAuto = SendMessage(lwnd, WM_CAP_PAL_AUTOCREATE, iFrames, iColors) 
End Function 
Function capPaletteManual(ByVal lwnd As Long, ByVal fGrab As Boolean, ByVal iColors As Long) As Boolean 
 capPaletteManual = SendMessage(lwnd, WM_CAP_PAL_MANUALCREATE, fGrab, iColors) 
End Function 
--------------- 
'* 
'* Author: E. J. Bantz Jr. 
'* Copyright: None, use and distribute freely ... 
'* E-Mail: ej@bantz.com 
'* Web: http://ej.bantz.com 
'* 
Option Explicit 
Private Sub Form_Load() 
  
 Dim lpszName As String * 100 
 Dim lpszVer As String * 100 
 Dim Caps As CAPDRIVERCAPS 
  
 '//Create Capture Window 
 capGetDriverDescriptionA 0, lpszName, 100, lpszVer, 100 '// Retrieves driver info 
 lwndC = capCreateCaptureWindowA(lpszName, WS_CAPTION Or WS_THICKFRAME Or WS_VISIBLE Or WS_CHILD, 0, 0, 160, 120, Me.hwnd, 0) 
 '// Set title of window to name of driver 
 SetWindowText lwndC, lpszName 
  
 '// Set the video stream callback function 
 capSetCallbackOnStatus lwndC, AddressOf MyStatusCallback 
 capSetCallbackOnError lwndC, AddressOf MyErrorCallback 
  
 '// Connect the capture window to the driver 
 If capDriverConnect(lwndC, 0) Then 
 '///// 
 '// Only do the following if the connect was successful. 
 '// if it fails, the error will be reported in the call 
 '// back function. 
 '///// 
 '// Get the capabilities of the capture driver 
 capDriverGetCaps lwndC, VarPtr(Caps), Len(Caps) 
  
 '// If the capture driver does not support a dialog, grey it out 
 '// in the menu bar. 
 If Caps.fHasDlgVideoSource = 0 Then mnuSource.Enabled = False 
 If Caps.fHasDlgVideoFormat = 0 Then mnuFormat.Enabled = False 
 If Caps.fHasDlgVideoDisplay = 0 Then mnuDisplay.Enabled = False 
  
 '// Turn Scale on 
 capPreviewScale lwndC, True 
  
 '// Set the preview rate in milliseconds 
 capPreviewRate lwndC, 66 
  
 '// Start previewing the image from the camera 
 capPreview lwndC, True 
  
 '// Resize the capture window to show the whole image 
 ResizeCaptureWindow lwndC 
 End If 
End Sub 
Private Sub Form_Unload(Cancel As Integer) 
 '// Disable all callbacks 
 capSetCallbackOnError lwndC, vbNull 
 capSetCallbackOnStatus lwndC, vbNull 
 capSetCallbackOnYield lwndC, vbNull 
 capSetCallbackOnFrame lwndC, vbNull 
 capSetCallbackOnVideoStream lwndC, vbNull 
 capSetCallbackOnWaveStream lwndC, vbNull 
 capSetCallbackOnCapControl lwndC, vbNull 
  
End Sub 
Private Sub mnuAllocate_Click() 
 Dim sFile As String * 250 
 Dim lSize As Long 
  
 '// Setup swap file for capture 
 lSize = 1000000 
 
 
  
 作者: 61.142.212.*  2005-10-28 22:07   回复此发言    
 
--------------------------------------------------------------------------------
 
142 回复:把焦点定位到任何已运行的窗口。  
  sFile = "C:\TEMP.AVI" 
 capFileSetCaptureFile lwndC, sFile 
 capFileAlloc lwndC, lSize 
  
End Sub 
Private Sub mnuAlwaysVisible_Click() 
  
 mnuAlwaysVisible.Checked = Not (mnuAlwaysVisible.Checked) 
  
 If mnuAlwaysVisible.Checked Then 
 SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE 
 Else 
 SetWindowPos Me.hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE 
 End If 
End Sub 
Private Sub mnuCompression_Click() 
' /* 
' * Display the Compression dialog when "Compression" is selected from 
' * the menu bar. 
' */ 
  
 capDlgVideoCompression lwndC 
End Sub 
Private Sub mnuCopy_Click() 
 capEditCopy lwndC 
  
End Sub 
Private Sub mnuDisplay_Click() 
' /* 
' * Display the Video Display dialog when "Display" is selected from 
' * the menu bar. 
' */ 
 capDlgVideoDisplay lwndC 
  
End Sub 
Private Sub mnuExit_Click() 
 Unload Me 
  
End Sub 
Private Sub mnuFormat_Click() 
' /* 
' * Display the Video Format dialog when "Format" is selected from the 
' * menu bar. 
' */ 
 capDlgVideoFormat lwndC 
 ResizeCaptureWindow lwndC 
End Sub 
Private Sub mnuPreview_Click() 
 frmMain.StatusBar.SimpleText = vbNullString 
 mnuPreview.Checked = Not (mnuPreview.Checked) 
 capPreview lwndC, mnuPreview.Checked 
  
End Sub 
Private Sub mnuScale_Click() 
  
 mnuScale.Checked = Not (mnuScale.Checked) 
 capPreviewScale lwndC, mnuScale.Checked 
  
 If mnuScale.Checked Then 
 SetWindowLong lwndC, GWL_STYLE, WS_THICKFRAME Or WS_CAPTION Or WS_VISIBLE Or WS_CHILD 
 Else 
 SetWindowLong lwndC, GWL_STYLE, WS_BORDER Or WS_CAPTION Or WS_VISIBLE Or WS_CHILD 
 End If 
 ResizeCaptureWindow lwndC 
  
End Sub 
Private Sub mnuSelect_Click() 
  
 frmSelect.Show vbModal, Me 
End Sub 
Private Sub mnuSource_Click() 
' /* 
' * Display the Video Source dialog when "Source" is selected from the 
' * menu bar. 
' */ 
  
 capDlgVideoSource lwndC 
End Sub 
Private Sub mnuStart_Click() 
' /* 
' * If Start is selected from the menu, start Streaming capture. 
' * The streaming capture is terminated when the Escape key is pressed 
' */ 
  
 Dim sFileName As String 
 Dim CAP_PARAMS As CAPTUREPARMS 
  
 capCaptureGetSetup lwndC, VarPtr(CAP_PARAMS), Len(CAP_PARAMS) 
  
 CAP_PARAMS.dwRequestMicroSecPerFrame = (1 * (10 ^ 6)) / 30 ' 30 Frames per second 
 CAP_PARAMS.fMakeUserHitOKToCapture = True 
 CAP_PARAMS.fCaptureAudio = False 
  
 capCaptureSetSetup lwndC, VarPtr(CAP_PARAMS), Len(CAP_PARAMS) 
  
 sFileName = "C:\myvideo.avi" 
  
 capCaptureSequence lwndC ' Start Capturing! 
 capFileSaveAs lwndC, sFileName ' Copy video from swap file into a real file. 
End Sub 
Private Sub StatusBar1_PanelClick(ByVal Panel As ComctlLib.Panel) 
End Sub 
--------------- 
Option Explicit 
Private Sub Command1_Click() 
End Sub 
Private Sub cmdCancel_Click() 
  
 Unload Me 
  
End Sub 
Private Sub cmdSelect_Click() 
  
 Dim sTitle As String 
 Dim Caps As CAPDRIVERCAPS 
  
 If cmboSource.ListIndex <> -1 Then 
  
 '// Connect the capture window to the driver 
 If capDriverConnect(lwndC, cmboSource.ListIndex) Then 
 
 
  
 作者: 61.142.212.*  2005-10-28 22:07   回复此发言    
 
--------------------------------------------------------------------------------
 
143 回复:把焦点定位到任何已运行的窗口。  
   
 '// Get the capabilities of the capture driver 
 capDriverGetCaps lwndC, VarPtr(Caps), Len(Caps) 
  
 '// If the capture driver does not support a dialog, grey it out 
 '// in the menu bar. 
 frmMain.mnuSource.Enabled = Caps.fHasDlgVideoSource 
 frmMain.mnuFormat.Enabled = Caps.fHasDlgVideoFormat 
 frmMain.mnuDisplay.Enabled = Caps.fHasDlgVideoDisplay 
  
 sTitle = cmboSource.Text 
  
 SetWindowText lwndC, sTitle 
 ResizeCaptureWindow lwndC 
 End If 
  
 End If 
  
  
 Unload Me 
  
End Sub 
Private Sub Form_Load() 
  
 Dim lpszName As String * 100 
 Dim lpszVer As String * 100 
 Dim x As Integer 
 Dim lResult As Long 
 Dim Caps As CAPDRIVERCAPS 
  
 '// Get a list of all the installed drivers 
 x = 0 
 Do 
 lResult = capGetDriverDescriptionA(x, lpszName, 100, lpszVer, 100) '// Retrieves driver info 
 If lResult Then 
 cmboSource.AddItem lpszName 
 x = x + 1 
 End If 
 Loop Until lResult = False 
 '// Get the capabilities of the current capture driver 
 lResult = capDriverGetCaps(lwndC, VarPtr(Caps), Len(Caps)) 
  
 '// Select the driver that is currently being used 
 If lResult Then cmboSource.ListIndex = Caps.wDeviceIndex 
End Sub 
------------- 
'* 
'* Author: E. J. Bantz Jr. 
'* Copyright: None, use and distribute freely ... 
'* E-Mail: ejbantz@usa.net 
'* Web: http://www.inlink.com/~ejbantz 
'// ------------------------------------------------------------------ 
'// Windows API Constants / Types / Declarations 
'// ------------------------------------------------------------------ 
Public Const WS_BORDER = &H800000 
Public Const WS_CAPTION = &HC00000 
Public Const WS_SYSMENU = &H80000 
Public Const WS_CHILD = &H40000000 
Public Const WS_VISIBLE = &H10000000 
Public Const WS_OVERLAPPED = &H0& 
Public Const WS_MINIMIZEBOX = &H20000 
Public Const WS_MAXIMIZEBOX = &H10000 
Public Const WS_THICKFRAME = &H40000 
Public Const WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX) 
Public Const SWP_NOMOVE = &H2 
Public Const SWP_NOSIZE = 1 
Public Const SWP_NOZORDER = &H4 
Public Const HWND_BOTTOM = 1 
Public Const HWND_TOPMOST = -1 
Public Const HWND_NOTOPMOST = -2 
Public Const SM_CYCAPTION = 4 
Public Const SM_CXFRAME = 32 
Public Const SM_CYFRAME = 33 
Public Const WS_EX_TRANSPARENT = &H20& 
Public Const GWL_STYLE = (-16) 
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long 
'// Memory manipulation 
Declare Function lStrCpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As Long, ByVal lpString2 As Long) As Long 
Declare Function lStrCpyn Lib "kernel32" Alias "lstrcpynA" (ByVal lpString1 As Any, ByVal lpString2 As Long, ByVal iMaxLength As Long) As Long 
Declare Sub RtlMoveMemory Lib "kernel32" (ByVal hpvDest As Long, ByVal hpvSource As Long, ByVal cbCopy As Long) 
Declare Sub hmemcpy Lib "kernel32" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long) 
  
'// Window manipulation 
Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long 
 
 
  
 作者: 61.142.212.*  2005-10-28 22:07   回复此发言    
 
--------------------------------------------------------------------------------
 
144 回复:把焦点定位到任何已运行的窗口。  
 Declare Function DestroyWindow Lib "user32" (ByVal hndw As Long) As Boolean 
Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long 
Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long 
Public lwndC As Long ' Handle to the Capture Windows 
Function MyFrameCallback(ByVal lwnd As Long, ByVal lpVHdr As Long) As Long 
 Debug.Print "FrameCallBack" 
  
 Dim VideoHeader As VIDEOHDR 
 Dim VideoData() As Byte 
  
 '//Fill VideoHeader with data at lpVHdr 
 RtlMoveMemory VarPtr(VideoHeader), lpVHdr, Len(VideoHeader) 
  
 '// Make room for data 
 ReDim VideoData(VideoHeader.dwBytesUsed) 
  
 '//Copy data into the array 
 RtlMoveMemory VarPtr(VideoData(0)), VideoHeader.lpData, VideoHeader.dwBytesUsed 
 Debug.Print VideoHeader.dwBytesUsed 
 Debug.Print VideoData 
  
End Function 
Function MyYieldCallback(lwnd As Long) As Long 
 Debug.Print "Yield" 
End Function 
Function MyErrorCallback(ByVal lwnd As Long, ByVal iID As Long, ByVal ipstrStatusText As Long) As Long 
  
 If iID = 0 Then Exit Function 
  
 Dim sStatusText As String 
 Dim usStatusText As String 
  
 'Convert the Pointer to a real VB String 
 sStatusText = String$(255, 0) '// Make room for message 
 lStrCpy StrPtr(sStatusText), ipstrStatusText '// Copy message into String 
 sStatusText = Left$(sStatusText, InStr(sStatusText, Chr$(0)) - 1) '// Only look at left of null 
 usStatusText = StrConv(sStatusText, vbUnicode) '// Convert Unicode 
  
 LogError usStatusText, iID 
End Function 
Function MyStatusCallback(ByVal lwnd As Long, ByVal iID As Long, ByVal ipstrStatusText As Long) As Long 
 If iID = 0 Then Exit Function 
  
 Dim sStatusText As String 
 Dim usStatusText As String 
  
 '// Convert the Pointer to a real VB String 
 sStatusText = String$(255, 0) '// Make room for message 
 lStrCpy StrPtr(sStatusText), ipstrStatusText '// Copy message into String 
 sStatusText = Left$(sStatusText, InStr(sStatusText, Chr$(0)) - 1) '// Only look at left of null 
 usStatusText = StrConv(sStatusText, vbUnicode) '// Convert Unicode 
  
 frmMain.StatusBar.SimpleText = usStatusText 
 Debug.Print "Status: ", usStatusText, iID 
 Select Case iID ' 
  
 End Select 
End Function 
Sub ResizeCaptureWindow(ByVal lwnd As Long) 
 Dim CAPSTATUS As CAPSTATUS 
 Dim lCaptionHeight As Long 
 Dim lX_Border As Long 
 Dim lY_Border As Long 
  
  
 lCaptionHeight = GetSystemMetrics(SM_CYCAPTION) 
 lX_Border = GetSystemMetrics(SM_CXFRAME) 
 lY_Border = GetSystemMetrics(SM_CYFRAME) 
  
 '// Get the capture window attributes .. width and height 
 If capGetStatus(lwnd, VarPtr(CAPSTATUS), Len(CAPSTATUS)) Then 
  
 '// Resize the capture window to the capture sizes 
 SetWindowPos lwnd, HWND_BOTTOM, 0, 0, _ 
 CAPSTATUS.uiImageWidth + (lX_Border * 2), _ 
 CAPSTATUS.uiImageHeight + lCaptionHeight + (lY_Border * 2), _ 
 SWP_NOMOVE Or SWP_NOZORDER 
 End If 
 Debug.Print "Resize Window." 
End Sub 
Function MyVideoStreamCallback(lwnd As Long, lpVHdr As Long) As Long 
 Beep '// Replace this with your code! 
  
End Function 
Function MyWaveStreamCallback(lwnd As Long, lpVHdr As Long) As Long 
 Debug.Print "WaveStream" 
End Function 
Sub LogError(txtError As String, lID As Long) 
 frmMain.StatusBar.SimpleText = txtError 
 Debug.Print "Error: ", txtError, lID 
  
End Sub  
 
  
 作者: 61.142.212.*  2005-10-28 22:07   回复此发言    
 
--------------------------------------------------------------------------------
 
145 利用微软的语音引擎使你的程序会朗读,需要安装微软语音引擎或者金  
 Dim vText As New VTxtAuto.VTxtAuto 
Private Sub Command1_Click() 
 Dim astr As String 
  
 Command1.Enabled = False 
 vText.Register vbNullString, "Speech" 
 'vtext.Register 
 astr = "This is a sample of Microsoft Speech Engine?" 
 vText.Speak astr, vtxtsp_NORMAL Or vtxtst_QUESTION 
End Sub 
Private Sub Form_Unload(Cancel As Integer) 
 Set vText = Nothing 
End Sub  
 
  
 作者: 61.142.212.*  2005-10-28 22:09   回复此发言    
 
--------------------------------------------------------------------------------
 
146 一个屏幕保护的程序(流星)。  
 Private W As Integer 
Private H As Integer 
Private Sub Command1_Click() 
Label1.Visible = False 
MoveTo = move_forward 
Command1.Visible = False 
Accelarate = False 
WindowState = 2 
W = ScaleWidth 
H = ScaleHeight 
  
 For i = 1 To 150 
  
  
 Star(i).x = W / 2 
 Star(i).y = H / 2 
RandomX: 
 Randomize 
 Star(i).AddX = Int(Rnd * 29) - Int(Rnd * 29) 
 If Star(i).AddX = 0 Then GoTo RandomX 
RandomY: 
 Star(i).AddY = Int(Rnd * 19) - Int(Rnd * 19) 
 If Star(i).AddY = 0 Then GoTo RandomY 
  
 Next 
End Sub 
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 
If KeyCode = vbKeyEscape Then 
End 
End If 
 
If KeyCode = vbKeySpace Then Accelarate = True 
If KeyCode = vbKeyF1 Then 
ChDir App.Path 
Shell "NOTEPAD.EXE 3Dstarfield.txt", vbMaximizedFocus 
End If 
End Sub 
Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer) 
If KeyCode = vbKeySpace Then Accelarate = False 
End Sub 
Private Sub Form_Load() 
Move Screen.Width / 2 - Width / 2, Screen.Height / 2 - Height / 2 
Command1.Move ScaleWidth / 2 - Command1.Width / 2, ScaleHeight / 4 - Command1.Height / 2 
Label1.Move ScaleWidth / 2 - Label1.Width / 2, ScaleHeight / 2 - Label1.Height / 2 
End Sub 
Private Sub Timer1_Timer() 
If Command1.Visible = True Then Exit Sub 
For i = 1 To 150 
  
 SetPixel hdc, W / 2, H / 2, &H404040 
  
 Select Case Abs(W / 2 - (Star(i).x)) 
 Case Is < 20 
 col = &H0& 
 Size = 1 
 Case Is < 80 
 col = &H404040 
 Size = 1 
 Case Is < 150 
 col = &H808080 
 Size = 2 
 Case Is < 200 
 col = &HC0C0C0 
 Size = 3 
 Case Is < 250 
 col = &HFFFFFF 
 Size = 4 
 Case Else 
 col = &HFFFFFF 
 Size = 5 
 End Select 
 Select Case Abs(H / 2 - (Star(i).y)) 
 Case Is < 20 
 If Size = 0 Then 
 Size = 1 
 col = back5 
 End If 
 Case Is < 80 
 If Size = 0 Then 
 col = &H404040 
 Size = 1 
 End If 
 Case Is < 150 
 If Size < 2 Then 
 Size = 2 
 col = &H808080 
 End If 
 Case Is < 200 
 If Size < 3 Then 
 Size = 3 
 col = &HC0C0C0 
 End If 
 Case Is < 250 
 If Size < 4 Then 
 Size = 4 
 col = &HFFFFFF 
 End If 
 Case Else 
 If Size < 5 Then 
 Size = 5 
 col = &HFFFFFF 
 End If 
  
 End Select 
SetPixel hdc, W / 2, H / 2, col 
Select Case Size 
 Case 1 
 SetPixel Me.hdc, Star(i).x, Star(i).y, &H0& 
 SetPixel Me.hdc, Star(i).x + Star(i).AddX, Star(i).y + Star(i).AddY, col 
 Case 2 
 SetPixel Me.hdc, Star(i).x, Star(i).y, &H0& 
 SetPixel Me.hdc, Star(i).x - 1, Star(i).y, &H0& 
 SetPixel Me.hdc, Star(i).x + Star(i).AddX, Star(i).y + Star(i).AddY, col 
 SetPixel Me.hdc, Star(i).x - 1 + Star(i).AddX, Star(i).y + Star(i).AddY, col 
 Case 3 
 SetPixel Me.hdc, Star(i).x, Star(i).y, &H0& 
 SetPixel Me.hdc, Star(i).x - 1, Star(i).y, &H0& 
 SetPixel Me.hdc, Star(i).x - 1, Star(i).y - 1, &H0& 
 SetPixel Me.hdc, Star(i).x + Star(i).AddX, Star(i).y + Star(i).AddY, col 
 SetPixel Me.hdc, Star(i).x - 1 + Star(i).AddX, Star(i).y + Star(i).AddY, col 
 SetPixel Me.hdc, Star(i).x - 1 + Star(i).AddX, Star(i).y - 1 + Star(i).AddY, col 
 Case 4 
 SetPixel Me.hdc, Star(i).x, Star(i).y, &H0& 
 SetPixel Me.hdc, Star(i).x - 1, Star(i).y, &H0& 
 
 
  
 作者: 61.142.212.*  2005-10-28 22:10   回复此发言    
 
--------------------------------------------------------------------------------
 
147 一个屏幕保护的程序(流星)。  
  SetPixel Me.hdc, Star(i).x - 1, Star(i).y - 1, &H0& 
 SetPixel Me.hdc, Star(i).x, Star(i).y - 1, &H0& 
 SetPixel Me.hdc, Star(i).x + Star(i).AddX, Star(i).y + Star(i).AddY, col 
 SetPixel Me.hdc, Star(i).x - 1 + Star(i).AddX, Star(i).y + Star(i).AddY, col 
 SetPixel Me.hdc, Star(i).x - 1 + Star(i).AddX, Star(i).y - 1 + Star(i).AddY, col 
 SetPixel Me.hdc, Star(i).x + Star(i).AddX, Star(i).y - 1 + Star(i).AddY, col 
 Case 5 
 SetPixel Me.hdc, Star(i).x + a, Star(i).y, &H0& 
 SetPixel Me.hdc, Star(i).x - 1 + a, Star(i).y, &H0& 
 SetPixel Me.hdc, Star(i).x - 1 + a, Star(i).y - 1, &H0& 
 SetPixel Me.hdc, Star(i).x + a, Star(i).y - 1, &H0& 
 SetPixel Me.hdc, Star(i).x + a, Star(i).y - 2, &H0& 
 SetPixel Me.hdc, Star(i).x - 1 + a, Star(i).y - 2, &H0& 
 SetPixel Me.hdc, Star(i).x + Star(i).AddX, Star(i).y + Star(i).AddY, col 
 SetPixel Me.hdc, Star(i).x - 1 + Star(i).AddX, Star(i).y + Star(i).AddY, col 
 SetPixel Me.hdc, Star(i).x - 1 + Star(i).AddX, Star(i).y - 1 + Star(i).AddY, col 
 SetPixel Me.hdc, Star(i).x + Star(i).AddX, Star(i).y - 1 + Star(i).AddY, col 
 SetPixel Me.hdc, Star(i).x + Star(i).AddX, Star(i).y - 2 + Star(i).AddY, col 
 SetPixel Me.hdc, Star(i).x - 1 + Star(i).AddX, Star(i).y - 2 + Star(i).AddY, col 
End Select 
Star(i).x = Star(i).x + Star(i).AddX 
Star(i).y = Star(i).y + Star(i).AddY 
Star(i).AddX = Star(i).AddX + Sgn(Star(i).AddX) * (Size / 5) 
Star(i).AddY = Star(i).AddY + Sgn(Star(i).AddY) * (Size / 5) 
If Accelarate Then 
 Star(i).AddX = Star(i).AddX + Sgn(Star(i).AddX) * Size 
 Star(i).AddY = Star(i).AddY + Sgn(Star(i).AddY) * Size 
End If 
If Star(i).x < 0 Or Star(i).x > ScaleWidth Or Star(i).y < 0 Or Star(i).y > ScaleHeight Then 
 Star(i).x = W / 2 
 Star(i).y = H / 2 
RandomX: 
 Randomize 
 Star(i).AddX = Int(Rnd * 29) - Int(Rnd * 29) 
 If Star(i).AddX = 0 Then GoTo RandomX 
RandomY: 
 Star(i).AddY = Int(Rnd * 19) - Int(Rnd * 19) 
 If Star(i).AddY = 0 Then GoTo RandomY 
End If 
Next 
End Sub 
------------- 
Public Type Stars 
 x As Double 
 y As Integer 
 AddX As Integer 
 AddY As Integer 
End Type 
Public Star(1000) As Stars 
Public Accelarate As Boolean 
Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long  
 
  
 作者: 61.142.212.*  2005-10-28 22:10   回复此发言    
 
--------------------------------------------------------------------------------
 
148 MIDI电子琴(建议装上软波表)。(强力推荐)  
 ' 《VB前线》http://vbbattlefront.163.net 
'************************************************************ 
'* VB 系列功能演示程序 * 
'* * 
'* 如果您发现此程序有任何不妥之处或存在需要改进的地方, * 
'* 望告诉我本人,本人将非常感激您,并一定回信致谢! * 
'* * 
'* by 池星泽(Xing) my Email:vbxing@990.net * 
'************************************************************ 
'*程序编号∶033 
'*功 能∶MIDI电子琴 
'*日 期∶4/25/1999 
'************************************************************ 
Option Explicit 
Private Declare Function GetKeyState% Lib "user32" (ByVal nVirtKey As Long) 
Private sudu As Integer 
Private Const VK_LBUTTON& = &H1 
Private isOgain As Boolean '是否重复按键 
Private Sta As Integer 
Private Sub ComDevies_Click() 
 Dim dl As Integer 
 dl = MIDI_OutOpen(ComDevies.ItemData(ComDevies.ListIndex)) 
End Sub 
Private Sub Command1_Click() 
 Unload Me 
End Sub 
Private Sub Command2_Click() 
 Open App.Path & "\haap.txt" For Input As #1 
 ComDevies.ListIndex = 0 
 ComSounds.ListIndex = 9 
 HScroll1.Value = 32 
 Timer2.Enabled = True 
 Command2.Enabled = False 
End Sub 
Private Sub ComSounds_Click() 
 Call program_change(0, 0, ComSounds.ListIndex) 
End Sub 
Private Sub Form_Load() 
 Dim Retu As Boolean 
 Dim i As Integer 
  
 Retu = Midi_OutDevsToList(ComDevies) 
 ComDevies.ListIndex = 0 
 Call fill_sound_list 
 For i = 0 To 64 
 Picture1(i).DragMode = 1 
 Next 
 HScroll1.Value = 36 
 HScroll2.Value = 127 
End Sub 
Private Sub fill_sound_list() 
Dim s As String 
 Open App.Path & "\genmidi.txt" For Input As #1 
 Do While Not EOF(1) 
 Line Input #1, s 
 ComSounds.AddItem s 
 Loop 
 ComSounds.ListIndex = 0 
 Close #1 
End Sub 
Private Sub Form_Unload(Cancel As Integer) 
 midi_OutClose 
 End 
End Sub 
Private Sub HScroll1_Change() 
 Sta = HScroll1.Value 
 Label2.Caption = Diao(Sta Mod 12) 
End Sub 
Private Sub HScroll2_Change() 
 sudu = HScroll2.Value 
End Sub 
Private Sub HScroll3_Change() 
 Label6.Caption = HScroll3.Value 
End Sub 
Private Sub Label1_MouseMove(Button As Integer, Shift As Integer, x As Single, Y As Single) 
 Dim i As Integer 
 For i = 0 To 64 '关闭所有的发音 
 Call note_off(0, i + Sta) 
 Next 
End Sub 
Private Sub Picture1_DragOver(Index As Integer, Source As Control, x As Single, Y As Single, State As Integer) 
'完成发音 
Static OldNote As Integer 
 If (OldNote <> Index) Or (isOgain = True) Then 
 Call note_off(0, OldNote + Sta) 
 Call note_on(0, Index + Sta, sudu) '参数分别为通道编号,音调,速度 
 OldNote = Index 
 isOgain = False 
 End If 
End Sub 
Private Sub Timer1_Timer() 
 Dim MyKey As Integer 
 MyKey% = GetKeyState(VK_LBUTTON) 
 If MyKey% And &H4000 Then 
 isOgain = False 
 Else 
 isOgain = True 
 End If 
End Sub 
Private Sub Timer2_Timer() 
Dim s As String 
Dim Index As Integer 
 Line Input #1, s 
 s = Trim(s) 
 If s = "End" Then 
 Close #1 
 Timer2.Enabled = False 
 Command2.Enabled = True 
 Label1_MouseMove 0, 0, 1, 1 
 Exit Sub 
 End If 
 Index = Val(s) 
 If Index < 100 Then 
 Index = Index + 7 
 Picture1_DragOver Index, Picture1(Index), 1, 1, 1 
 Index = Index + 24 
 
 
  
 作者: 61.142.212.*  2005-10-28 22:12   回复此发言    
 
--------------------------------------------------------------------------------
 
149 MIDI电子琴(建议装上软波表)。(强力推荐)  
  Picture1_DragOver Index, Picture1(Index), 1, 1, 1 
 End If 
 isOgain = True 
End Sub 
Private Function Diao(i As Integer) As String 
 Select Case i 
 Case 0 
 Diao = "C" 
 Case 1 
 Diao = "C#" 
 Case 2 
 Diao = "D" 
 Case 3 
 Diao = "D#" 
 Case 4 
 Diao = "E" 
 Case 5 
 Diao = "F" 
 Case 6 
 Diao = "F#" 
 Case 7 
 Diao = "G" 
 Case 8 
 Diao = "G#" 
 Case 9 
 Diao = "A" 
 Case 10 
 Diao = "A#" 
 Case 11 
 Diao = "B" 
 End Select 
End Function 
--------------- 
Option Explicit 
Private Declare Function midiOutGetDevCaps Lib "winmm.dll" Alias "midiOutGetDevCapsA" (ByVal uDeviceID As Long, lpCaps As MIDIOUTCAPS, ByVal uSize As Long) As Long 
Private Declare Function midiOutGetNumDevs Lib "winmm" () As Integer 
Private Declare Function MIDIOutOpen Lib "winmm.dll" Alias "midiOutOpen" (lphMidiOut As Long, ByVal uDeviceID As Long, ByVal dwCallback As Long, ByVal dwInstance As Long, ByVal dwFlags As Long) As Long 
Private Declare Function midiOutClose Lib "winmm.dll" (ByVal hMidiOut As Long) As Long 
Private Declare Function midiOutShortMsg Lib "winmm.dll" (ByVal hMidiOut As Long, ByVal dwMsg As Long) As Long 
Private Declare Function midiOutGetErrorText Lib "winmm.dll" Alias "midiOutGetErrorTextA" (ByVal err As Long, ByVal lpText As String, ByVal uSize As Long) As Long 
Private Const MAXERRORLENGTH = 128 ' max error text length (including NULL) 
Private Const MIDIMAPPER = (-1) 
Private Const MIDI_MAPPER = (-1) 
'MIDIOUTCAPS结构描述了Musical Instrument Digital Interface(MIDI)输入设备的性能 
Type MIDIOUTCAPS 
 wMid As Integer 
 wPid As Integer ' 产品 ID 
 vDriverVersion As Long ' 设备版本 
 szPname As String * 32 ' 设备 name 
 wTechnology As Integer ' 设备类型 
 wVoices As Integer 
 wNotes As Integer 
 wChannelMask As Integer 
 dwSupport As Long 
End Type 
Dim hMidi As Long 
Public Function Midi_OutDevsToList(Obj As Control) As Boolean 
 Dim i As Integer 
 Dim midicaps As MIDIOUTCAPS 
 Dim isAdd As Boolean 
  
 Obj.Clear 
 isAdd = False 
 If midiOutGetDevCaps(MIDIMAPPER, midicaps, Len(midicaps)) = 0 Then '若获取设备信息成功 
 Obj.AddItem midicaps.szPname '添加设备名称 
 Obj.ItemData(Obj.NewIndex) = MIDIMAPPER '这是默认设备ID = -1 
 isAdd = True 
 End If 
 '添加其他设备 
 For i = 0 To midiOutGetNumDevs() - 1 
 If midiOutGetDevCaps(i, midicaps, Len(midicaps)) = 0 Then 
 Obj.AddItem midicaps.szPname 
 Obj.ItemData(Obj.NewIndex) = i 
 isAdd = True 
 End If 
 Next 
 Midi_OutDevsToList = isAdd 
End Function 
Public Function MIDI_OutOpen(ByVal dev_id As Integer) As Integer 
Dim midi_error As Integer 
 midi_OutClose 
 midi_error = MIDIOutOpen(hMidi, dev_id, 0, 0, 0) 
 If Not midi_error = 0 Then 
 Call midi_outerr(midi_error) 
 End If 
 MIDI_OutOpen = (hMidi <> 0) 
End Function 
Public Sub midi_OutClose() 
Dim midi_error As Integer 
 If hMidi <> 0 Then 
 midi_error = midiOutClose(hMidi) 
 If Not midi_error = 0 Then 
 Call midi_outerr(midi_error) 
 End If 
 hMidi = 0 
 End If 
End Sub 
Public Sub note_on(ch As Integer, ByVal kk As Integer, v As Integer) 
 Call midi_outshort(&H90 + ch, kk, v) 
End Sub 
Public Sub note_off(ch As Integer, ByVal kk As Integer) 
 Call midi_outshort(&H80 + ch, kk, 0) 
End Sub 
Sub midi_outshort(b1 As Integer, b2 As Integer, b3 As Integer) 
Dim midi_error As Integer 
 midi_error = midiOutShortMsg(hMidi, b3 * &H10000 + b2 * &H100 + b1) 
 If Not midi_error = 0 Then 
 Call midi_outerr(midi_error) 
 End If 
End Sub 
Sub program_change(ch As Integer, cc0nr As Integer, ByVal pnr As Integer) 
 Call control_change(ch, 0, cc0nr) 
 Call midi_outshort(&HC0 + ch, pnr, 0) 
End Sub 
Sub control_change(ch As Integer, ccnr As Integer, ByVal v As Integer) 
 Call midi_outshort(&HB0 + ch, ccnr, v) 
End Sub 
Sub midisetrpn(ch As Integer, pmsb As Integer, plsb As Integer, msb As Integer, lsb As Integer) 
 Call midi_outshort(ch, &H65, pmsb) 
 Call midi_outshort(ch, &H64, plsb) 
 Call midi_outshort(ch, &H6, msb) 
 Call midi_outshort(ch, &H26, lsb) 
End Sub 
Sub midi_outerr(ByVal midi_error As Integer) 
Dim s As String 
Dim x As Integer 
 s = Space(MAXERRORLENGTH) 
 x = midiOutGetErrorText(midi_error, s, MAXERRORLENGTH) 
 MsgBox s 
End Sub  
 
  
 作者: 61.142.212.*  2005-10-28 22:12   回复此发言    
 
--------------------------------------------------------------------------------
 
150 电子琴  
 Option Explicit 
Const INVALID_NOTE = -1 ' Code for keyboard keys that we don't handle 
Dim numDevices As Long ' number of midi output devices 
Dim curDevice As Long ' current midi device 
Dim hmidi As Long ' midi output handle 
Dim rc As Long ' return code 
Dim midimsg As Long ' midi output message buffer 
Dim channel As Integer ' midi output channel 
Dim volume As Integer ' midi volume 
Dim baseNote As Integer ' the first note on our "piano" 
' Set the value for the starting note of the piano 
Private Sub base_Click() 
 Dim s As String 
 Dim i As Integer 
 s = InputBox("Enter the new base note for the keyboard (0 - 111)", "Base note", CStr(baseNote)) 
 If IsNumeric(s) Then 
 i = CInt(s) 
 If (i >= 0 And i < 112) Then 
 baseNote = i 
 End If 
 End If 
End Sub 
' Select the midi output channel 
Private Sub chan_Click(Index As Integer) 
 chan(channel).Checked = False 
 channel = Index 
 chan(channel).Checked = True 
End Sub 
' Open the midi device selected in the menu. The menu index equals the 
' midi device number + 1. 
Private Sub device_Click(Index As Integer) 
 device(curDevice + 1).Checked = False 
 device(Index).Checked = True 
 curDevice = Index - 1 
 rc = midiOutClose(hmidi) 
 rc = midiOutOpen(hmidi, curDevice, 0, 0, 0) 
 If (rc <> 0) Then 
 MsgBox "Couldn't open midi out, rc = " & rc 
 End If 
End Sub 
' If user presses a keyboard key, start the corresponding midi note 
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 
 StartNote NoteFromKey(KeyCode) 
End Sub 
' If user lifts a keyboard key, stop the corresponding midi note 
Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer) 
 StopNote NoteFromKey(KeyCode) 
End Sub 
Private Sub Form_Load() 
 Dim i As Long 
 Dim caps As MIDIOUTCAPS 
  
 ' Set the first device as midi mapper 
 device(0).Caption = "MIDI Mapper" 
 device(0).Visible = True 
 device(0).Enabled = True 
  
 ' Get the rest of the midi devices 
 numDevices = midiOutGetNumDevs() 
 For i = 0 To (numDevices - 1) 
 midiOutGetDevCaps i, caps, Len(caps) 
 device(i + 1).Caption = caps.szPname 
 device(i + 1).Visible = True 
 device(i + 1).Enabled = True 
 Next 
  
 ' Select the MIDI Mapper as the default device 
 device_Click (0) 
  
 ' Set the default channel 
 channel = 0 
 chan(channel).Checked = True 
  
 ' Set the base note 
 baseNote = 60 
  
 ' Set volume range 
 volume = 127 
 vol.Min = 127 
 vol.Max = 0 
 vol.Value = volume 
End Sub 
Private Sub Form_Unload(Cancel As Integer) 
 ' Close current midi device 
 rc = midiOutClose(hmidi) 
End Sub 
' Start a note when user click on it 
Private Sub key_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single) 
 StartNote (Index) 
End Sub 
' Stop the note when user lifts the mouse button 
Private Sub key_MouseUp(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single) 
 StopNote (Index) 
End Sub 
' Press the button and send midi start event 
Private Sub StartNote(Index As Integer) 
 If (Index = INVALID_NOTE) Then 
 Exit Sub 
 End If 
 If (key(Index).Value = 1) Then 
 
 
151 电子琴  
  Exit Sub 
 End If 
 key(Index).Value = 1 
 midimsg = &H90 + ((baseNote + Index) * &H100) + (volume * &H10000) + channel 
 midiOutShortMsg hmidi, midimsg 
End Sub 
' Raise the button and send midi stop event 
Private Sub StopNote(Index As Integer) 
 If (Index = INVALID_NOTE) Then 
 Exit Sub 
 End If 
 key(Index).Value = 0 
 midimsg = &H80 + ((baseNote + Index) * &H100) + channel 
 midiOutShortMsg hmidi, midimsg 
End Sub 
' Get the note corresponding to a keyboard key 
Private Function NoteFromKey(key As Integer) 
 NoteFromKey = INVALID_NOTE 
 Select Case key 
 Case vbKeyZ 
 NoteFromKey = 0 
 Case vbKeyS 
 NoteFromKey = 1 
 Case vbKeyX 
 NoteFromKey = 2 
 Case vbKeyD 
 NoteFromKey = 3 
 Case vbKeyC 
 NoteFromKey = 4 
 Case vbKeyV 
 NoteFromKey = 5 
 Case vbKeyG 
 NoteFromKey = 6 
 Case vbKeyB 
 NoteFromKey = 7 
 Case vbKeyH 
 NoteFromKey = 8 
 Case vbKeyN 
 NoteFromKey = 9 
 Case vbKeyJ 
 NoteFromKey = 10 
 Case vbKeyM 
 NoteFromKey = 11 
 Case 188 ' comma 
 NoteFromKey = 12 
 Case vbKeyL 
 NoteFromKey = 13 
 Case 190 ' period 
 NoteFromKey = 14 
 Case 186 ' semicolon 
 NoteFromKey = 15 
 Case 191 ' forward slash 
 NoteFromKey = 16 
 End Select 
End Function 
' Set the volume 
Private Sub vol_Change() 
 volume = vol.Value 
End Sub 
------- 
'This is a complete piano application u can contact me at haisrini@email.com 
 
Option Explicit 
Public Const MAXPNAMELEN = 32 ' Maximum product name length 
' Error values for functions used in this sample. See the function for more information 
Public Const MMSYSERR_BASE = 0 
Public Const MMSYSERR_BADDEVICEID = (MMSYSERR_BASE + 2) ' device ID out of range 
Public Const MMSYSERR_INVALPARAM = (MMSYSERR_BASE + 11) ' invalid parameter passed 
Public Const MMSYSERR_NODRIVER = (MMSYSERR_BASE + 6) ' no device driver present 
Public Const MMSYSERR_NOMEM = (MMSYSERR_BASE + 7) ' memory allocation error 
Public Const MMSYSERR_INVALHANDLE = (MMSYSERR_BASE + 5) ' device handle is invalid 
Public Const MIDIERR_BASE = 64 
Public Const MIDIERR_STILLPLAYING = (MIDIERR_BASE + 1) ' still something playing 
Public Const MIDIERR_NOTREADY = (MIDIERR_BASE + 3) ' hardware is still busy 
Public Const MIDIERR_BADOPENMODE = (MIDIERR_BASE + 6) ' operation unsupported w/ open mode 
'User-defined variable the stores information about the MIDI output device. 
Type MIDIOUTCAPS 
 wMid As Integer ' Manufacturer identifier of the device driver for the MIDI output device 
 ' For a list of identifiers, see the Manufacturer Indentifier topic in the 
 ' Multimedia Reference of the Platform SDK. 
  
 wPid As Integer ' Product Identifier Product of the MIDI output device. For a list of 
 ' product identifiers, see the Product Identifiers topic in the Multimedia 
 ' Reference of the Platform SDK. 
  
 vDriverVersion As Long ' Version number of the device driver for the MIDI output device. 
 ' The high-order byte is the major version number, and the low-order byte is 
 ' the minor version number. 
  
 szPname As String * MAXPNAMELEN ' Product name in a null-terminated string. 
  
 wTechnology As Integer ' One of the following that describes the MIDI output device: 
 
 
  
 作者: 61.142.212.*  2005-10-28 22:18   回复此发言    
 
--------------------------------------------------------------------------------
 
152 电子琴  
  ' MOD_FMSYNTH-The device is an FM synthesizer. 
 ' MOD_MAPPER-The device is the Microsoft MIDI mapper. 
 ' MOD_MIDIPORT-The device is a MIDI hardware port. 
 ' MOD_SQSYNTH-The device is a square wave synthesizer. 
 ' MOD_SYNTH-The device is a synthesizer. 
  
 wVoices As Integer ' Number of voices supported by an internal synthesizer device. If the 
 ' device is a port, this member is not meaningful and is set to 0. 
  
 wNotes As Integer ' Maximum number of simultaneous notes that can be played by an internal 
 ' synthesizer device. If the device is a port, this member is not meaningful 
 ' and is set to 0. 
  
 wChannelMask As Integer ' Channels that an internal synthesizer device responds to, where the least 
 ' significant bit refers to channel 0 and the most significant bit to channel 
 ' 15. Port devices that transmit on all channels set this member to 0xFFFF. 
  
 dwSupport As Long ' One of the following describes the optional functionality supported by 
 ' the device: 
 ' MIDICAPS_CACHE-Supports patch caching. 
 ' MIDICAPS_LRVOLUME-Supports separate left and right volume control. 
 ' MIDICAPS_STREAM-Provides direct support for the midiStreamOut function. 
 ' MIDICAPS_VOLUME-Supports volume control. 
 ' 
 ' If a device supports volume changes, the MIDICAPS_VOLUME flag will be set 
 ' for the dwSupport member. If a device supports separate volume changes on 
 ' the left and right channels, both the MIDICAPS_VOLUME and the 
 ' MIDICAPS_LRVOLUME flags will be set for this member. 
End Type 
Declare Function midiOutGetNumDevs Lib "winmm" () As Integer 
' This function retrieves the number of MIDI output devices present in the system. 
' The function returns the number of MIDI output devices. A zero return value means 
' there are no MIDI devices in the system. 
Declare Function midiOutGetDevCaps Lib "winmm.dll" Alias "midiOutGetDevCapsA" (ByVal uDeviceID As Long, lpCaps As MIDIOUTCAPS, ByVal uSize As Long) As Long 
' This function queries a specified MIDI output device to determine its capabilities. 
' The function requires the following parameters; 
' uDeviceID- unsigned integer variable identifying of the MIDI output device. The 
' device identifier specified by this parameter varies from zero to one 
' less than the number of devices present. This parameter can also be a 
' properly cast device handle. 
' lpMidiOutCaps- address of a MIDIOUTCAPS structure. This structure is filled with 
' information about the capabilities of the device. 
' cbMidiOutCaps- the size, in bytes, of the MIDIOUTCAPS structure. Use the Len 
' function with the MIDIOUTCAPS variable as the argument to get 
' this value. 
' 
' The function returns MMSYSERR_NOERROR if successful or one of the following error values: 
' MMSYSERR_BADDEVICEID The specified device identifier is out of range. 
' MMSYSERR_INVALPARAM The specified pointer or structure is invalid. 
' MMSYSERR_NODRIVER The driver is not installed. 
' MMSYSERR_NOMEM The system is unable to load mapper string description. 
Declare Function midiOutClose Lib "winmm.dll" (ByVal hMidiOut As Long) As Long 
 
 
  
 作者: 61.142.212.*  2005-10-28 22:18   回复此发言    
 
--------------------------------------------------------------------------------
 
153 电子琴  
 ' The function closes the specified MIDI output device. The function requires a 
' handle to the MIDI output device. If the function is successful, the handle is no 
' longer valid after the call to this function. A successful function call returns 
' MMSYSERR_NOERROR. 
' A failure returns one of the following: 
' MIDIERR_STILLPLAYING Buffers are still in the queue. 
' MMSYSERR_INVALHANDLE The specified device handle is invalid. 
' MMSYSERR_NOMEM The system is unable to load mapper string description. 
Declare Function midiOutOpen Lib "winmm.dll" (lphMidiOut As Long, ByVal uDeviceID As Long, ByVal dwCallback As Long, ByVal dwInstance As Long, ByVal dwFlags As Long) As Long 
' The function opens a MIDI output device for playback. The function requires the 
' following parameters 
' lphmo- Address of an HMIDIOUT handle. This location is filled with a 
' handle identifying the opened MIDI output device. The handle 
' is used to identify the device in calls to other MIDI output 
' functions. 
' uDeviceID- Identifier of the MIDI output device that is to be opened. 
' dwCallback- Address of a callback function, an event handle, a thread 
' identifier, or a handle of a window or thread called during 
' MIDI playback to process messages related to the progress of 
' the playback. If no callback is desired, set this value to 0. 
' dwCallbackInstance- User instance data passed to the callback. Set this value to 0. 
' dwFlags-Callback flag for opening the device. Set this value to 0. 
' 
' The function returns MMSYSERR_NOERROR if successful or one of the following error values: 
' MIDIERR_NODEVICE- No MIDI port was found. This error occurs only when the mapper is opened. 
' MMSYSERR_ALLOCATED- The specified resource is already allocated. 
' MMSYSERR_BADDEVICEID- The specified device identifier is out of range. 
' MMSYSERR_INVALPARAM- The specified pointer or structure is invalid. 
' MMSYSERR_NOMEM- The system is unable to allocate or lock memory. 
Declare Function midiOutShortMsg Lib "winmm.dll" (ByVal hMidiOut As Long, ByVal dwMsg As Long) As Long 
' This function sends a short MIDI message to the specified MIDI output device. The function 
' requires the handle to the MIDI output device and a message is packed into a doubleword 
' value with the first byte of the message in the low-order byte. See the code sample for 
' how to create this value. 
' 
' The function returns MMSYSERR_NOERROR if successful or one of the following error values: 
' MIDIERR_BADOPENMODE- The application sent a message without a status byte to a stream handle. 
' MIDIERR_NOTREADY- The hardware is busy with other data. 
' MMSYSERR_INVALHANDLE- The specified device handle is invalid.  
 
  
 作者: 61.142.212.*  2005-10-28 22:18   回复此发言    
 
--------------------------------------------------------------------------------
 
154 回复:把焦点定位到任何已运行的窗口。  
 Option Explicit 
Private Sub cmdScreen_Click() 
Set Picture1.Picture = CaptureScreen() 
End Sub 
Private Sub cmdForm_Click() 
' 
' Get the whole form inclusing borders, caption,... 
' 
Set Picture1.Picture = CaptureForm(Me) 
End Sub 
Private Sub cmdClient_Click() 
' 
' Just get the client area of the form, 
' no borders, caption,... 
' 
Set Picture1.Picture = CaptureClient(Me) 
End Sub 
Private Sub cmdActive_Click() 
Dim EndTime As Date 
' 
' Give the user 2 seconds to activate 
' a window then capture it. 
' 
MsgBox "Two seconds after you close this dialog " & _ 
 "the active window will be captured.", _ 
 vbInformation, "Capture Active Window" 
' 
' Wait for two seconds 
' 
EndTime = DateAdd("s", 2, Now) 
Do Until Now > EndTime 
 DoEvents 
Loop 
' 
' Get the active window. 
' Set focus back to form 
' 
Set Picture1.Picture = CaptureActiveWindow() 
Me.SetFocus 
End Sub 
Private Sub cmdPrint_Click() 
' 
' Print the contents of the picturebox. 
' 
Call PrintPictureToFitPage(Printer, Picture1.Picture) 
Printer.EndDoc 
End Sub 
Private Sub cmdClear_Click() 
Set Picture1.Picture = Nothing 
End Sub 
Private Sub Form_Load() 
' 
' Capture any form or window including the screen into a 
' Visual Basic Picture object. Once the on-screen image 
' is captured in the Picture object, it can be printed 
' using the PaintPicture method of the Visual Basic 
' Printer object. 
' 
' Automatically resize the picturebox 
' according to the size of its contents. 
' 
Picture1.AutoSize = True 
End Sub 
Private Sub Form_Unload(Cancel As Integer) 
Set frmCapture = Nothing 
End Sub 
 
------------ 
Option Explicit 
Option Base 0 
' 
' This module contains several routines for capturing windows into a 
' picture. All routines have palette support. 
' 
' CreateBitmapPicture - Creates a picture object from a bitmap and palette. 
' CaptureWindow - Captures any window given a window handle. 
' CaptureActiveWindow - Captures the active window on the desktop. 
' CaptureForm - Captures the entire form. 
' CaptureClient - Captures the client area of a form. 
' CaptureScreen - Captures the entire screen. 
' PrintPictureToFitPage - prints any picture as big as possible on the page. 
' 
Private Type PALETTEENTRY 
 peRed As Byte 
 peGreen As Byte 
 peBlue As Byte 
 peFlags As Byte 
End Type 
Private Type LOGPALETTE 
 palVersion As Integer 
 palNumEntries As Integer 
 palPalEntry(255) As PALETTEENTRY ' Enough for 256 colors 
End Type 
  
Private Type GUID 
 Data1 As Long 
 Data2 As Integer 
 Data3 As Integer 
 Data4(7) As Byte 
End Type 
Private Type RECT 
 Left As Long 
 Top As Long 
 Right As Long 
 Bottom As Long 
End Type 
Private Type PicBmp 
 Size As Long 
 Type As Long 
 hBmp As Long 
 hPal As Long 
 Reserved As Long 
End Type 
Private Const RASTERCAPS As Long = 38 
Private Const RC_PALETTE As Long = &H100 
Private Const SIZEPALETTE As Long = 104 
' 
' DC = Device Context 
' 
' Creates a bitmap compatible with the device associated 
' with the specified DC. 
Private Declare Function CreateCompatibleBitmap Lib "GDI32" ( _ 
 
 
  
 作者: 61.142.212.*  2005-10-28 22:22   回复此发言    
 
--------------------------------------------------------------------------------
 
155 回复:把焦点定位到任何已运行的窗口。  
  ByVal hDC As Long, ByVal nWidth As Long, _ 
 ByVal nHeight As Long) As Long 
' Retrieves device-specific information about a specified device. 
Private Declare Function GetDeviceCaps Lib "GDI32" ( _ 
 ByVal hDC As Long, ByVal iCapabilitiy As Long) As Long 
' Retrieves a range of palette entries from the system palette 
' associated with the specified DC. 
Private Declare Function GetSystemPaletteEntries Lib "GDI32" ( _ 
 ByVal hDC As Long, ByVal wStartIndex As Long, _ 
 ByVal wNumEntries As Long, lpPaletteEntries As PALETTEENTRY) _ 
 As Long 
' Creates a memory DC compatible with the specified device. 
Private Declare Function CreateCompatibleDC Lib "GDI32" ( _ 
 ByVal hDC As Long) As Long 
' Creates a logical color palette. 
Private Declare Function CreatePalette Lib "GDI32" ( _ 
 lpLogPalette As LOGPALETTE) As Long 
' Selects the specified logical palette into a DC. 
Private Declare Function SelectPalette Lib "GDI32" ( _ 
 ByVal hDC As Long, ByVal hPalette As Long, _ 
 ByVal bForceBackground As Long) As Long 
' Maps palette entries from the current logical 
' palette to the system palette. 
Private Declare Function RealizePalette Lib "GDI32" ( _ 
 ByVal hDC As Long) As Long 
' Selects an object into the specified DC. The new 
' object replaces the previous object of the same type. 
' Returned is the handle of the replaced object. 
Private Declare Function SelectObject Lib "GDI32" ( _ 
 ByVal hDC As Long, ByVal hObject As Long) As Long 
' Performs a bit-block transfer of color data corresponding to 
' a rectangle of pixels from the source DC into a destination DC. 
Private Declare Function BitBlt Lib "GDI32" ( _ 
 ByVal hDCDest As Long, ByVal XDest As Long, _ 
 ByVal YDest As Long, ByVal nWidth As Long, _ 
 ByVal nHeight As Long, ByVal hDCSrc As Long, _ 
 ByVal XSrc As Long, ByVal YSrc As Long, ByVal dwRop As Long) _ 
 As Long 
' Retrieves the DC for the entire window, including title bar, 
' menus, and scroll bars. A window DC permits painting anywhere 
' in a window, because the origin of the DC is the upper-left 
' corner of the window instead of the client area. 
Private Declare Function GetWindowDC Lib "USER32" ( _ 
 ByVal hWnd As Long) As Long 
' Retrieves a handle to a display DC for the Client area of 
' a specified window or for the entire screen. You can use 
' the returned handle in subsequent GDI functions to draw in 
' the DC. 
Private Declare Function GetDC Lib "USER32" ( _ 
 ByVal hWnd As Long) As Long 
' Releases a DC, freeing it for use by other applications. 
' The effect of the ReleaseDC function depends on the type 
' of DC. It frees only common and window DCs. It has no 
' effect on class or private DCs. 
Private Declare Function ReleaseDC Lib "USER32" ( _ 
 ByVal hWnd As Long, ByVal hDC As Long) As Long 
' Deletes the specified DC. 
Private Declare Function DeleteDC Lib "GDI32" ( _ 
 ByVal hDC As Long) As Long 
' Retrieves the dimensions of the bounding rectangle of the 
' specified window. The dimensions are given in screen 
' coordinates that are relative to the upper-left corner 
 
 
  
 作者: 61.142.212.*  2005-10-28 22:22   回复此发言    
 
--------------------------------------------------------------------------------
 
156 回复:把焦点定位到任何已运行的窗口。  
 ' of the screen. 
Private Declare Function GetWindowRect Lib "USER32" ( _ 
 ByVal hWnd As Long, lpRect As RECT) As Long 
' Returns a handle to the Desktop window. The desktop 
' window covers the entire screen and is the area on top 
' of which all icons and other windows are painted. 
Private Declare Function GetDesktopWindow Lib "USER32" () As Long 
' Returns a handle to the foreground window (the window 
' the user is currently working). The system assigns a 
' slightly higher priority to the thread that creates the 
' foreground window than it does to other threads. 
Private Declare Function GetForegroundWindow Lib "USER32" () As Long 
' Creates a new picture object initialized according to a PICTDESC 
' structure, which can be NULL, to create an uninitialized object if 
' the caller wishes to have the picture initialize itself through 
' IPersistStream::Load. The fOwn parameter indicates whether the 
' picture is to own the GDI picture handle for the picture it contains, 
' so that the picture object will destroy its picture when the object 
' itself is destroyed. The function returns an interface pointer to the 
' new picture object specified by the caller in the riid parameter. 
' A QueryInterface is built into this call. The caller is responsible 
' for calling Release through the interface pointer returned - phew! 
Private Declare Function OleCreatePictureIndirect _ 
 Lib "olepro32.dll" (PicDesc As PicBmp, RefIID As GUID, _ 
 ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long 
Public Function CreateBitmapPicture(ByVal hBmp As Long, _ 
 ByVal hPal As Long) As Picture 
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
' 
' CreateBitmapPicture 
' - Creates a bitmap type Picture object from a bitmap and palette. 
' 
' hBmp 
' - Handle to a bitmap 
' 
' hPal 
' - Handle to a Palette 
' - Can be null if the bitmap doesn't use a palette 
' 
' Returns 
' - Returns a Picture object containing the bitmap 
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
' 
Dim r As Long 
Dim Pic As PicBmp 
' 
' IPicture requires a reference to "Standard OLE Types" 
' 
Dim IPic As IPicture 
Dim IID_IDispatch As GUID 
' 
' Fill in with IDispatch Interface ID 
' 
With IID_IDispatch 
 .Data1 = &H20400 
 .Data4(0) = &HC0 
 .Data4(7) = &H46 
End With 
' 
' Fill Pic with the necessary parts. 
' 
With Pic 
 .Size = Len(Pic) ' Length of structure 
 .Type = vbPicTypeBitmap ' Type of Picture (bitmap) 
 .hBmp = hBmp ' Handle to bitmap 
 .hPal = hPal ' Handle to palette (may be null) 
End With 
' 
' Create the Picture object. 
r = OleCreatePictureIndirect(Pic, IID_IDispatch, 1, IPic) 
' 
' Return the new Picture object. 
' 
Set CreateBitmapPicture = IPic 
End Function 
 
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
' 
' CaptureWindow 
' - Captures any portion of a window. 
' 
' hWndSrc 
' - Handle to the window to be captured 
' 
' bClient 
' - If True CaptureWindow captures from the bClient area of the 
' window 
' - If False CaptureWindow captures from the entire window 
 
 
  
 作者: 61.142.212.*  2005-10-28 22:22   回复此发言    
 
--------------------------------------------------------------------------------
 
157 回复:把焦点定位到任何已运行的窗口。  
 ' 
' LeftSrc, TopSrc, WidthSrc, HeightSrc 
' - Specify the portion of the window to capture 
' - Dimensions need to be specified in pixels 
' 
' Returns 
' - Returns a Picture object containing a bitmap of the specified 
' portion of the window that was captured 
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
Public Function CaptureWindow(ByVal hWndSrc As Long, _ 
 ByVal bClient As Boolean, ByVal LeftSrc As Long, _ 
 ByVal TopSrc As Long, ByVal WidthSrc As Long, _ 
 ByVal HeightSrc As Long) As Picture 
Dim hDCMemory As Long 
Dim hBmp As Long 
Dim hBmpPrev As Long 
Dim r As Long 
Dim hDCSrc As Long 
Dim hPal As Long 
Dim hPalPrev As Long 
Dim RasterCapsScrn As Long 
Dim HasPaletteScrn As Long 
Dim PaletteSizeScrn As Long 
Dim LogPal As LOGPALETTE 
' 
' Get the proper Device Context (DC) depending on the value of bClient. 
' 
If bClient Then 
 hDCSrc = GetDC(hWndSrc) 'Get DC for Client area. 
Else 
 hDCSrc = GetWindowDC(hWndSrc) 'Get DC for entire window. 
End If 
' 
' Create a memory DC for the copy process. 
' 
hDCMemory = CreateCompatibleDC(hDCSrc) 
' 
' Create a bitmap and place it in the memory DC. 
' 
hBmp = CreateCompatibleBitmap(hDCSrc, WidthSrc, HeightSrc) 
hBmpPrev = SelectObject(hDCMemory, hBmp) 
' 
' Get the screen properties. 
' 
RasterCapsScrn = GetDeviceCaps(hDCSrc, RASTERCAPS) 'Raster capabilities 
HasPaletteScrn = RasterCapsScrn And RC_PALETTE 'Palette support 
PaletteSizeScrn = GetDeviceCaps(hDCSrc, SIZEPALETTE) 'Palette size 
' 
' If the screen has a palette make a copy and realize it. 
' 
If HasPaletteScrn And (PaletteSizeScrn = 256) Then 
 ' 
 ' Create a copy of the system palette. 
 ' 
 LogPal.palVersion = &H300 
 LogPal.palNumEntries = 256 
 r = GetSystemPaletteEntries(hDCSrc, 0, 256, LogPal.palPalEntry(0)) 
 hPal = CreatePalette(LogPal) 
 ' 
 ' Select the new palette into the memory DC and realize it. 
 ' 
 hPalPrev = SelectPalette(hDCMemory, hPal, 0) 
 r = RealizePalette(hDCMemory) 
End If 
' 
' Copy the on-screen image into the memory DC. 
' 
r = BitBlt(hDCMemory, 0, 0, WidthSrc, HeightSrc, hDCSrc, _ 
 LeftSrc, TopSrc, vbSrcCopy) 
' 
' Remove the new copy of the on-screen image. 
' 
hBmp = SelectObject(hDCMemory, hBmpPrev) 
' 
' If the screen has a palette get back the 
' palette that was selected in previously. 
' 
If HasPaletteScrn And (PaletteSizeScrn = 256) Then 
 hPal = SelectPalette(hDCMemory, hPalPrev, 0) 
End If 
' 
' Release the DC resources back to the system. 
' 
r = DeleteDC(hDCMemory) 
r = ReleaseDC(hWndSrc, hDCSrc) 
' 
' Create a picture object from the bitmap 
' and palette handles. 
' 
Set CaptureWindow = CreateBitmapPicture(hBmp, hPal) 
End Function 
Public Function CaptureScreen() As Picture 
Dim hWndScreen As Long 
' 
' Get a handle to the desktop window. 
hWndScreen = GetDesktopWindow() 
' 
' Capture the entire desktop. 
' 
With Screen 
 Set CaptureScreen = CaptureWindow(hWndScreen, False, 0, 0, _ 
 .Width \ .TwipsPerPixelX, .Height \ .TwipsPerPixelY) 
End With 
End Function 
Public Function CaptureForm(frm As Form) As Picture 
' 
' Capture the entire form. 
 
 
  
 作者: 61.142.212.*  2005-10-28 22:22   回复此发言    
 
--------------------------------------------------------------------------------
 
158 回复:把焦点定位到任何已运行的窗口。  
 ' 
With frm 
 Set CaptureForm = CaptureWindow(.hWnd, False, 0, 0, _ 
 .ScaleX(.Width, vbTwips, vbPixels), _ 
 .ScaleY(.Height, vbTwips, vbPixels)) 
End With 
End Function 
Public Function CaptureClient(frm As Form) As Picture 
' 
' Capture the client area of the form. 
' 
With frm 
 Set CaptureClient = CaptureWindow(.hWnd, True, 0, 0, _ 
 .ScaleX(.ScaleWidth, .ScaleMode, vbPixels), _ 
 .ScaleY(.ScaleHeight, .ScaleMode, vbPixels)) 
End With 
End Function 
Public Function CaptureActiveWindow() As Picture 
Dim hWndActive As Long 
Dim RectActive As RECT 
' 
' Get a handle to the active/foreground window. 
' Get the dimensions of the window. 
' 
hWndActive = GetForegroundWindow() 
Call GetWindowRect(hWndActive, RectActive) 
' 
' Capture the active window. 
' 
With RectActive 
 Set CaptureActiveWindow = CaptureWindow(hWndActive, False, 0, 0, _ 
 .Right - .Left, .Bottom - .Top) 
End With 
End Function 
Public Sub PrintPictureToFitPage(Prn As Printer, Pic As Picture) 
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
' 
' PrintPictureToFitPage 
' - Prints a Picture object as big as possible. 
' 
' Prn 
' - Destination Printer object 
' 
' Pic 
' - Source Picture object 
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
Dim PicRatio As Double 
Dim PrnWidth As Double 
Dim PrnHeight As Double 
Dim PrnRatio As Double 
Dim PrnPicWidth As Double 
Dim PrnPicHeight As Double 
Const vbHiMetric As Integer = 8 
' 
' Determine if picture should be printed in landscape 
' or portrait and set the orientation. 
' 
If Pic.Height >= Pic.Width Then 
 Prn.Orientation = vbPRORPortrait 'Taller than wide 
Else 
 Prn.Orientation = vbPRORLandscape 'Wider than tall 
End If 
' 
' Calculate device independent Width to Height ratio for picture. 
' 
PicRatio = Pic.Width / Pic.Height 
' 
' Calculate the dimentions of the printable area in HiMetric. 
' 
With Prn 
 PrnWidth = .ScaleX(.ScaleWidth, .ScaleMode, vbHiMetric) 
 PrnHeight = .ScaleY(.ScaleHeight, .ScaleMode, vbHiMetric) 
End With 
' 
' Calculate device independent Width to Height ratio for printer. 
' 
PrnRatio = PrnWidth / PrnHeight 
' 
' Scale the output to the printable area. 
' 
If PicRatio >= PrnRatio Then 
 ' 
 ' Scale picture to fit full width of printable area. 
 ' 
 PrnPicWidth = Prn.ScaleX(PrnWidth, vbHiMetric, Prn.ScaleMode) 
 PrnPicHeight = Prn.ScaleY(PrnWidth / PicRatio, vbHiMetric, Prn.ScaleMode) 
Else 
 ' 
 ' Scale picture to fit full height of printable area. 
 ' 
 PrnPicHeight = Prn.ScaleY(PrnHeight, vbHiMetric, Prn.ScaleMode) 
 PrnPicWidth = Prn.ScaleX(PrnHeight * PicRatio, vbHiMetric, Prn.ScaleMode) 
End If 
' 
' Print the picture using the PaintPicture method. 
' 
Call Prn.PaintPicture(Pic, 0, 0, PrnPicWidth, PrnPicHeight) 
End Sub 
----------------  
 
  
 作者: 61.142.212.*  2005-10-28 22:22   回复此发言    
 
--------------------------------------------------------------------------------
 
159 bmp->ico  
 ' Bmp2Ico.frm 
' 
' By Herman Liu 
' 
' To show how to make an icon file out of a bitmap, and vice versa. 
' 
' Sometimes you see a nice bitmap picture, or part of it, and want to make it as an icon. 
' You can do what you want now (Just add "file open" and "file save" functions to open the 
' bmp/ico file and save the ico/bmp file respectively. That is, for example, instead of 
' using the existing image in Picture1, load your own. When it is converted into an icon in 
' Picture2, save it to a file name you want. Of course, in this case, you may want to fix 
' the size of the image first). 
' 
' Notes: If you have a copy of my "IconEdit", and you want to give yourself a challenge, you 
' can incorporate this code into it. This will be fairly easy. (Basically, you only need to 
' add a few menu items, as almost all the APIs here are already there, so are all major 
' procedures). In "IconEdit" I have left out many functions, since I don't want to blur the 
' essentials. For example, if I open up just the Region function, there would be 
' implications on Flip/Rotate/Invert and I have to allow region dragging and so on.) 
' 
Option Explicit 
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, _ 
 ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, _ 
 ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long 
  
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, _ 
 ByVal nWidth As Long, ByVal nHeight As Long) As Long 
  
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long 
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, _ 
 ByVal hObject As Long) As Long 
  
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long 
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long 
Private Declare Function CreateIconIndirect Lib "user32" (icoinfo As ICONINFO) As Long 
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (lppictDesc As _ 
 pictDesc, riid As Guid, ByVal fown As Long, ipic As IPicture) As Long 
  
Private Declare Function GetIconInfo Lib "user32" (ByVal hIcon As Long, _ 
 icoinfo As ICONINFO) As Long 
  
Private Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, _ 
 ByVal crColor As Long) As Long 
  
Private Declare Function CreateBitmap Lib "gdi32" (ByVal nWidth As Long, ByVal nHeight _ 
 As Long, ByVal nPlanes As Long, ByVal nBitCount As Long, lpBits As Any) As Long 
  
Private Type ICONINFO 
 fIcon As Long 
 xHotspot As Long 
 yHotspot As Long 
 hBMMask As Long 
 hBMColor As Long 
End Type 
Private Type Guid 
 Data1 As Long 
 Data2 As Integer 
 Data3 As Integer 
 Data4(7) As Byte 
End Type 
Private Type pictDesc 
 cbSizeofStruct As Long 
 picType As Long 
 hImage As Long 
 xExt As Long 
 yExt As Long 
End Type 
Const PICTYPE_BITMAP = 1 
Const PICTYPE_ICON = 3 
Dim iGuid As Guid 
Dim hdcMono 
Dim bmpMono 
Dim bmpMonoTemp 
Const stdW = 32 
Const stdH = 32 
Dim mresult 
 
 
 
  
 作者: 61.142.212.*  2005-10-28 22:25   回复此发言    
 
--------------------------------------------------------------------------------
 
160 bmp->ico  
 Private Sub Form_Load() 
 ' Create monochrome hDC and bitmap 
 hdcMono = CreateCompatibleDC(hdc) 
 bmpMono = CreateCompatibleBitmap(hdcMono, stdW, stdH) 
 bmpMonoTemp = SelectObject(hdcMono, bmpMono) 
 With iGuid 
 .Data1 = &H20400 
 .Data4(0) = &HC0 
 .Data4(7) = &H46 
 End With 
End Sub 
 
Private Sub command1_Click() 
 On Error Resume Next 
 Dim mtransp As Long 
 ' Let us select a background color here (just a matter of choice) 
 picImage.BackColor = Picture1.BackColor 
 ' Area having the following color is to be transparent 
 mtransp = Picture1.Point(0, 0) 
 ' Create transparent part 
 CreateTransparent Picture1, picImage, mtransp 
 ' Create a mask 
 CreateMask_viaMemoryDC picImage, picMask 
 mresult = BitBlt(Picture2.hdc, 0, 0, stdW, stdH, picMask.hdc, 0, 0, vbSrcAnd) 
 mresult = BitBlt(Picture2.hdc, 0, 0, stdW, stdH, picImage.hdc, 0, 0, vbSrcInvert) 
 BuildIcon Picture2 
 SavePicture Picture2.Picture, App.Path & "/Frombmp.ico" 
End Sub 
 
Private Sub command2_Click() 
 On Error Resume Next 
 Dim i, j 
 Dim p, q 
  
 Picture4.Picture = Picture3.Image 
  
'-------------------------------------------------------- 
'NB This following is only a matter of variation, not a must. 
' Let us select the form's color as background color here 
' and replace the existing one with it. 
'-------------------------------------------------------- 
 p = Picture4.Point(0, 0) 
 q = Me.BackColor 
 ' Paint the desired color as if backgound 
 For i = 0 To stdW 
 For j = 0 To stdH 
 If Picture4.Point(i, j) = p Then 
 Picture4.PSet (i, j), q 
 End If 
 Next j 
 Next i 
  
 SavePicture Picture4.Picture, App.Path & "/Fromico.bmp" 
End Sub 
 
' To let you see it again and again. 
Private Sub Command3_Click() 
 Picture2.Picture = LoadPicture() 
End Sub 
Private Sub Command4_Click() 
 Picture4.Picture = LoadPicture() 
End Sub 
 
Private Function CreateMask_viaMemoryDC(Pic1 As PictureBox, Pic2 As PictureBox) As Boolean 
 On Error GoTo errHandler 
 CreateMask_viaMemoryDC = False 
  
 Dim dx As Long, dy As Long 
 Dim hdcMono2 As Long, bmpMono2 As Long, bmpMonoTemp2 As Long 
  
 dx = Pic1.ScaleWidth 
 dy = Pic1.ScaleHeight 
  
 ' Create memory device context (0 is screen, as we want the new 
 ' DC compatible with the screen). 
 hdcMono2 = CreateCompatibleDC(0) 
 If hdcMono2 = 0 Then 
 GoTo errHandler 
 End If 
 ' Create monochrome bitmap, of a wanted size 
 bmpMono2 = CreateCompatibleBitmap(hdcMono2, dx, dy) 
 ' Get a monohrome bitmap by default after putting in the 
 ' above created bitmap into the DC. 
 bmpMonoTemp2 = SelectObject(hdcMono2, bmpMono2) 
 ' Copy bitmap of Pic1 to memory DC to create mono mask of the color bitmap. 
 mresult = BitBlt(hdcMono2, 0, 0, dx, dy, Pic1.hdc, 0, 0, vbSrcCopy) 
 ' Copy mono memory mask to a picture box, as wanted in this case 
 mresult = BitBlt(Pic2.hdc, 0, 0, dx, dy, hdcMono2, 0, 0, vbSrcCopy) 
  
 ' Clean up 
 Call SelectObject(hdcMono2, bmpMonoTemp2) 
 Call DeleteDC(hdcMono2) 
 Call DeleteObject(bmpMono2) 
  
 CreateMask_viaMemoryDC = True 
 Exit Function 
errHandler: 
 MsgBox "MakeMask_viaMemoryDC" 
 
 
  
 作者: 61.142.212.*  2005-10-28 22:25   回复此发言    
 
--------------------------------------------------------------------------------
 
161 bmp->ico  
 End Function 
 
Private Sub ExtractIconComposite(inPic As PictureBox) 
 On Error Resume Next 
 Dim ipic As IPicture 
 Dim icoinfo As ICONINFO 
 Dim pDesc As pictDesc 
 Dim hDCWork 
 Dim hBMOldWork 
 Dim hNewBM 
 Dim hBMOldMono 
  
 GetIconInfo inPic.Picture, icoinfo 
 hDCWork = CreateCompatibleDC(0) 
 hNewBM = CreateCompatibleBitmap(inPic.hdc, stdW, stdH) 
 hBMOldWork = SelectObject(hDCWork, hNewBM) 
 hBMOldMono = SelectObject(hdcMono, icoinfo.hBMMask) 
 BitBlt hDCWork, 0, 0, stdW, stdH, hdcMono, 0, 0, vbSrcCopy 
 SelectObject hdcMono, hBMOldMono 
 SelectObject hDCWork, hBMOldWork 
 With pDesc 
 .cbSizeofStruct = Len(pDesc) 
 .picType = PICTYPE_BITMAP 
 .hImage = hNewBM 
 End With 
 OleCreatePictureIndirect pDesc, iGuid, 1, ipic 
 picMask = ipic 
 Set ipic = Nothing 
  
 pDesc.hImage = icoinfo.hBMColor 
 ' Third parameter set to 1 (true) to let picture be destroyed automatically 
 OleCreatePictureIndirect pDesc, iGuid, 1, ipic 
 picImage = ipic 
  
 DeleteObject icoinfo.hBMMask 
 DeleteDC hDCWork 
 Set hBMOldWork = Nothing 
 Set hBMOldMono = Nothing 
End Sub 
 
Private Sub BuildIcon(inPic As PictureBox) 
 On Error Resume Next 
 Dim hOldMonoBM 
 Dim hDCWork 
 Dim hBMOldWork 
 Dim hBMWork 
 Dim ipic As IPicture 
 Dim pDesc As pictDesc 
 Dim icoinfo As ICONINFO 
 BitBlt hdcMono, 0, 0, stdW, stdH, picMask.hdc, 0, 0, vbSrcCopy 
 SelectObject hdcMono, bmpMonoTemp 
 hDCWork = CreateCompatibleDC(0) 
  
 With inPic 
 hBMWork = CreateCompatibleBitmap(inPic.hdc, stdW, stdH) 
 End With 
  
 hBMOldWork = SelectObject(hDCWork, hBMWork) 
 BitBlt hDCWork, 0, 0, stdW, stdH, picImage.hdc, 0, 0, vbSrcCopy 
 SelectObject hDCWork, hBMOldWork 
  
 With icoinfo 
 .fIcon = 1 
 .xHotspot = 16 ' Doesn't matter here 
 .yHotspot = 16 
 .hBMMask = bmpMono 
 .hBMColor = hBMWork 
 End With 
  
 With pDesc 
 .cbSizeofStruct = Len(pDesc) 
 .picType = PICTYPE_ICON 
 .hImage = CreateIconIndirect(icoinfo) 
 End With 
  
 OleCreatePictureIndirect pDesc, iGuid, 1, ipic 
  
 inPic.Picture = LoadPicture() 
 inPic = ipic 
 bmpMonoTemp = SelectObject(hdcMono, bmpMono) 
 DeleteObject icoinfo.hBMMask 
 DeleteDC hDCWork 
 Set hBMOldWork = Nothing 
End Sub 
 
Sub CreateTransparent(inpicSrc As PictureBox, inpicDest As PictureBox, _ 
 inTrasparentColor As Long) 
 On Error Resume Next 
 Dim mMaskDC As Long 
 Dim mMaskBmp As Long 
 Dim mTempMaskBMP As Long 
 Dim mMonoBMP As Long 
 Dim mMonoDC As Long 
 Dim mTempMonoBMP As Long 
 Dim mSrcHDC As Long, mDestHDC As Long 
 Dim w As Long, h As Long 
  
 w = inpicSrc.ScaleWidth 
 h = inpicSrc.ScaleHeight 
  
 mSrcHDC = inpicSrc.hdc 
 mDestHDC = inpicDest.hdc 
  
 ' Set back color of source pic and dest pic to the desired transparent color 
 mresult = SetBkColor&(mSrcHDC, inTrasparentColor) 
 mresult = SetBkColor&(mDestHDC, inTrasparentColor) 
  
 ' Create a mask DC compatible with dest image 
 mMaskDC = CreateCompatibleDC(mDestHDC) 
 ' and a bitmap of its size 
 mMaskBmp = CreateCompatibleBitmap(mDestHDC, w, h) 
 ' Move that bitmap into mMaskDC 
 mTempMaskBMP = SelectObject(mMaskDC, mMaskBmp) 
  
 ' Meanwhile create another DC for mono bitmap 
 mMonoDC = CreateCompatibleDC(mDestHDC) 
 ' and its bitmap, a mono one (by setting nPlanes and nbitcount 
 ' both to 1) 
 mMonoBMP = CreateBitmap(w, h, 1, 1, 0) 
 mTempMonoBMP = SelectObject(mMonoDC, mMonoBMP) 
  
 ' Copy source image to mMonoDC 
 mresult = BitBlt(mMonoDC, 0, 0, w, h, mSrcHDC, 0, 0, vbSrcCopy) 
  
 ' Copy mMonoDC into mMaskDC 
 mresult = BitBlt(mMaskDC, 0, 0, w, h, mMonoDC, 0, 0, vbSrcCopy) 
 'We don't need mMonoBMP any longer 
 mMonoBMP = SelectObject(mMonoDC, mTempMonoBMP) 
 mresult = DeleteObject(mMonoBMP) 
 mresult = DeleteDC(mMonoDC) 
  
 'Now copy source image to dest image with XOR 
 mresult = BitBlt(mDestHDC, 0, 0, w, h, mSrcHDC, 0, 0, vbSrcInvert) 
  
 'Copy the mMaskDC to dest image with AND 
 mresult = BitBlt(mDestHDC, 0, 0, w, h, mMaskDC, 0, 0, vbSrcAnd) 
  
 'Copy source image to dest image with XOR 
 BitBlt mDestHDC, 0, 0, w, h, mSrcHDC, 0, 0, vbSrcInvert 
 'Picture is there to stay 
 inpicDest.Picture = inpicDest.Image 
  
 ' We don't need these 
 mMaskBmp = SelectObject(mMaskDC, mTempMaskBMP) 
 mresult = DeleteObject(mMaskBmp) 
 mresult = DeleteDC(mMaskDC) 
End Sub 
 
' Last clear up 
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) 
 SelectObject bmpMono, bmpMonoTemp 
 DeleteObject bmpMono 
 DeleteDC hdcMono 
End Sub  
 
  
 
162 从资源文件中读取各种格式图片。  
 Option Explicit 
' 
' Copyright ?1997-1999 Brad Martinez, http://www.mvps.org 
' 
' Demonstrates how to load GIFs and JPGs from file and resource, as well 
' as all other supported graphics formats (bmp, dib, wmf,.emf, ico, cur). 
' 
' Is based loosely on the C code from the following: 
' "Q218972 - SAMPLE: How To Load and Display Graphics Files w/LOADPIC.EXE" 
' http://support.microsoft.com/support/kb/articles/Q218/9/72.ASP 
' 
Private Sub Form_Load() 
 Picture1.TabStop = False 
 Option1(0) = True 
End Sub 
Private Sub Command1_Click() 
 Set Picture1 = PictureFromFile(hwnd) 
End Sub 
Private Sub Option1_Click(Index As Integer) 
 Select Case Index 
 Case 0: Set Picture1 = PictureFromBits(LoadResData("Beany", "bmp")) 
 Case 1: Set Picture1 = PictureFromBits(LoadResData("Busy_l", "cur")) 
 Case 2: Set Picture1 = PictureFromBits(LoadResData("Cartman", "jpg")) 
 Case 3: Set Picture1 = PictureFromBits(LoadResData("ccrpAbout", "gif")) 
 Case 4: Set Picture1 = PictureFromBits(LoadResData("Desktop", "ico")) 
 Case 5: Set Picture1 = PictureFromBits(LoadResData("Moneybag", "wmf")) 
 End Select 
End Sub 
-------- 
Option Explicit 
' 
' Copyright ?1997-1999 Brad Martinez, http://www.mvps.org 
' 
Public Enum CBoolean ' enum members are Long data types 
 CFalse = 0 
 CTrue = 1 
End Enum 
Public Const S_OK = 0 ' indicates successful HRESULT 
'WINOLEAPI CreateStreamOnHGlobal( 
' HGLOBAL hGlobal, // Memory handle for the stream object 
' BOOL fDeleteOnRelease, // Whether to free memory when the object is released 
' LPSTREAM * ppstm // Indirect pointer to the new stream object 
'); 
Declare Function CreateStreamOnHGlobal Lib "ole32" _ 
 (ByVal hGlobal As Long, _ 
 ByVal fDeleteOnRelease As CBoolean, _ 
 ppstm As Any) As Long 
'STDAPI OleLoadPicture( 
' IStream * pStream, // Pointer to the stream that contains picture's data 
' LONG lSize, // Number of bytes read from the stream 
' BOOL fRunmode, // The opposite of the initial value of the picture's property 
' REFIID riid, // Reference to the identifier of the interface describing the type 
' // of interface pointer to return 
' VOID ppvObj // Indirect pointer to the object, not AddRef'd!! 
'); 
Declare Function OleLoadPicture Lib "olepro32" _ 
 (pStream As Any, _ 
 ByVal lSize As Long, _ 
 ByVal fRunmode As CBoolean, _ 
 riid As GUID, _ 
 ppvObj As Any) As Long 
Public Type GUID ' 16 bytes (128 bits) 
 dwData1 As Long ' 4 bytes 
 wData2 As Integer ' 2 bytes 
 wData3 As Integer ' 2 bytes 
 abData4(7) As Byte ' 8 bytes, zero based 
End Type 
Declare Function CLSIDFromString Lib "ole32" (ByVal lpsz As Any, pclsid As GUID) As Long 
Public Const sIID_IPicture = "{7BF80980-BF32-101A-8BBB-00AA00300CAB}" 
Public Const GMEM_MOVEABLE = &H2 
Declare Function GlobalAlloc Lib "kernel32" (ByVal uFlags As Long, ByVal dwBytes As Long) As Long 
Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long 
Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long 
Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long 
Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal dwLength As Long) 
 
 
  
 作者: 61.142.212.*  2005-10-28 22:27   回复此发言    
 
--------------------------------------------------------------------------------
 
163 从资源文件中读取各种格式图片。  
 
' ==================================================================== 
Public Const MAX_PATH = 260 
Public Type OPENFILENAME ' ofn 
 lStructSize As Long 
 hWndOwner As Long 
 hInstance As Long 
 lpstrFilter As String 
 lpstrCustomFilter As String 
 nMaxCustFilter As Long 
 nFilterIndex As Long 
 lpstrFile As String 
 nMaxFile As Long 
 lpstrFileTitle As String 
 nMaxFileTitle As Long 
 lpstrInitialDir As String 
 lpstrTitle As String 
 Flags As Long 
 nFileOffset As Integer 
 nFileExtension As Integer 
 lpstrDefExt As String 
 lCustData As Long 
 lpfnHook As Long 
 lpTemplateName As String 
End Type 
' OPENFILENAME Flags 
Public Const OFN_HIDEREADONLY = &H4 
Public Const OFN_FILEMUSTEXIST = &H1000 
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long 
' 
Public Function PictureFromFile(hwnd As Long, Optional sFile As String = "") As StdPicture 
 Dim ofn As OPENFILENAME 
 Dim ff As Integer 
 Dim abFile() As Byte 
  
 ' If a file's path is not specified show the dialog. 
 If (Len(sFile) = 0) Then 
 With ofn 
 .lStructSize = Len(ofn) 
 .hWndOwner = hwnd 
 .lpstrFilter = "All Picture Files" & vbNullChar & "*.bmp;*.dib;*.gif;*.jpg;*.wmf;*.emf;*.ico;*.cur" & vbNullChar & _ 
 "Bitmaps (*.bmp;*.dib)" & vbNullChar & "*.bmp;*.dib" & vbNullChar & _ 
 "GIF Images (*.gif)" & vbNullChar & "*.gif" & vbNullChar & _ 
 "JPEG Images (*.jpg)" & vbNullChar & "*.jpg" & vbNullChar & _ 
 "Metafiles (*.wmf;*.emf)" & vbNullChar & "*.wmf;*.emf" & vbNullChar & _ 
 "Icons (*.ico;*.cur)" & vbNullChar & "*.ico;*.cur" & vbNullChar & _ 
 "All Files (*.*)" & vbNullChar & "*.*" & vbNullChar & vbNullChar 
 .lpstrFile = String$(MAX_PATH, 0) 
 .nMaxFile = MAX_PATH 
 .Flags = OFN_HIDEREADONLY Or OFN_FILEMUSTEXIST 
 End With 
  
 If GetOpenFileName(ofn) Then 
 sFile = Left$(ofn.lpstrFile, InStr(ofn.lpstrFile, vbNullChar) - 1) 
 End If 
 End If 
  
 ' If we have a file path, load it into a byte array and try to make 
 ' a picture out of it... 
 If Len(sFile) Then 
 ff = FreeFile 
 Open sFile For Binary As ff 
 ReDim abFile(LOF(ff) - 1) 
 Get #ff, , abFile 
 Close ff 
  
 Set PictureFromFile = PictureFromBits(abFile) 
 End If 
  
End Function 
Public Function PictureFromBits(abPic() As Byte) As IPicture ' not a StdPicture!! 
 Dim nLow As Long 
 Dim cbMem As Long 
 Dim hMem As Long 
 Dim lpMem As Long 
 Dim IID_IPicture As GUID 
 Dim istm As stdole.IUnknown ' IStream 
 Dim ipic As IPicture 
  
 ' Get the size of the picture's bits 
 On Error GoTo Out 
 nLow = LBound(abPic) 
 On Error GoTo 0 
 cbMem = (UBound(abPic) - nLow) + 1 
  
 ' Allocate a global memory object 
 hMem = GlobalAlloc(GMEM_MOVEABLE, cbMem) 
 If hMem Then 
  
 ' Lock the memory object and get a pointer to it. 
 lpMem = GlobalLock(hMem) 
 If lpMem Then 
  
 ' Copy the picture bits to the memory pointer and unlock the handle. 
 MoveMemory ByVal lpMem, abPic(nLow), cbMem 
 Call GlobalUnlock(hMem) 
  
 ' Create an ISteam from the pictures bits (we can explicitly free hMem 
 ' below, but we'll have the call do it...) 
 If (CreateStreamOnHGlobal(hMem, CTrue, istm) = S_OK) Then 
 If (CLSIDFromString(StrPtr(sIID_IPicture), IID_IPicture) = S_OK) Then 
  
 ' Create an IPicture from the IStream (the docs say the call does not 
 ' AddRef its last param, but it looks like the reference counts are correct..) 
 Call OleLoadPicture(ByVal ObjPtr(istm), cbMem, CFalse, IID_IPicture, PictureFromBits) 
  
 End If ' CLSIDFromString 
 End If ' CreateStreamOnHGlobal 
 End If ' lpMem 
  
' Call GlobalFree(hMem) 
 End If ' hMem 
  
Out: 
End Function  
 
  
 
164 全屏的下雪场景制作  
 Dim Snow(1000, 2), Amounty As Integer 
Private Sub Form_Load() 
Form1.Show 
DoEvents 
Randomize: Amounty = 325 
For J = 1 To Amounty 
Snow(J, 0) = Int(Rnd * Form1.Width) 
Snow(J, 1) = Int(Rnd * Form1.Height) 
Snow(J, 2) = 10 + (Rnd * 20) 
Next J 
Do While Not (DoEvents = 0) 
For LS = 1 To 10 
For I = 1 To Amounty 
OldX = Snow(I, 0): OldY = Snow(I, 1): Snow(I, 1) = Snow(I, 1) + Snow(I, 2) 
If Snow(I, 1) > Form1.Height Then Snow(I, 1) = 0: Snow(I, 2) = 5 + (Rnd * 30): Snow(I, 0) = Int(Rnd * Form1.Width): OldX = 0: OldY = 0 
Coloury = 8 * (Snow(I, 2) - 10): Coloury = 60 + Coloury: PSet (OldX, OldY), QBColor(0): PSet (Snow(I, 0), Snow(I, 1)), RGB(Coloury, Coloury, Coloury) 
Next I 
Next LS 
Label1.Refresh 
Loop 
End 
End Sub 
Private Sub Timer1_Timer() 
End Sub 
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) 
End 
End Sub  
 
  
 作者: 61.142.212.*  2005-10-28 22:30   回复此发言    
 
--------------------------------------------------------------------------------
 
165 雨滴特效显示图片  
 '需求一个PictureBox( Named picture2),一个Command按键) 
Option Explicit 
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, _ 
 ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, _ 
 ByVal nHeight As Long, ByVal hSrcDC As Long, _ 
 ByVal xSrc As Long, ByVal ySrc As Long, _ 
 ByVal dwRop As Long) As Long 
Private Declare Function CreateCompatibleDC Lib "gdi32" _ 
 (ByVal hdc As Long) As Long 
Private Declare Function SelectObject Lib "gdi32" _ 
 (ByVal hdc As Long, ByVal hObject As Long) As Long 
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long 
Const SRCCOPY = &HCC0020 
Private Picture1 As New StdPicture 
Private Sub Command1_Click() 
 Dim i As Long 
 Dim j As Long 
 Dim height5 As Long, width5 As Long 
 Dim hMemDc As Long 
 'stdPicture物件的度量单位是Himetric所以要转换成Pixel 
 height5 = ScaleY(Picture1.Height, vbHimetric, vbPixels) 
 If height5 > Picture2.ScaleHeight Then 
 height5 = Picture2.ScaleHeight 
 End If 
 width5 = ScaleX(Picture1.Width, vbHimetric, vbPixels) 
 If width5 > Picture2.ScaleWidth Then 
 width5 = Picture2.ScaleWidth 
 End If 
 'Create Memory DC 
 hMemDc = CreateCompatibleDC(Picture2.hdc) 
 '将Picture1的BitMap图指定给hMemDc 
 Call SelectObject(hMemDc, Picture1.Handle) 
 For i = height5 To 1 Step -1 
 Call BitBlt(Picture2.hdc, 0, i, width5, 1, _ 
 hMemDc, 0, i, SRCCOPY) 
 For j = i - 1 To 1 Step -1 
 Call BitBlt(Picture2.hdc, 0, j, width5, 1, _ 
 hMemDc, 0, i, SRCCOPY) 
 Next j 
 Next 
 Call DeleteDC(hMemDc) 
End Sub 
Private Sub Form_Load() 
 Dim i As Long 
 Picture2.ScaleMode = 3 '设定成Pixel的度量单位 
 '设定待Display的图 
 Set Picture1 = LoadPicture("benz-sl.jpg") 
End Sub  
 
  
 
166 一个像“南极星”的自动隐藏工具栏。(推荐)  
 Option Explicit 
Dim BarData As APPBARDATA 
Dim bAutoHide As Boolean 
Dim bAnimate As Boolean 
Private Sub Form_Load() 
 Dim lResult As Long 
 Move 0, 0, 0, 0 
 Screen.MousePointer = vbDefault 
  
 bAutoHide = True 
 bAnimate = True 
  
 BarData.cbSize = Len(BarData) 
 BarData.hwnd = hwnd 
 BarData.uCallbackMessage = WM_MOUSEMOVE 
 lResult = SHAppBarMessage(ABM_NEW, BarData) 
 lResult = SetRect(BarData.rc, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)) 
 BarData.uEdge = ABE_TOP 
 lResult = SHAppBarMessage(ABM_QUERYPOS, BarData) 
 If bAutoHide Then 
 BarData.rc.Bottom = BarData.rc.Top + 2 'tbrToolBar.Bands("ToolBar").Height + 6 
 lResult = SHAppBarMessage(ABM_SETPOS, BarData) 
 BarData.lParam = True 
 lResult = SHAppBarMessage(ABM_SETAUTOHIDEBAR, BarData) 
 If lResult = 0 Then 
 bAutoHide = False 
 Else 
 lResult = SetWindowPos(BarData.hwnd, HWND_TOP, BarData.rc.Left, BarData.rc.Top - 42, BarData.rc.Right - BarData.rc.Left, 44, SWP_NOACTIVATE) 
 End If 
 End If 
 If Not bAutoHide Then 
 BarData.rc.Bottom = BarData.rc.Top + 42 
 lResult = SHAppBarMessage(ABM_SETPOS, BarData) 
 lResult = SetWindowPos(BarData.hwnd, HWND_TOP, BarData.rc.Left, BarData.rc.Top, BarData.rc.Right - BarData.rc.Left, 42, SWP_NOACTIVATE) 
 End If 
End Sub 
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single) 
 Static bRecieved As Boolean 
 Dim lResult As Long 
 Dim newRC As RECT 
 Dim lMessage As Long 
  
 lMessage = x / Screen.TwipsPerPixelX 
  
 If bRecieved = False Then 
 bRecieved = True 
 Select Case lMessage 
 Case WM_ACTIVATE 
 lResult = SHAppBarMessage(ABM_ACTIVATE, BarData) 
 Case WM_WINDOWPOSCHANGED 
 lResult = SHAppBarMessage(ABM_WINDOWPOSCHANGED, BarData) 
 Case ABN_STATECHANGE 
 lResult = SetRect(BarData.rc, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)) 
 BarData.uEdge = ABE_TOP 
 lResult = SHAppBarMessage(ABM_QUERYPOS, BarData) 
 If bAutoHide Then 
 BarData.rc.Bottom = BarData.rc.Top + 2 
 lResult = SHAppBarMessage(ABM_SETPOS, BarData) 
 BarData.lParam = True 
 lResult = SHAppBarMessage(ABM_SETAUTOHIDEBAR, BarData) 
 If lResult = 0 Then 
 bAutoHide = False 
 Else 
 lResult = SetWindowPos(BarData.hwnd, HWND_TOP, BarData.rc.Left, BarData.rc.Top - 42, BarData.rc.Right - BarData.rc.Left, 44, SWP_NOACTIVATE) 
 End If 
 End If 
 If Not bAutoHide Then 
 BarData.rc.Bottom = BarData.rc.Top + 42 
 lResult = SHAppBarMessage(ABM_SETPOS, BarData) 
 lResult = SetWindowPos(BarData.hwnd, HWND_TOP, BarData.rc.Left, BarData.rc.Top, BarData.rc.Right - BarData.rc.Left, 42, SWP_NOACTIVATE) 
 End If 
 Case ABN_FULLSCREENAPP 
 Beep 
 End Select 
 bRecieved = False 
 End If 
End Sub 
Private Sub Form_Resize() 
 picFrame.Move 0, 0, Width, Height 
End Sub 
Private Sub Form_Unload(Cancel As Integer) 
 If BarData.hwnd <> 0 Then SHAppBarMessage ABM_REMOVE, BarData 
End Sub 
Private Sub picFrame_DblClick() 
 Unload Me 
End Sub 
Private Sub picFrame_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single) 
 Dim lResult As Long 
 Dim iCounter As Integer 
 
 
  
 
167 一个像“南极星”的自动隐藏工具栏。(推荐)  
  If Top < 0 Then 
 If bAnimate Then 
 For iCounter = -36 To -1 
 BarData.rc.Top = iCounter 
 lResult = SetWindowPos(BarData.hwnd, 0&, BarData.rc.Left, BarData.rc.Top, BarData.rc.Right - BarData.rc.Left, 42, SWP_NOACTIVATE) 
 Next 
 End If 
 BarData.rc.Top = 0 
 lResult = SetWindowPos(BarData.hwnd, HWND_TOPMOST, BarData.rc.Left, BarData.rc.Top, BarData.rc.Right - BarData.rc.Left, 42, SWP_SHOWWINDOW) 
 tmrHide.Enabled = True 
 End If 
End Sub 
Private Sub tmrHide_Timer() 
 Dim lResult As Long 
 Dim lpPoint As POINTAPI 
 Dim iCounter As Integer 
 lResult = GetCursorPos(lpPoint) 
 If lpPoint.x < Left \ Screen.TwipsPerPixelX Or lpPoint.x > (Left + Width) \ Screen.TwipsPerPixelX Or lpPoint.y < Top \ Screen.TwipsPerPixelY Or lpPoint.y - 10 > (Top + Height) \ Screen.TwipsPerPixelY Then 
 If bAnimate Then 
 For iCounter = -1 To -37 Step -1 
 BarData.rc.Top = iCounter 
 lResult = SetWindowPos(BarData.hwnd, 0&, BarData.rc.Left, BarData.rc.Top, BarData.rc.Right - BarData.rc.Left, 42, SWP_NOACTIVATE) 
 Next 
 End If 
 BarData.rc.Top = -42 
 lResult = SetWindowPos(BarData.hwnd, HWND_TOPMOST, BarData.rc.Left, BarData.rc.Top, BarData.rc.Right - BarData.rc.Left, 44, SWP_NOACTIVATE) 
 tmrHide.Enabled = False 
 End If 
End Sub 
---------- 
Option Explicit 
Type POINTAPI 
 x As Long 
 y As Long 
End Type 
Type RECT 
 Left As Long 
 Top As Long 
 Right As Long 
 Bottom As Long 
End Type 
Type APPBARDATA 
 cbSize As Long 
 hwnd As Long 
 uCallbackMessage As Long 
 uEdge As Long 
 rc As RECT 
 lParam As Long ' message specific 
End Type 
Declare Function SHAppBarMessage Lib "shell32.dll" (ByVal dwMessage As Long, pData As APPBARDATA) As Long 
Declare Function SetRect Lib "user32" (lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long 
Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long 
Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long 
Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long 
Public Const WM_MOUSEMOVE = &H200 
Public Const WM_ACTIVATE = &H6 
Public Const WM_WINDOWPOSCHANGED = &H47 
Public Const ABE_BOTTOM = 3 
Public Const ABE_LEFT = 0 
Public Const ABE_RIGHT = 2 
Public Const ABE_TOP = 1 
Public Const ABM_ACTIVATE = &H6 
Public Const ABM_GETAUTOHIDEBAR = &H7 
Public Const ABM_GETSTATE = &H4 
Public Const ABM_GETTASKBARPOS = &H5 
Public Const ABM_NEW = &H0 
Public Const ABM_QUERYPOS = &H2 
Public Const ABM_REMOVE = &H1 
Public Const ABM_SETAUTOHIDEBAR = &H8 
Public Const ABM_SETPOS = &H3 
Public Const ABM_WINDOWPOSCHANGED = &H9 
Public Const ABN_FULLSCREENAPP = &H2 
Public Const ABN_POSCHANGED = &H1 
Public Const ABN_STATECHANGE = &H0 
Public Const ABN_WINDOWARRANGE = &H3 
Public Const SM_CXSCREEN = 0 
Public Const SM_CYSCREEN = 1 
Public Const HWND_TOP = 0 
Public Const HWND_TOPMOST = -1 
Public Const SWP_NOACTIVATE = &H10 
Public Const SWP_SHOWWINDOW = &H40  
 
  
 
168 类似于东方快车工具条的东东的源码。(推荐)  
 '程序∶池星泽 
'获得鼠标指针在屏幕坐标上的位置 
Private Declare Function GetCursorPos Lib "user32" _ 
 (lpPoint As POINTAPI) As Long 
'获得窗口在屏幕坐标中的位置 
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, _ 
 lpRect As RECT) As Long 
'判断指定的点是否在指定的巨型内部 
Private Declare Function PtInRect Lib "user32" (lpRect As RECT, _ 
 ByVal ptx As Long, ByVal pty As Long) As Long 
'准备用来使窗体始终在最前面 
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter _ 
 As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags _ 
 As Long) As Long 
'用来移动窗体 
Private Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal X As Long, _ 
 ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, _ 
 ByVal bRepaint As Long) As Long 
Const HWND_TOPMOST = -1 
  
Private Type POINTAPI 
 X As Long 
 Y As Long 
End Type 
Private Type RECT 
 Left As Long 
 Top As Long 
 Right As Long 
 Bottom As Long 
End Type 
Private Is_Move_B As Boolean '判断指针是否位于移动栏(本例中移动栏位于窗体的侧一小地方) 
Private Is_Movestar_B As Boolean '判断移动是否开始 
Private MyRect As RECT 
Private MyPoint As POINTAPI 
Private Movex As Long, Movey As Long '记录窗体移动前,窗体左上角与鼠标指针位置间的纵横距离 
Private max As Long '窗口变长以后的尺寸(用户可随意改动) 
Private Sub Command1_Click(Index As Integer) 
 Form1.SetFocus 
 Select Case Index 
 Case 0 
 Form1.PopupMenu Form2.mnu_file, vbPopupMenuLeftAlign, 240, max - 30 
 Case 1 
 Case 7 
 Command1(8).Enabled = Not Command1(8).Enabled 
 If Command1(8).Enabled = True Then 
 Command1(7).Picture = Image2(1).Picture 
 Picture1.Width = 4455 
 Form1.Width = Form1.Width + 1820 
 Else 
 Command1(7).Picture = Image2(0).Picture 
 Picture1.Width = 2645 
 Form1.Width = Form1.Width - 1820 
 End If 
 Line (0, 0)-(Form1.Width, Form1.Height), vbBlue, BF 
 Get_Windows_Rect 
 '...... 
 Case 13 
 End 
 ' ..... 
 End Select 
End Sub 
Private Sub Form_Load() 
 Timer1.Interval = 50: Timer2.Interval = 1000 
 Form1.BackColor = vbBlue 
 Get_Windows_Rect 
End Sub 
Sub Get_Windows_Rect() 
 Dim dl& 
 max = 390: Form1.Height = max 
 Form1.Top = 0 '窗体始终放在屏幕顶部 
 dl& = GetWindowRect(Form1.hwnd, MyRect) 
End Sub 
Private Sub Form_Paint() 
 '使窗体始终置于最前面 
 If PtInRect(MyRect, MyPoint.X, MyPoint.Y) = 0 Then 
 SetWindowPos Me.hwnd, HWND_TOPMOST, Me.Left / Screen.TwipsPerPixelX, _ 
 Me.Top \ Screen.TwipsPerPixelY, Me.Width \ Screen.TwipsPerPixelX, _ 
 Form1.Height \ Screen.TwipsPerPixelY, 0 
 End If 
End Sub 
Private Sub Image1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) 
If Is_Move_B Then 
 Movex = MyPoint.X - MyRect.Left 
 Movey = MyPoint.Y - MyRect.Top 
 Is_Movestar_B = True 
End If 
End Sub 
Private Sub Image1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 
 Dim dl& 
 If Is_Movestar_B Then 
 dl& = MoveWindow(Form1.hwnd, MyPoint.X - Movex, MyPoint.Y - Movey, _ 
 MyRect.Right - MyRect.Left, MyRect.Bottom, -1) 
 End If 
End Sub 
Private Sub Image1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) 
 Get_Windows_Rect 
 Is_Movestar_B = False 
End Sub 
Private Sub Timer1_Timer() 
 Dim dl& 
 dl& = GetCursorPos(MyPoint) 
 If (PtInRect(MyRect, MyPoint.X, MyPoint.Y) And _ 
 Form1.Height = max) Or MyPoint.Y <= 3 Then 
 ' If MyPoint.Y <= 3 Then 
 Form1.BackColor = vbBlue '窗体背景颜色(用户可随意改动) 
 Form1.Height = max 
 '判断鼠标指针是否位于窗体拖动区 
 If MyPoint.X - MyRect.Left <= 10 Or Is_Movestar_B Then 
 Screen.MousePointer = 15 
 Is_Move_B = True 
 Else 
 Screen.MousePointer = 0 
 Is_Move_B = False 
 End If 
 Else 
 If Not Is_Movestar_B Then 
 Form1.Height = 30 '窗体变小 
 End If 
 End If 
End Sub 
Private Sub Timer2_Timer() 
 Static color As Integer 
 If color > 64 Then color = 0 
 Line (0, 0)-(Form1.Width, Form1.Height), QBColor(color Mod 16), BF 
 color = color + 15 
End Sub 
--------- 
Private Sub mnu_exit_Click() 
 End 
End Sub  
 
  
 
169 cool bg  
 '1.程式名称:炫彩式的启动表单 
'2.开发日期:05/28/1999 
'3.开发环境:Visual Basic 5.0 中文专业版 + SP3 
'4.作者姓名:宋世杰 (小翰,Jaric) 
'5.作者信箱:jaric@tacocity.com.tw 
'6.作者网址:http://fly.to/jaric 或 http://tacocity.com.tw/jaric 
'7.网址名称:Visual Basic 实战网 
'8.注意事项:您可以任意散布本程式,但是请勿将以上说明删除,谢谢! 
' 如果本程式经过您的修改,可以在下方加入您的个人资讯。 
'VB编程乐园 http://www.vbeden.com 整理 
Option Explicit 
Public Sub splash(obj As Object, r As Byte, g As Byte, b As Byte, fr As Byte, fg As Byte, fb As Byte, no As Long) 
 Dim i As Long, n1 As Single, n2 As Single 
 For i = 0 To no 
 n2 = i / no 
 n1 = 1 - n2 
 obj.BackColor = RGB(Int(r * n1 + fr * n2), _ 
 Int(g * n1 + fg * n2), Int(b * n1 + fb * n2)) 
 DoEvents 
 Next 
End Sub 
Private Sub Command1_Click() 
 Call splash(Command1, 255, 0, 0, 255, 255, 0, 50) 
End Sub 
Private Sub Form_Load() 
 Dim msg As String 
 Show 
 Call splash(Me, 255, 0, 0, 0, 0, 255, 3000) 
 Call splash(Me, 0, 0, 255, 0, 255, 0, 3000) 
 msg = "VB实战网 http://fly.to/jaric" 
 FontSize = 18 
 FontBold = True 
 CurrentX = (ScaleWidth - TextWidth(msg)) / 2 
 CurrentY = (ScaleHeight - TextHeight(msg)) / 2 
 Print msg 
End Sub  
 
 
170 制作半透明窗体  
 函数SetLayeredWindowAttributes 
  使用这个函数,可以轻松的实现半透明窗体。按照微软的要求,透明窗体窗体在创建时应使用WS_EX_LAYERED参数(用CreateWindowEx),或者在创建后设置该参数(用SetWindowLong),我选用后者。全部函数、常量声明如下:  
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long  
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long 
Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long  
   其中hwnd是透明窗体的句柄,crKey为颜色值,bAlpha是透明度,取值范围是[0,255],dwFlags是透明方式,可以取两个值:当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效;当取值为LWA_COLORKEY时,bAlpha参数有效而窗体中的所有颜色为crKey的地方将变为透明--这个功能很有用:我们不必再为建立不规则形状的窗体而调用一大堆区域分析、创建、合并函数了,只需指定透明处的颜色值即可,哈哈哈哈!请看具体代码。 
Private Const WS_EX_LAYERED = &H80000 
Private Const GWL_EXSTYLE = (-20) 
Private Const LWA_ALPHA = &H2 
Private Const LWA_COLORKEY = &H1 
代码一:一个半透明窗体 
Private Sub Form_Load() 
  Dim rtn As Long 
  rtn = GetWindowLong(hwnd, GWL_EXSTYLE) 
  rtn = rtn Or WS_EX_LAYERED 
  SetWindowLong hwnd, GWL_EXSTYLE, rtn 
  SetLayeredWindowAttributes hwnd, 0, 200, LWA_ALPHA 
End Sub 
代码二:形状不规则的窗体 
Private Sub Form_Load() 
  Dim rtn As Long 
  BorderStyler=0 
  rtn = GetWindowLong(hwnd, GWL_EXSTYLE) 
  rtn = rtn Or WS_EX_LAYERED 
  SetWindowLong hwnd, GWL_EXSTYLE, rtn 
  SetLayeredWindowAttributes hwnd, &HFF0000, 0, LWA_COLORKEY '将扣去窗口中的蓝色 
End Sub  
 
  
 
171 用VB实现队列播放MP3  
   队列播放MP3就是在文件列表框中一次选择多个MP3文件,让播放程序顺序地播放选择的MP3文件。这是一般的MP3播放器都有的功能,如何在VB程序设计中来实现队列播放MP3的方法呢?  
  首先介绍一下程序中要用到的MediaPlayer控件。它不是VB的标准控件,而是Windows操作系统自带的一个多媒体控件。大家可以在VB开发环境中的单击“工程”→“部件”对话框中,添加MediaPlayer控件。如果要播放MP3,则至少要6.01以上版本的MediaPlayer控件(Windows98中自带的就是这个版本)。如果在部件对话框中找不到MicroSoft Mediaplayer Control,那可能是你没有安装附件所致,这需要在系统中安装相应的附件。  
  正因为使用了Windows自带的控件,所以编出的程序的可移植性很好,更为重要的是,MediaPlayer控件可以播放包括AVI、MOV、WAV、MPG、MP3、M3U、QT等等在内的28种多媒体视频、音频格式的文件,可谓功能强大。  
  这个程序正是利用了MediaPlayer控件可以播放MP3和M3U文件的特性来实现队列播放MP3的。我再说一下M3U文件,这种文件实际上是ASCII码文件,如果你用记事本打开它,就可以发现文件的内容实际上就是多媒体文件的地址列表,能够播放它的程序会顺序播放文件里列出的多媒体文件。  
  下面就是程序的实现步骤:  
  首先建立一个新窗体Form1,添加DriveListBox,DirListBox,FileListBox各一个,Caption属性分别设为Drive1,Dir1和File1,再添加CommandButton以及MediaPlayer控件各一个。然后编写代码如下:  
  Option Explicit  
  Private Sub Command1_Click()  
  Dim num As Integer  
  Dim filename As String  
  Dim filenum As Integer  
  Dim i As Integer  
  num=File1.ListCount  
  filenum=FreeFile  
  Open 〃C:filelist.m3u〃 For Output As #filenum  
  For i=0 To num-1  
   If File1.Selected(i) Then  
    filename=File1.Path+〃〃+File1.List(i)  
   End If  
   Print #filenum,filename  
  Next  
  Close #filenum  
  MediaPlayer1.filename=〃C:filelist.m3u〃  
  End Sub  
  Private Sub Dir1_Change()  
  File1.Path=Dir1.Path  
  End Sub  
  Private Sub Drive1_Change()  
  Dir1.Path=Drive1.Drive  
  End Sub  
  程序在Win98系统中调试通过。使用的时候只要选好MP3歌曲所在的文件夹,在文件框中用Shift或Ctrl键选择多个文件即可实现队列播放。  
  怎么样,快去编写自己的WinAmp吧。  
 
  
 
172 制作自己的MP3播放器  
  MP3的名字在当今这个世界上无疑是非常“亮”的了,而且,和MP3有关的东西也是异常火暴,比如MP3播放器。我们今天自己来设计一个MP3的播放器,当然,是不能随身携带的……  
  我们选择一个名为MP3PLAY的控件,它是由德国Dialog Dedien公司编写设计的,我们可以选用自己熟悉的语言来对它进行控制,这里我们使用VB。  
  首先,看看和这个控件有关的一些东西,比如:控件的属性、事件、方法。  
  属性:(按字母的顺序排列)  
  BitRate,Mp3流的比特率。ChannelMode,用于规定声道的工作模式,若值为0,则为立体声;为1,则是左声道;2为右声道;3为单声道。FrameCount,已打开的MP3流的总帧数。FrameNotifyCount,有这样的功能:播放指定的帧数以后,控件自动向我们的客户程序发出一个消息,而我们的程序就可以通过这个消息来进行一些处理,比如在显示器上进行一些提示等等。HasChecksuns,返回校验信息。IsCopyrighted,返回版权信息。IsOriginal,返回复制信息。Layer,MP3流所采用的编码层次。TotalTime,以毫秒为单位计算的回放的总时间。MsPerFrame,以毫秒为单位计算的每帧占用的时间。SampleFrequency,采样的速率。  
  可写的属性:FrameNotifyCount、ChannelMode。  
  可读的属性:所有的。  
  事件:  
  ActFrame,每播放由FrameNotifyCount指定的帧数以后就产生一次该事件,并在参数中给出了当前播放的帧号。AboutBox(),显示关于对话框。Authorize(Name,Password),在该控件注册以后,会得到一个注册号,否则,这个控件就是未经合法授权的,则只能播放MP3文件的前30秒,在注册以后,该方法会将授权号输入给控件,如果授权号与用户名合法,则控件返回0,否则返回5。Close(),关闭MP3文件。GetVolumeLeft()、GetVolumeRight(),返回左右声道的音量的大小,值的范围是0至65536。GetVolumeLeftP()、GetVolumeRightP(),以百分比的形式返回左右声道的音量的大小。Open(InputFile,OutputFile),打开InputFile指定的MP3文件,以WAV的形式写入OutputFile指定的WAV 文件,如果OutputFile为空的话,则MP3解码将直接从声卡播放出来。Play(),开始播放已打开的MP3文件。Pause(),暂停播放,再次调用时恢复。SetVolume()、SetVolumeP(),设置系统播放时的音量。SetErrorMode(Errmode),设置错误报告模式,Errmode为0时表示在各个方法调用结束直接返回错误代码,为1时表示采用标准的OLE异常处理方式。stop(),停止播放。Seek(Frame),跳到指定的帧数。  
  好了,下来看看原代码吧:  
  Private Sub Command1_Click()  
  Text1.Visible = False  
  a = Mp3Play1.Open(〃c:love.mp3〃, 〃 〃)  
  Mp3Play1.Play  
  End Sub  
  Private Sub Command2_Click()  
  Mp3Play1.Close  
  End  
  End Sub  
  在这里,有两个命令按钮,一个名为“播放”,另一个名为“结束”,代码如上。另外,这个程序仅仅是一个例子,还有许多需要改进的地方,诸如界面、功能等等许多东西,这里就不多说了。相信这个例程和上面对控件的介绍已经可以实现许多功能强大的播放器了,是不是?  
 
  
 作者: 61.142.212.*  2005-10-28 22:50   回复此发言    
 
--------------------------------------------------------------------------------
 
173 制作TopMost窗口  
 制作TopMost窗口很简单,只需一个API函数就可以实现。  
下面的例子就实现了这个功能。  
>>步骤1----建立新工程,在窗体上放置一个CommandButton按钮。  
>>步骤2----编写如下代码:  
Private Const SWP_NOSIZE = &H1  
Private Const SWP_NOMOVE = &H2  
Private Const HWND_TOPMOST = -1  
Private Declare Function SetWindowPos Lib \"user32\" ( _  
ByVal hwnd As Long,ByVal hWndInsertAfter As Long, _  
ByVal X As Long,ByVal Y As Long, _  
ByVal cx As Long, ByVal cy As Long, _  
ByVal wFlags As Long) As Long  
Private Sub Command1_Click()  
SetWindowPos hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE _  
Or SWP_NOSIZE  
End Sub  
>>步骤3----编译运行,点击Command1,看看是不是始终位于最上层。  
要去掉TopMost属性,只要将参数HWND_TOPMOST换成HWND_NOTOPMOST,  
当然,得说明常量:HWND_NOTOPMOST = -2  
 
  
174 利用VB控件操作目录和文件夹  
 利用VB控件操作目录和文件夹 【字体:大 中 小】  
作者:[Gdibn] 来源:[互动网络] 浏览:[ 113 ] 评论:[0]  
  
  
 第 1 页  
  
  (一) 察看和显示目录下的文件和文件夹  
  对于这个实现,其实很简单。首先想到的就是VB中给我们提供的现成的控件。主要有这么两类:  
  一类是驱动器列表框(DriveListBox)、目录列表框(DirListBox)和文件列表框(FileListBox)三个控件组合而成的自定义对话框;  
  另一类是windows提供的标准对话框。  
  他们在工具箱中的位置和图标如下所示:  
 
 
  1、驱动器列表框是一个下拉式的列表框,他和一般下拉式的列表框的不同仅在于功能上的不同,它提供了一个驱动器的列表。当单击右边的箭头时,则弹出计算机中的所有驱动器的下拉列表。默认状态下,在驱动器列表中显示的是当前驱动器,我们可以输入或从下拉列表中选择有效的驱动器标示符。  
 
 
  下面是它的主要属性,事件和方法.  
  属性Drive本属性用于返回或设置运行时选择的驱动器.默认值为当前驱动器  
  改变Drive属性会触发Change事件.  
  示例: Drive1.Drive = “c:”  
  设置C盘为当前驱动器.  
  事件Change当选择一个新驱动器或通过代码改变了Drive属性时触发该事件  
  下面是示例代码:  
  Private Sub Drive1_Change()  
  Dir1.Path = Drive1.Drive  
  ‘当选择一个新驱动器时,将驱动器列表中选中的当前驱动器,赋给目录列表的路径.  
  End Sub  
  2、目录列表框  
  目录列表框用于显示当前驱动器的目录结构,目录列表框从最高层目录开始,显示当前驱动器的目录结构,并按层次关系缩进跟目录下的所有子目录。下面是它的主要属性,方法和事件:  
  属性Path本属性用于返回或设置运行时选择的路径,默认路径为当前路径.改变Dri属性会触发Change事件.  
  示例: Dri1.Path = Drive1.Drive  
  设置在驱动器列表框中选中的驱动器盘符为目录列表的当前路径.  
  ListIndex本属性用来返回或设置控件中当前被选择的项目索引号.目录列表框中的每一个目录都可以通过ListIndex属性来标识.由Path属性所设置的当前目录的ListIndex属性值总是-1,而它上面的目录的ListIndex属性值为-2,再上面的为-3,以此类推;而它所包含的子目录恰恰相反,紧挨着的第一个子目录的ListIndex属性值为0,往下一次加一.  
  ListCount本属性返回当前目录下的所有子目录书.ListCount的值比最大的ListIndex的值大1.  
  事件Change当选择一个新目录或通过代码改变了Path属性时触发该事件  
  下面是示例代码:  
  Private Sub Dir1_Change()  
  '将文件列表框的路径值,设置为目录列表框所选中的路径值  
  File1.Path = Dir1.Path  
  End Sub  
  3、文件列表框  
  文件列表框用来显示当前目录中的部分或者全部文件.文件列表框的大部分属性和一般的列表框相同,都具有大小,位置,字体,颜色等以及List,ListCount,ListIndex等属性.下面是主要的属性:  
  属性Path本属性用于返回或设置运行时选择的路径以显示其下的文件,默认路径为当前路径.改变Dri属性会触发PathChange事件.  
  示例: File1.Path= Dri1.Path  
  设置在目录列表框中选中的路径为文件列表的当前路径.  
  Pattern本属性用来确定程序运行时,列表框中显示那些类型的文件.除了使用”*” ”?”等通配符外,在参数中还可以使用分号”;”来分割多种文件类型.例如:”*.ext;*.bat”  
  FileName本属性返回或设置所选文件的路径和文件名.可以从本属性值中返回当前列表中选择的文件名.路径可用Path属性单独检索.在功能上,本属性值与ListIndex等价.如果没有文件被选中,FileName属性将返回0长度的字符串.改变甭属性值可能会产生一个或多个如下事件:PathChange(如果改变路径),PatternChange(如果改变模式),DblClick(如果指定存在的文件)  
 
 
  
 
175 利用VB控件操作目录和文件夹  
   事件Click当选择一个新的文件时触发该事件  
  下面是示例代码:  
  Private Sub File1_Click()  
  Picture1.Picture = LoadPicture(Dir1.Path & " " & File1.FileName)  
  ‘在图片框中显示选定的图形文件.  
  End Sub  
  4、标准对话框  
  CommonDialog控件提供了一组标准的操作对话框,进行诸如打开,和保存文件,设置打印选项,以及选择颜色和字体等操作.通过运行windows帮助引擎还能显示帮助.  
  CommonDialog控件在visual basic和Microsoft Windows动态链接库commdlg.dll的例程之间提供了一个接口.为了用这个控件创建一个对话框,commdlg.dll必须存在于microsoft Windows的system目录下.然后再visual basic中选择工程/部件,并在显示的部件对话框中选中Microsoft common Dialog Control 6.0,确定后,在工具栏里就显示了出来.如下图所示:  
 
  在应用程序中要使用CommonDialog控件,可将其添加到窗体中并设置其属性.控件所显示的对话框有控件的方法确定.在运行时,当相应的方法被调用时,将显示一个对话框或是执行帮助引擎;在设计时,CommonDialog 控件是以图标的形式显示在窗体中的.该图标的大小不能改变.  
  使用指定的方法,CommonDialog控件能够显示下列对话框:  
  方法所显示的对话框  
  ShowOpen显示[打开]对话框  
  ShowSave显示[另存为]对话框  
  ShowColor显示[颜色]对话框  
  ShowFont显示[字体]对话框  
  ShowPrinter显示[打印]或[打印选项]对话框  
  Showhelp显示windows帮助引擎  
  下面是它的主要属性,方法:  
  属性Filer该属性应用于CommonDialog控件中的[打开][另存为]对话框.本属性用来返回或设置在对话框[类型]列表框中显示的过滤器.过滤的作用是确定对话框中文件列表框中显示的文件类型.例如:设置为*.txt时,将显示文本文件.要显示多种类型的文件,可以用管道(|)符号(ASCII124)将他们分开.管道符号前后不能加空格.如:*.rm|*.rmvb  
  Action该属性返回或设置一个表示所显示对话框类型的整数.具体如下.  
  设置数值说明  
  0没有操作  
  1显示[打开]对话框  
  2显示[另存为]对话框  
  3显示[颜色]对话框  
  4显示[字体]对话框  
  5显示[打印]或[打印选项]对话框  
  6运行WINHLP32.EXE  
  FileName本属性应用于CommonDialog控件的[打开][另存为]对话框.  
  本属性返回或设置所选文件的路径和文件名.如果在运行时被创建,FileName属性将返回0长度的字符串,表示当前没有选择文件.在CommonDialog控件里,可以在打开对话框之前设置FileName属性来设定初始文件名.  
  可以从本属性值中返回当前列表中选择的文件名.路径可用Path属性单独检索.在功能上,本属性值与ListIndex等价.如果没有文件被选中,FileName属性将返回0长度的字符串.  
  改变甭属性值可能会产生一个或多个如下事件:PathChange(如果改变路径),PatternChange(如果改变模式),DblClick(如果指定存在的文件)  
  事件Click当选择一个新的文件时触发该事件  
  下面是一个例子:  
  我们在这里要做一个VCD的播放器,下面是界面.  
 
  下表是其中所用到的控件及其属性设置:  
  对象特性设置值  
  窗体名称Frmvcd  
  BorderStyle1  
  CaptionVCD播放器  
  菜单标题文件  
  名称Mnufile  
  标题打开  
  名称Mnuopen  
  标题播放  
  名称Mnuplay  
  标题退出  
  名称Mnuexit  
  标题选项  
  名称Mnuoption  
  标题连续播放  
  名称Mnurepeat  
  标题静音  
  名称Mnuslient  
  多媒体控件名称Mmcontrol  
  Picture控件名称Picture1  
  通用对话框名称Commondialog1  
  下面是主要程序代码代码:  
  Private Sub mnuopen_Click() ’当点击菜单中的打开时执行  
 
 
  
 
176 利用VB控件操作目录和文件夹  
 
  '在未选择文件时,文件名为空字符,播放菜单不可用  
  mnuplay.Enabled =False  
  CommonDialog1.FileName = ""  
  '下面语句设置文件过滤方式,可显示扩展名为avi,dat,wav和mid文件  
  CommonDialog1.Filter = "(*.avi)|*.avi|(*.wave)|*.wav|(vcd *.dat)|*.dat|(midi *.mid)|*.mid"  
  '初始化文件过滤方式为*.avi  
  CommonDialog1.FilterIndex = 1  
  '建立打开方式的通用对话框,也可使用commondialog1.showopen  
  CommonDialog1.Action = 1  
-------------- 
'打开一个文件前先关闭前一次被打开的多媒体设备  
  MMControl1.Command = "close"  
  Select CommonDialog1.FilterIndex  
  Case 1 '选择*.avi  
   '设置多媒体设备类型为avividio  
   MMControl1.DeviceType = "avividio"  
   '设置时间格式为帧  
   MMControl1.TimeFormat = 3  
   '设置播放的文件为通用对话框中选择的文件  
   MMControl1.FileName = CommonDialog1.FileName  
   '打开文件  
   MMControl1.Command = "open "  
  Case 2 '选择*.wav  
   '设置多媒体设备类型为waveaudio  
   MMControl1.DeviceType = "waveaudio"  
   '设置时间格式为帧  
   MMControl1.TimeFormat = 3  
   '设置播放的文件为通用对话框中选择的文件  
   MMControl1.FileName = CommonDialog1.FileName  
   '打开文件  
   MMControl1.Command = "open "  
  Case 3 '选择*.dat  
   '设置多媒体设备类型为Mpegvidio  
   MMControl1.DeviceType = "Mpegvidio"  
   '设置时间格式为帧  
   MMControl1.TimeFormat = 3  
   '设置播放的文件为通用对话框中选择的文件  
   MMControl1.FileName = CommonDialog1.FileName  
   '打开文件  
   MMControl1.Command = "open "  
  Case 4 '选择*.mid  
   '设置多媒体设备类型为waveaudio  
   MMControl1.DeviceType = "waveaudio"  
   '设置时间格式为帧  
   MMControl1.TimeFormat = 3  
   '设置播放的文件为通用对话框中选择的文件  
   MMControl1.FileName = CommonDialog1.FileName  
   '打开文件  
   MMControl1.Command = "open "  
  End Select  
  '设置hwnddisplay的值,使媒体文件能够在picture控件中播放  
  MMControl1.hWndDisplay = Picture1.hWnd  
  End Sub  
  (二)新建、修改、删除目录  
  以上控件除了通用对话框(CommonDialog)之外一般只能显示当前的目录结构,对于在磁盘上新建、修改、删除目录却基本无能为力。  
  我们先来看看通用对话框对文件夹的新建,修改和删除操作.  
  1、新建目录  
  我们只要在显示出来的通用对话框的空白位置,单击鼠标,选择“新建”即可在指定的路径下创建新的目录,或者点击通用对话框右上角的新建图表(如下图所示),也可以在指定的路径下创建新的目录  
    
  2、修改文件夹名称  
  可以在显示出来的通用对话框中,用鼠标右键点击选择所要修改的文件夹,再弹出的快捷菜单中,选择重命名,即可修改目录名称。如下图所示:  
 
  3、删除文件夹  
  同修改文件夹名称一样,我们只要选择删除即可。如上图所示。  
  而且这种方法比RmDir更简便,它还可以删除包含有文件和子文件夹的文件夹。  
  除了以上控件,windows还给我们提供了一个叫做FileSystemObject(简称FSO)对象。FSO对象模型中包括了计算机文件系统所有的对象。见下表。利用这些对象可以更方便的操作文件系统。  
  对象功能  
  Drive允许收集系统的驱动器信息,诸如驱动器的可用空间  
  Folder允许创建、删除或移动文件夹,并向系统查询文件夹的名称、路径等等  
 
 
  
 作者: 61.142.212.*  2005-10-30 00:05   回复此发言    
 
--------------------------------------------------------------------------------
 
177 利用VB控件操作目录和文件夹  
   Files允许创建、删除或移动文件,并向系统查询文件的名称、路径等等  
  FileSysterObject此为主要对象,提供一整套用于创建、删除、搜集相关信息,以及通常的操作驱动器,文件夹,和文件的方法。  
  TextStream允许读写文本文件  
  下面我们一起来看看怎样用FSO对象来显示、新建、修改以及删除目录。  
  FSO对象模型包含在Scripting的类型库中,此类型库存在于Scrrun.dll文件中.使用FSO对象模型,首先要建立一个FileSystemObject对象。有两种方法可以实现。一种是从”工程”菜单中的”引用”对话框选择”Microsoft Scripting Runtime”项,然后在代码窗口中声明一个FileSystemObject类型的变量.语句如下:  
  Dim fso As New FileSystemObject  
  另一种方法是在代码中使用CreatObject方法动态的创建一个FileSystemObject对象.语句如下:  
  Dim fso As Object ‘ 声明对象变量  
  Set fso = CreatObject(“Scripting. FileSystemObject”) ‘创建FSO对象  
  我们具体看看FileSystemObject的主要属性.  
  1、驱动器  
  (1) Drives属性是FileSystemObject对象的唯一属性,它返回Drives集合中所有可用驱动器的只读集合。对于可删除的驱动器,不需要将媒体插入其中,就可以在Drives集合中显示出来。下面是它的主要属性有两个:一个是Count,另一个是Item.Count属性返回Drives集合或Dictionary对象中的条目数.Item属性用来返回或设置Drives集合或Dictionary对象中与指定关键字相关的项目.  
  下面代码说明了如何获得Drives集合,以及如何用For Eacn……Next语句来访问该集合中的每个Drive:  
  Sub ShowDriveList()  
  Dim fs As Object, d, dc, s,n  
  创建文件系统对象  
  Set fs = CreatObject(“Scripting. FileSystemObject”)  
  创建驱动器集合  
  Set dc= fs.Drives  
  '取的驱动器对象  
  For Each d in dc  
  s = s & d.DriveLetter & “-” ‘格式化文本  
  If d.DriverType = Remote Then ‘如果是Remote类型的驱动器  
   n = d.ShareName ‘取得它的共享名  
  Else  
   n = d.volumeName ‘否则取得它的卷标  
  End if  
  s= s& n & vbCrLf ‘格式化文本  
  Next  
  MsgBox s ‘显示文本  
  End sub  
  (2) 当然我们也可以用Drive对象.Drive对象提供了对磁盘驱动器或网络共享属性的访问方法.下面是它的主要属性及其解释:  
  Availablespace驱动器已用空间DriveLetter驱动器指定的字母  
  Freespace驱动器剩余空间DriverType驱动器类型  
  TotalSize驱动器全部空间FileSystem驱动器文件系统  
  IsReady驱动器是否已准备Path驱动器根目录  
  SerizlNumber驱动器序列号VolumeName驱动器卷标  
  ShareName驱动器共享名  
  主要的方法就是GetDrive,此方法用来访问一个已有的驱动器,该方法返回一个与指定路径中的驱动器相对应的Drive对象。下面的代码中,我们将说明怎样取得一个指定的驱动器的相关信息:  
  Sub ShowFreeSpace(drvPath) ‘显示指定目录下的驱动器的信息  
  Dim fs As Object, d, s  
  Set fs = CreateObject("Scripting.FileSystemObject") ‘创建文件系统对象  
  Set d = fs.GetDrive(fs.GetDriveName(drvPath)) ‘创建并得到指定取目录下的驱动器  
  s = "Drive" & UCase(drvPath) & "-" ‘格式化文本  
  s = s & d.VolumeName & vbCrLf ‘得到驱动器的卷标  
  s = s & "FreeSpace:" & FormatNumber(d.FreeSpace / 1024, 0)  
  '计算驱动器的剩余磁盘空间  
  s = s & "Kbytes"  
  MsgBox s ‘显示  
  End Sub  
  下面是filesystemobject的其他方法  
  CreateFolder该方法的作用是创建一个文件夹。所要创建的文件夹必须是不存在的,否则出错。  
  CreateTextFile该方法的作用是产生一个指定的文件名,并返回一个TextStream对象,该对象可被用于对指定的文件进行读写。如果overwrite参数为False或未指定,对于一个已存在的文件,将产生错误。  
  DeleteFile该方法的作用是删除一个指定的文件。如果指定的文件不存在,则出错。  
  DeleteFolder该方法的作用是删除一个文件夹及其内容。如果没有发现匹配的文件夹则出错。该方法不能确定文件夹中是否包含内容。  
  DriveExists该方法的作用是用来确定驱动器是否存在。如果指定的驱动器存在,则返回True,否则返回False。但对于可删除介质的驱动器,即使没有介质存在,DriveExists方法也返回True,因此最好使用IsReady属性确定驱动器是否准备就绪。  
  FileExists该方法的作用是判断指定的文件对象是否存在于当前文件夹  
  FolderExists该方法的作用是判断指定的文件夹对象是否存在于当前文件夹  
 
  
 作者: 61.142.212.*  2005-10-30 00:05   回复此发言    
 
--------------------------------------------------------------------------------
 
178 回复 177:利用VB控件操作目录和文件夹  
 GetDrive该方法的作用是返回一个在指定路径中的与某个驱动器相对应的Drive对象。对于网络驱动器,将首先检查该共享是否存在。  
  GerDriveName该方法的作用是返回包括某一指定路径上的驱动器名的字符串。如果驱动器不能确定,则返回一个0长度字符串。该方法只对指定的路径起作用,它并不试图解析路径,也不检查指定路径是否存在。  
  GetExtensionName该方法的作用是返回指定路径中最后一个组成部分的扩展名。  
  GetFile该方法的作用是返回指定路径中与某一文件相关的File对象。一定要保证所指定的文件是实际存在的。否则将产生错误。  
  GetFileName该方法的作用是返回指定路径的最后一个组成部分的文件名。  
  GetFolder该方法的作用是返回指定路径上的与某个文件夹相关的Folder对象.要保证指定的文件夹是实际存在的,否则会出错. 使用Folder对象的第一部就是先用FileSystemObjectd的GetFolder方法得到Folder对象  
  GetParentFolderName该方法的作用是返回一个包含指定路径上的最后一个组成部分的父文件夹的名称。  
  MoveFile该方法的作用是将一个或多个文件从一个地方移动到另一个地方。  
  MoveFolder该方法的作用是移动一个或多个文件夹,如果源路径包含通配符,或目的路径以斜杠()为结束,则表明目的路径为已存在的路径,在此文件夹中移动相匹配的文件夹.否则,认为目的路径是一个要创建的目标文件夹的名字.如果目的路径为一个已存在的文件或目的路径为一个目录,则出错.如果没有任何文件与源路径中的通配符相匹配也出错.  
  OpenTextFile该方法可用来打开一个指定的文件,并返回一个TextStream对象。用于读文件或追加文件。  
  2、文件夹  
  对文件夹的操作,我们可以使用folder对象,它提供了对文件夹所有属性和方法的访问.下表市对其主要属性的解释:  
  DateCreated返回指定文件或文件夹的创建日期和时间  
  DateLastAccessed返回最后一次访问指定文件或文件夹的日期和时间  
  Drive返回指定文件或文件夹所在的驱动器符号  
  Files返回由File对象组成的所有Files集合,这些Files集合包含在指定的文件夹中,包括设置了隐藏和系统文件属性的那些文件夹  
  IsRootFolder如果指定的文件夹是根文件夹,则返回True,否则返回False  
  Name设置或返回指定文件或文件夹的名称  
  ParentFolder返回指定文件或文件夹的父文件夹的Folder对象  
  Path返回指定文件、文件夹或驱动器的路径  
  ShortName返回较早的需要8.3文件命名约定的程序所使用的短文件名  
  ShortPath返回较早的需要8.3文件命名约定的程序所使用的短路径  
  Size对文件来说,本属性返回以字节为单位的文件大小;对文件夹来说,返回以字节为单位包括其中所有文件或子文件夹的大小  
  SubFolders返回包含所有文件夹的一个Folders集合,这些文件夹包含在某个特定文件夹中, 包括设置了隐藏和系统文件属性的那些文件夹  
  Type返回指定文件或文件夹的类型信息.  
  使用Folder对象的第一部就是先用FileSystemObjectd的GetFolder方法得到Folder对象, 该方法的作用是返回指定路径上的与某个文件夹相关的Folder对象.要保证指定的文件夹是实际存在的,否则会出错.  
  让我们来看一看其中的各种属性及其用法吧.  
  (1)Attributes属性可以返回文件或文件夹的属性,或者设置他们的新属性.所设属性可以是以下值中任意一个或多个的逻辑组合.  
  常数值说明  
  Normal0为一般文件,不设置属性  
  ReadOnly1为只读文件,属性为读/写  
  Hidden2为隐藏文件,属性为读/写  
  System 4为系统文件,属性为读/写  
  Volume8为磁盘驱动器卷标,属性为只读  
  Directory16为文件夹或目录,属性为只读  
  Archive32在上次备份后已经改变的文件,属性为读/写  
  Alias64为链接或快捷方式,属性为只读  
 
 
  
 作者: 61.142.212.*  2005-10-30 00:05   回复此发言    
 
--------------------------------------------------------------------------------
 
179 回复 177:利用VB控件操作目录和文件夹  
   Compressed128为压缩文件,属性为只读  
  (2)DateCreated属性返回指定文件或文件夹的创建日期和时间,本属性为只读属性.  
  下面是用法:  
  Sub ShowFolderList( folderspec ) ‘folderspec 为文件夹名称  
  Dim fs , f, f1,fc , s  
  Set fs = CreateObject(“Scripting.FileSystemObject”)  
  Set f = fs.GetFolder(folderspec) ‘得到folderspec文件夹相关的folder对象  
  Set fc = f.SubFolders ‘得到folder对象所包含的文件夹的folder集合  
  For Each fi in fc ‘访问folder集合中的每一个folder  
  s= s & f1.name ‘格式化要显示的文本  
  s= s & vbCrLf  
  Next  
  MsgBox s ‘用对话框显示信息  
  End Sub  
  (3)DateLastModified属性用来返回最后一次修改指定文件或文件夹的日期和时间,本属性为只读.  
  下面代码用一个文件举例说明了DataLastModified属性的用法:  
  Sub ShowFileAccessInfo(filespec)  
  Dim fs,f,s  
  Set fs = CreateObject(“Scripting.FileSystemObject”)  
  Set f = fs.GetFolder(folderspec) ‘得到folderspec文件夹相关的folder对象  
  s= Ucase(filespec) & vbCrLf  
  s= s& “Created:” & f.DateCreate & vbCrLf  
  s= s & “Last Accessed :” & f.DateLastAccessed & vbCrLf  
  s= s & “Last Modifide :” & f.DateLastModified  
  MsgBox s, 0,”File Access Info”  
  End Sub  
  (4)Type属性返回关于某个文件或文件夹类型的信息.例如对于以.TXT结尾的文本文件来说,本属性会返回”Text Document”.下面的代码举例说明了返回某个文件夹类型的Type属性的用法.在这个示例中,试图将Recycle Bin的路径或其他唯一的文件夹提供给过程.  
  Sub ShowFileSize( filespec )  
  Dim fs,f,s  
  Set fs = CreateObject(“Scripting.FileSystemObject”)  
  Set f = fs.GetFolder(folderspec) ‘得到folderspec文件夹相关的folder对象  
  S = Ucase(f.Name) & “is a ” & f.Type ‘格式化文本  
  MsgBox s,o, “File Size Info ” ‘显示信息  
  End Sub  
  主要方法有:  
  (1)Copy方法:  
  该方法的作用是拷贝一个指定的文件或文件夹到指定的目录.该方法和FileSystemObject.CopyFile方法的作用相同  
  (2)CreateTextFile方法:  
  该方法的作用是产生一个指定的文件名,并返回一个TextStream对象,该对象可被用于对指定的文件进行读写.如果overwrite参数为False或未指定,对于一个已存在的文件,将产生错误.  
  (3)Delete方法:  
  该方法的作用是删除一个指定的文件或文件夹.如果指定的文件或文件夹不存在,则发生一个错误.对于一个File或Folder来说,Delete方法的运行的结果和执行FileSystemObject.DeleteFile或FileSystemObject.DeleteFolder的结果是一样的.Delete方法执行时与指定的文件夹中时候有内容无关.  
  (4)Move  
  该方法用来将一个指定的文件夹或文件从一个地方移动到另一个地方,如果只是想移动一个文件或文件夹,则使用Move方法和使用FileSystemObject.MoveFile或FileSystemObject.MoveFolder操作的结果是一样的,但是如果要同时移动多个文件或文件夹,则只能使用后者。  
  讲了这么多,还是让我们来看一下具体的实现方法:  
  1、 创建一个文件夹  
  可以使用FileSystemObject对象的CreateFolder方法来实现,但要创建的文件夹必须不存在,否则出错。特别注意,FileSystemObject对象不能创建或删除驱动器。  
  下面的例子可以在应用程序所在目录下创建一个文件夹  
  Sub CreateFolder(folderspec)  
  Dim fs  
  Set fs = CreatObject(“Scripting.FileSystemObject”)  
  fs.CreaterFolder(folderspec )  
  End sub  
  2、 删除一个或多个文件夹  
  可以使用FileSystemObject对象的Deletfolder方法,或者folder对象的Delete方法  
  Sub DeleteFolder(folderspec)  
  Dim fs  
  Set fs = CreatObject(“Scripting.FileSystemObject”)  
  fs.DeleteFolder(folderspec & “100”)  
  ‘Set f = fs.GetFolder(folderspec) ‘得到folderspec文件夹相关的folder对象  
  ‘f.Delete  
  End sub  
  3、移动一个或多个文件夹  
  可以使用FileSystemObject对象的Movefolder方法,或者folder对象的Move方法  
  Sub MoveFolder(folderspec)  
  Dim fs  
  Set fs = CreatObject(“Scripting.FileSystemObject”)  
 
  
 作者: 61.142.212.*  2005-10-30 00:05   回复此发言    
 
--------------------------------------------------------------------------------
 
180 VB中控件大小随窗体大小变化  
 VB中控件大小随窗体大小变化 【字体:大 中 小】  
作者:[Gdibn] 来源:[互动网络] 浏览:[ 8 ] 评论:[0]  
  
  
 当前是:全文显示  
  
  有时窗体变化后,如改变分辨率后控件大小却不能随之改变。手工代码调整实在麻烦,下面的模块实现自动查找窗体上控件并使其改变大小以适应窗体变化。  
  在Form的Resize事件中调用函数Resize_All就能实现控件自动调整大小,如:  
  Private Sub Form_Resize()  
  Dim H, i As Integer  
  On Error Resume Next  
  Resize_ALL Me 'Me是窗体名,Form1,Form2等等都可以  
  End Sub  
  在模块中添加以下代码:  
  Public Type ctrObj  
  Name As String  
  Index As Long  
  Parrent As String  
  Top As Long  
  Left As Long  
  Height As Long  
  Width As Long  
  ScaleHeight As Long  
  ScaleWidth As Long  
  End Type  
  Private FormRecord() As ctrObj  
  Private ControlRecord() As ctrObj  
  Private bRunning As Boolean  
  Private MaxForm As Long  
  Private MaxControl As Long  
  Private Const WM_NCLBUTTONDOWN = &HA1  
  Private Declare Function SendMessage Lib "USER32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long  
  Private Declare Function ReleaseCapture Lib "USER32" () As Long  
  Function ActualPos(plLeft As Long) As Long  
  If plLeft < 0 Then  
  ActualPos = plLeft + 75000  
  Else  
  ActualPos = plLeft  
  End If  
  End Function  
  Function FindForm(pfrmIn As Form) As Long  
  Dim i As Long  
  FindForm = -1  
  If MaxForm > 0 Then  
    
  For i = 0 To (MaxForm - 1)  
   If FormRecord(i).Name = pfrmIn.Name Then  
    FindForm = i  
    Exit Function  
   End If  
  Next i  
  End If  
  End Function  
  Function AddForm(pfrmIn As Form) As Long  
  Dim FormControl As Control  
  Dim i As Long  
  ReDim Preserve FormRecord(MaxForm + 1)  
  FormRecord(MaxForm).Name = pfrmIn.Name  
  FormRecord(MaxForm).Top = pfrmIn.Top  
  FormRecord(MaxForm).Left = pfrmIn.Left  
  FormRecord(MaxForm).Height = pfrmIn.Height  
  FormRecord(MaxForm).Width = pfrmIn.Width  
  FormRecord(MaxForm).ScaleHeight = pfrmIn.ScaleHeight  
  FormRecord(MaxForm).ScaleWidth = pfrmIn.ScaleWidth  
  AddForm = MaxForm  
  MaxForm = MaxForm + 1  
  For Each FormControl In pfrmIn  
  i = FindControl(FormControl, pfrmIn.Name)  
  If i < 0 Then  
   i = AddControl(FormControl, pfrmIn.Name)  
  End If  
  Next FormControl  
  End Function  
  Function FindControl(inControl As Control, inName As String) As Long  
  Dim i As Long  
  FindControl = -1  
  For i = 0 To (MaxControl - 1)  
  If ControlRecord(i).Parrent = inName Then  
   If ControlRecord(i).Name = inControl.Name Then  
    On Error Resume Next  
    If ControlRecord(i).Index = inControl.Index Then  
     FindControl = i  
     Exit Function  
    End If  
    On Error GoTo 0  
   End If  
  End If  
  Next i  
  End Function  
  Function AddControl(inControl As Control, inName As String) As Long  
 
 
  
 
181 VB中控件大小随窗体大小变化  
 
  ReDim Preserve ControlRecord(MaxControl + 1)  
  On Error Resume Next  
  ControlRecord(MaxControl).Name = inControl.Name  
  ControlRecord(MaxControl).Index = inControl.Index  
  ControlRecord(MaxControl).Parrent = inName  
  If TypeOf inControl Is Line Then  
  ControlRecord(MaxControl).Top = inControl.Y1  
  ControlRecord(MaxControl).Left = ActualPos(inControl.X1)  
  ControlRecord(MaxControl).Height = inControl.Y2  
  ControlRecord(MaxControl).Width = ActualPos(inControl.X2)  
  Else  
  ControlRecord(MaxControl).Top = inControl.Top  
  ControlRecord(MaxControl).Left = ActualPos(inControl.Left)  
  ControlRecord(MaxControl).Height = inControl.Height  
  ControlRecord(MaxControl).Width = inControl.Width  
  End If  
  inControl.IntegralHeight = False  
  On Error GoTo 0  
  AddControl = MaxControl  
  MaxControl = MaxControl + 1  
  End Function  
  Function PerWidth(pfrmIn As Form) As Long  
  Dim i As Long  
  i = FindForm(pfrmIn)  
  If i < 0 Then  
  i = AddForm(pfrmIn)  
  End If  
  PerWidth = (pfrmIn.ScaleWidth * 100) \ FormRecord(i).ScaleWidth  
  End Function  
  Function PerHeight(pfrmIn As Form) As Double  
  Dim i As Long  
  i = FindForm(pfrmIn)  
  If i < 0 Then  
  i = AddForm(pfrmIn)  
  End If  
  PerHeight = (pfrmIn.ScaleHeight * 100) \ FormRecord(i).ScaleHeight  
  End Function  
  Public Sub ResizeControl(inControl As Control, pfrmIn As Form)  
  On Error Resume Next  
  Dim i As Long  
  Dim widthfactor As Single, heightfactor As Single  
  Dim minFactor As Single  
  Dim yRatio, xRatio, lTop, lLeft, lWidth, lHeight As Long  
  yRatio = PerHeight(pfrmIn)  
  xRatio = PerWidth(pfrmIn)  
  i = FindControl(inControl, pfrmIn.Name)  
  If inControl.Left < 0 Then  
  lLeft = CLng(((ControlRecord(i).Left * xRatio) \ 100) - 75000)  
  Else  
  lLeft = CLng((ControlRecord(i).Left * xRatio) \ 100)  
  End If  
  lTop = CLng((ControlRecord(i).Top * yRatio) \ 100)  
  lWidth = CLng((ControlRecord(i).Width * xRatio) \ 100)  
  lHeight = CLng((ControlRecord(i).Height * yRatio) \ 100)  
  If TypeOf inControl Is Line Then  
  If inControl.X1 < 0 Then  
   inControl.X1 = CLng(((ControlRecord(i).Left * xRatio) \ 100) - 75000)  
  Else  
   inControl.X1 = CLng((ControlRecord(i).Left * xRatio) \ 100)  
  End If  
  inControl.Y1 = CLng((ControlRecord(i).Top * yRatio) \ 100)  
  If inControl.X2 < 0 Then  
   inControl.X2 = CLng(((ControlRecord(i).Width * xRatio) \ 100) - 75000)  
  Else  
   inControl.X2 = CLng((ControlRecord(i).Width * xRatio) \ 100)  
  End If  
  inControl.Y2 = CLng((ControlRecord(i).Height * yRatio) \ 100)  
  Else  
  inControl.Move lLeft, lTop, lWidth, lHeight  
  inControl.Move lLeft, lTop, lWidth  
  inControl.Move lLeft, lTop  
  End If  
  End Sub  
  Public Sub ResizeForm(pfrmIn As Form)  
  Dim FormControl As Control  
  Dim isVisible As Boolean  
  Dim StartX, StartY, MaxX, MaxY As Long  
 
 
 
182 VB中控件大小随窗体大小变化  
   Dim bNew As Boolean  
  If Not bRunning Then  
  bRunning = True  
  If FindForm(pfrmIn) < 0 Then  
   bNew = True  
  Else  
   bNew = False  
  End If  
  If pfrmIn.Top < 30000 Then  
   isVisible = pfrmIn.Visible  
   On Error Resume Next  
   If Not pfrmIn.MDIChild Then  
    On Error GoTo 0  
    ' ' pfrmIn.Visible = False  
   Else  
    If bNew Then  
     StartY = pfrmIn.Height  
     StartX = pfrmIn.Width  
     On Error Resume Next  
     For Each FormControl In pfrmIn  
      If FormControl.Left + FormControl.Width + 200 > MaxX Then  
       MaxX = FormControl.Left + FormControl.Width + 200  
      End If  
      If FormControl.Top + FormControl.Height + 500 > MaxY Then  
       MaxY = FormControl.Top + FormControl.Height + 500  
      End If  
      If FormControl.X1 + 200 > MaxX Then  
       MaxX = FormControl.X1 + 200  
      End If  
      If FormControl.Y1 + 500 > MaxY Then  
       MaxY = FormControl.Y1 + 500  
      End If  
      If FormControl.X2 + 200 > MaxX Then  
       MaxX = FormControl.X2 + 200  
      End If  
      If FormControl.Y2 + 500 > MaxY Then  
       MaxY = FormControl.Y2 + 500  
      End If  
     Next FormControl  
     On Error GoTo 0  
     pfrmIn.Height = MaxY  
     pfrmIn.Width = MaxX  
    End If  
    On Error GoTo 0  
   End If  
   For Each FormControl In pfrmIn  
    ResizeControl FormControl, pfrmIn  
   Next FormControl  
   On Error Resume Next  
   If Not pfrmIn.MDIChild Then  
    On Error GoTo 0  
    pfrmIn.Visible = isVisible  
   Else  
    If bNew Then  
    pfrmIn.Height = StartY  
    pfrmIn.Width = StartX  
    For Each FormControl In pfrmIn  
     ResizeControl FormControl, pfrmIn  
    Next FormControl  
   End If  
  End If  
  On Error GoTo 0  
  End If  
  bRunning = False  
  End If  
  End Sub  
  Public Sub SaveFormPosition(pfrmIn As Form)  
  Dim i As Long  
  If MaxForm > 0 Then  
  For i = 0 To (MaxForm - 1)  
   If FormRecord(i).Name = pfrmIn.Name Then  
    FormRecord(i).Top = pfrmIn.Top  
    FormRecord(i).Left = pfrmIn.Left  
    FormRecord(i).Height = pfrmIn.Height  
    FormRecord(i).Width = pfrmIn.Width  
    Exit Sub  
   End If  
  Next i  
  AddForm (pfrmIn)  
  End If  
  End Sub  
  Public Sub RestoreFormPosition(pfrmIn As Form)  
  Dim i As Long  
  If MaxForm > 0 Then  
  For i = 0 To (MaxForm - 1)  
   If FormRecord(i).Name = pfrmIn.Name Then  
    If FormRecord(i).Top < 0 Then  
     pfrmIn.WindowState = 2  
    ElseIf FormRecord(i).Top < 30000 Then  
     pfrmIn.WindowState = 0  
     pfrmIn.Move FormRecord(i).Left, FormRecord(i).Top, FormRecord(i).Width, FormRecord(i).Height  
    Else  
     pfrmIn.WindowState = 1  
    End If  
     Exit Sub  
   End If  
  Next i  
  End If  
  End Sub  
  Public Sub Resize_ALL(Form_Name As Form)  
  Dim OBJ As Object  
  For Each OBJ In Form_Name  
  ResizeControl OBJ, Form_Name  
  Next OBJ  
  End Sub  
  Public Sub DragForm(frm As Form)  
  On Local Error Resume Next  
  Call ReleaseCapture  
  Call SendMessage(frm.hwnd, WM_NCLBUTTONDOWN, 2, 0)  
  End Sub  
 
  
 
183 VB中利用API函数实现屏幕颜色数设定  
 VB中利用API函数实现屏幕颜色数设定 【字体:大 中 小】  
作者:[Gdibn] 来源:[互动网络] 浏览:[ 7 ] 评论:[0]  
  
  
 第 1 页  
  
  原则上,只改这一次,下一次开机会还原,但如果需重开机,才会Update Registry中的设定,并重开机。 
  如果要永久设定其设定值,请将 
b = ChangeDisplaySettings(DevM, 0) 
  改成 
b = ChangeDisplaySettings(DevM, CDS_UPDATEREGISTRY)  
  注: 
  DevM.dmBitsPerPel 便是设定颜色数,其实应说每个Pixel要多少Bits来显示 
  4 --> 16色 
  8 --> 256色 
  16 --> 65536色 以此类推 
Option Explicit 
Private Declare Function EnumDisplaySettings Lib "user32" Alias _ 
"EnumDisplaySettingsA" (ByVal lpszDeviceName As Long, _ 
ByVal iModeNum As Long, lpDevMode As Any) As Long 
Private Declare Function ChangeDisplaySettings Lib "user32" Alias _ 
"ChangeDisplaySettingsA" (lpDevMode As Any, ByVal dwflags As Long) As Long 
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, _ 
ByVal dwReserved As Long) As Long 
Const EWX_REBOOT = 2 ’ 重开机 
Const CCDEVICENAME = 32 
Const CCFORMNAME = 32 
Const DM_BITSPERPEL = &H40000 
Const DISP_CHANGE_SUCCESSFUL = 0 
Const DISP_CHANGE_RESTART = 1 
Const CDS_UPDATEREGISTRY = 1 
Private Type DEVMODE 
dmDeviceName As String * CCDEVICENAME 
dmSpecVersion As Integer 
dmDriverVersion As Integer 
dmSize As Integer 
dmDriverExtra As Integer 
dmFields As Long 
dmOrientation As Integer 
dmPaperSize As Integer 
dmPaperLength As Integer 
dmPaperWidth As Integer 
dmScale As Integer 
dmCopies As Integer 
dmDefaultSource As Integer 
dmPrintQuality As Integer 
dmColor As Integer 
dmDuplex As Integer 
dmYResolution As Integer 
dmTTOption As Integer 
dmCollate As Integer 
dmFormName As String * CCFORMNAME 
dmUnusedPadding As Integer 
dmBitsPerPel As Integer 
dmPelsWidth As Long 
dmPelsHeight As Long 
dmDisplayFlags As Long 
dmDisplayFrequency As Long 
End Type 
Private DevM As DEVMODE 
Private Sub Command1_Click() 
Dim a As Boolean 
Dim i As Long 
Dim b As Long 
Dim ans As Long 
a = EnumDisplaySettings(0, 0, DevM) ’Initial Setting 
DevM.dmBitsPerPel = 8 ’设定成256色 
DevM.dmFields = DM_BITSPERPEL 
b = ChangeDisplaySettings(DevM, 0) 
If b = DISP_CHANGE_RESTART Then 
 ans = MsgBox("要重开机设定才能完成,重开?", vbOKCancel) 
 If ans = 1 Then 
  b = ChangeDisplaySettings(DevM, CDS_UPDATEREGISTRY) 
  Call ExitWindowsEx(EWX_REBOOT, 0) 
 End If 
Else 
 If b <> DISP_CHANGE_SUCCESSFUL Then 
  Call MsgBox("设定有误", vbCritical) 
 End If 
End If 
End Sub  
 
  
 
184 使用Word的“艺术字”工具  
 Word 97中的“艺术字”工具(WordArt)能创建出各种各样的文字,令人赏心悦目。如果能在VB中使用“艺术字”该有多好啊!由于有了面向对象技术中的代码重用思想,现在就可以轻松地实现这个愿望了。  
  代码重用主要有两种形式,即二进制代码重用与源代码重用。前者是通过创建和使用对象来实现的;后者,顾名思义,是通过继承实现的,后者在C++语言中被广泛使用。由于Visual Basic不支持继承,所以在VB中的代码重用主要是指二进制代码重用,并且VB算得上是二进制代码重用的先驱。它的基本思路是:首先将待重用的代码和数据编译为二进制文件,称为ActiveX服务器部件,然后在客户应用程序里创建部件中类的对象来调用该部件。在VB中最为人们所熟悉的控件就是典型的二进制代码重用的例子,每个控件都是一个ActiveX部件,在向窗体中添加一个控件的同时就创建了该控件类的一个新实例,然后通过调用该控件的属性、方法和事件就重用了该控件中的代码。  
  Word 97本身就是一个庞大的代码部件,也就是说,Word 97中的整个对象库是对外开放的,它允许其他应用程序对其进行编程。换句话说,Word 97中的对象能被其他应用程序所调用。而“艺术字”正是Word 97中的一种对象,因此可以方便地在VB中调用它。  
  要使用“艺术字”,必须先把Word 97的对象库加入到程序中,然后创建一个对象变量来保持对Word应用程序对象的引用,可以用两种方法创建对Word应用程序对象的引用,一种方法是直接声明一个Word应用程序的对象变量,例如:  
  Dim w As New Word.Application  
  这种方法称为前期绑定,它速度较快;另一种方法是声明一个对象变量w,然后把用CreateObject函数创建出的Word应用程序对象赋给w,例如:  
  Dim w As Object  
  Set w=CreateObject("Word.Application")  
 这种方法称为后期绑定,它速度较慢。在创建了Word应用程序对象后,就可以以代码的方式像在Word中进行具体操作那样创建新文档,并在文档中加入“艺术字”。在创建好“艺术字”之后,用剪贴板将其传给窗体。在创建Word应用程序对象时,VB会在后台自动打开Word,因此,在程序结束时,应该先关闭Word,其代码如下:  
  w.Quit wdDoNotSaveChanges  
  下面用一个具体的项目实例帮你轻松学习如何在VB中使用Word对象。  
  (1)启动Microsoft Visual Basic 5.0,选择“标准EXE”,创建一个新项目;  
  (2)选择“项目”菜单中的“引用”选项,显示“引用”对话框,选中"Microsoft Word 8.0 Object Library"和"Microsoft Office 8.0 Object Library"两项,单击“确定”按钮(见图1);  
  (3)将下列代码加入到Form1的“通用”|“声明”选项中:  
  Dim w As New Word.Application  
  (4)将下列代码加入到Form1的Load事件中:  
  Private Sub Form_Load()  
   w.Documents.Add.Select  
   w.ActiveDocument.Shapes.AddTextEffect(0,"艺术字","隶书",48#,-1,0,183.75,70.5).Select  
 End Sub  
  这里显示的字样是隶书的“艺术字”三个字,你可以根据自己的喜好来改变字体(如宋体、楷体等)以及改变字样;  
  (5)将下列代码加入到Form1的Click事件中:  
  Private Sub Form_Click()  
   w.Selection.ShapeRange.TextEffect.PresetTextEffect = Int(Rnd(1) * 30)  
   w.Selection.ShapeRange.TextEffect.FontName = "隶书"  
   w.Selection.Copy  
   Picture = Clipboard.GetData()  
  End Sub  
 (6)将下列代码加入到Form1的Unload事件中:  
  Private Sub Form_Unload(Cancel As Integer)  
   w.Quit wdDoNotSaveChanges  
   Set w = Nothing  
  End Sub  
  (7)在窗体上放置一个按钮,其Caption属性为"Exit",并在它的Click事件中处理退出:  
  Private Sub Command1_Click()  
   End  
  End Sub  
  (8)运行程序后,当鼠标在窗体上单击时,会随机地显示出一种“艺术字”字型(Word中共有30种内建“艺术字”字型),下图分别给出了隶书与宋体两种不同字体的字样为“艺术字”的几种情形。  
   同样,由这个实例可以举一反三,即我们也可以在VB中使用Excel的图表、PowerPoint的幻灯片,因为Office 97中的产品都是代码部件,这些产品中的对象库都是可以被其他应用程序调用的,所以只要了解这些对象的外部接口(属性、方法和事件),就可以方便地调用这些对象了。  
 
  
 作者: 61.142.212.*  2005-10-30 00:09   回复此发言    
 
--------------------------------------------------------------------------------
 
185 浅出浅入美化界面  
 浅出浅入美化界面  
-------------------------------------------------------------------------------- 
作者:不详  来源于:中国VB网  发布时间:2005-10-29  
先在窗体上加一个按钮,两个timer控件,然后在窗体上加入如下代码 
Dim rtn As Long 
Dim slo As Integer 
Private Sub Command1_Click() 
Timer1.Enabled = False 
slo = 255 '定义透明度为完全显示 
rtn = GetWindowLong(Me.hwnd, GWL_EXSTYLE) 
rtn = rtn Or WS_EX_LAYERED 
SetWindowLong Me.hwnd, GWL_EXSTYLE, rtn 
SetLayeredWindowAttributes Me.hwnd, 0, slo, LWA_ALPHA 
Timer2.Enabled = True 
End Sub 
Private Sub Form_Load() 
c = 1 
rtn = GetWindowLong(Me.hwnd, GWL_EXSTYLE) '获取窗体大小 
rtn = rtn Or WS_EX_LAYERED '赋予rtn为 WS_Ex_Layered 
SetWindowLong Me.hwnd, GWL_EXSTYLE, rtn '将半透明值赋予给窗体 
SetLayeredWindowAttributes Me.hwnd, 0, 0, LWA_ALPHA '赋予窗体半透明 
Timer1.Interval = 1 
Timer1.Enabled = True '浅出浅入开始 
Timer2.Interval = 1 
Timer2.Enabled = False 
Me.Visible = True '显示窗体,否则会造成窗体显示后才浅出浅入 
End Sub 
Private Sub Timer1_Timer() 
On Error Resume Next 
If slo < 255 Then 
slo = slo + 25 '这里控制显示速度 
rtn = GetWindowLong(Me.hwnd, GWL_EXSTYLE) 
rtn = rtn Or WS_EX_LAYERED 
SetWindowLong Me.hwnd, GWL_EXSTYLE, rtn 
SetLayeredWindowAttributes Me.hwnd, 0, slo, LWA_ALPHA 
'范围:0~255 
Else 
Timer1.Enabled = False 
End If 
End Sub 
Private Sub Timer2_Timer() 
On Error Resume Next 
If slo > 0 Then 
slo = slo - 25 '这里控制显示速度 
rtn = GetWindowLong(Me.hwnd, GWL_EXSTYLE) 
rtn = rtn Or WS_EX_LAYERED 
SetWindowLong Me.hwnd, GWL_EXSTYLE, rtn 
SetLayeredWindowAttributes Me.hwnd, 0, slo, LWA_ALPHA 
Else 
Unload Me 
End If 
End Sub 
  
'在新建立一个模块,加入如下代码: 
'声明 
Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long 
Public Const WS_EX_LAYERED = &H80000 
Public Const GWL_EXSTYLE = (-20) 
Public Const LWA_ALPHA = &H2 
Public Const LWA_COLORKEY = &H1 
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long 
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long 
  
--------------------------------------------------------------------------------  
 
  
 
186 托盘气球提示  
 托盘气球提示  
-------------------------------------------------------------------------------- 
作者:叶帆  来源于:中国VB网  发布时间:2005-10-29  
Option Explicit 
'************************************************************************* 
'**函 数 名:cmdDel_Click 
'**输 入:无 
'**输 出:无 
'**功能描述:删除图标 
'**全局变量: 
'**调用模块: 
'**作 者:叶帆 
'**日 期:2004-10-14 09:34:58 
'**修 改 人: 
'**日 期: 
'**版 本:V1.0.0 
'************************************************************************* 
Private Sub cmdDel_Click() 
 DelNotifyIcon Me 
End Sub 
'************************************************************************* 
'**函 数 名:cmdShow_Click 
'************************************************************************* 
Private Sub cmdShow_Click() 
 ShowNotifyIcon Me, txtTitle, txtInfo, cmbType.ListIndex 
End Sub 
'************************************************************************* 
'**函 数 名:Form_Load 
'************************************************************************* 
Private Sub Form_Load() 
 cmbType.ListIndex = 1 '信息图标 
 cmdShow_Click '显示信息 
End Sub 
'************************************************************************* 
'**函 数 名:Form_Unload 
'**输 入:Cancel(Integer) - 
'**输 出:无 
'**功能描述:结束 
'**全局变量: 
'**调用模块: 
'**作 者:叶帆 
'**日 期:2004-10-14 09:35:32 
'**修 改 人: 
'**日 期: 
'**版 本:V1.0.0 
'************************************************************************* 
Private Sub Form_Unload(Cancel As Integer) 
  
 '删除图标 
 cmdDel_Click 
  
 ' 卸载所有窗体 
 Dim frm As Form 
 For Each frm In Forms 
 Unload frm 
 Next 
End Sub 
  
-------------------------------------------------------------------------------- 
'模块代码  
'************************************************************************* 
'**模 块 名:mdlNotifyBase 
'**说 明:YFsoft 版权所有2004 - 2005(C) 
'**创 建 人:叶帆 
'**日 期:2004-10-14 09:17:46 
'**修 改 人: 
'**日 期: 
'**描 述:显示托盘提示模块 
'**版 本:V1.0.0 
'************************************************************************* 
Option Explicit 
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long 
Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 
Private Const WM_RBUTTONUP = &H205 
Private Const WM_USER = &H400 
Private Const WM_NOTIFYICON = WM_USER + 1 ' 自定义消息 
Private Const WM_LBUTTONDBLCLK = &H203 
Private Const GWL_WNDPROC = (-4) 
' 关于气球提示的自定义消息, 2000下不产生这些消息 
Private Const NIN_BALLOONSHOW = (WM_USER + &H2) ' 当 Balloon Tips 弹出时执行 
 
 
  
 
187 托盘气球提示  
 Private Const NIN_BALLOONHIDE = (WM_USER + &H3) ' 当 Balloon Tips 消失时执行(如 SysTrayIcon 被删除), 
 ' 但指定的 TimeOut 时间到或鼠标点击 Balloon Tips 后的消失不发送此消息 
Private Const NIN_BALLOONTIMEOUT = (WM_USER + &H4) ' 当 Balloon Tips 的 TimeOut 时间到时执行 
Private Const NIN_BALLOONUSERCLICK = (WM_USER + &H5) ' 当鼠标点击 Balloon Tips 时执行。 
 ' 注意:在XP下执行时 Balloon Tips 上有个关闭按钮, 
 ' 如果鼠标点在按钮上将接收到 NIN_BALLOONTIMEOUT 消息。 
Private Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long 
Private Type NOTIFYICONDATA 
 cbSize As Long ' 结构大小(字节) 
 hwnd As Long ' 处理消息的窗口的句柄 
 uId As Long ' 唯一的标识符 
 uFlags As Long ' Flags 
 uCallBackMessage As Long ' 处理消息的窗口接收的消息 
 hIcon As Long ' 托盘图标句柄 
 szTip As String * 128 ' Tooltip 提示文本 
 dwState As Long ' 托盘图标状态 
 dwStateMask As Long ' 状态掩码 
 szInfo As String * 256 ' 气球提示文本 
 uTimeoutOrVersion As Long ' 气球提示消失时间或版本 
 ' uTimeout - 气球提示消失时间(单位:ms, 10000 -- 30000) 
 ' uVersion - 版本(0 for V4, 3 for V5) 
 szInfoTitle As String * 64 ' 气球提示标题 
 dwInfoFlags As Long ' 气球提示图标 
End Type 
' dwState to NOTIFYICONDATA structure 
Private Const NIS_HIDDEN = &H1 ' 隐藏图标 
Private Const NIS_SHAREDICON = &H2 ' 共享图标 
' dwInfoFlags to NOTIFIICONDATA structure 
Private Const NIIF_NONE = &H0 ' 无图标 
Private Const NIIF_INFO = &H1 ' "消息"图标 
Private Const NIIF_WARNING = &H2 ' "警告"图标 
Private Const NIIF_ERROR = &H3 ' "错误"图标 
' uFlags to NOTIFYICONDATA structure 
Private Const NIF_ICON As Long = &H2 
Private Const NIF_INFO As Long = &H10 
Private Const NIF_MESSAGE As Long = &H1 
Private Const NIF_STATE As Long = &H8 
Private Const NIF_TIP As Long = &H4 
' dwMessage to Shell_NotifyIcon 
Private Const NIM_ADD As Long = &H0 
Private Const NIM_DELETE As Long = &H2 
Private Const NIM_MODIFY As Long = &H1 
Private Const NIM_SETFOCUS As Long = &H3 
Private Const lngNIM_SETVERSION As Long = &H4 
Private lngPreWndProc As Long 
'************************************************************************* 
'**函 数 名:ShowNotifyIcon 
'**输 入:frm(Form) - 窗体 
'** :strTitle(String) - 托盘提示标题 
'** :strInfo(String) - 托盘提示信息 
'** :Optional lngType(Long = 1) - 托盘提示类型 0 无 1 信息 2 警告 3 错误 
'** :Optional lngTime(Long = 10000) - 停留时间 
'**输 出:无 
'**功能描述:显示托盘图标提示信息 
'**全局变量: 
'**调用模块: 
'**作 者:叶帆 
'**日 期:2004-10-14 09:23:14 
'**修 改 人: 
'**日 期: 
'**版 本:V1.0.0 
'************************************************************************* 
Public Sub ShowNotifyIcon(frm As Form, strTitle As String, strInfo As String, Optional lngType As Long = 1, Optional lngTime As Long = 10000) 
  
 ' 向托盘区添加图标 
 Dim IconData As NOTIFYICONDATA 
  
 strTitle = strTitle & vbNullChar 
 strInfo = strInfo & vbNullChar 
  
 With IconData 
 .cbSize = Len(IconData) 
 .hwnd = frm.hwnd 
 .uId = 0 
 .uFlags = NIF_TIP Or NIF_ICON Or NIF_MESSAGE Or NIF_INFO Or NIF_STATE 
 
 
  
 
188 托盘气球提示  
  .uCallBackMessage = WM_NOTIFYICON 
 .szTip = strTitle 
 .hIcon = frm.Icon.Handle 
 .dwState = 0 
 .dwStateMask = 0 
 .szInfo = strInfo 
 .szInfoTitle = strTitle 
 .dwInfoFlags = lngType 
 .uTimeoutOrVersion = lngTime 
 End With 
  
 If lngPreWndProc = 0 Then '没有初始化 
 Shell_NotifyIcon NIM_ADD, IconData 
 lngPreWndProc = SetWindowLong(frm.hwnd, GWL_WNDPROC, AddressOf WindowProc) 
 Else '已初始化 
 Shell_NotifyIcon NIM_MODIFY, IconData 
 End If 
  
End Sub 
'************************************************************************* 
'**函 数 名:DelNotifyIcon 
'**输 入:frm(Form) - 窗体 
'**输 出:无 
'**功能描述:删除托盘图标 
'**全局变量: 
'**调用模块: 
'**作 者:叶帆 
'**日 期:2004-10-14 09:33:01 
'**修 改 人: 
'**日 期: 
'**版 本:V1.0.0 
'************************************************************************* 
Public Sub DelNotifyIcon(frm As Form) 
 If lngPreWndProc <> 0 Then 
 ' 删除托盘区图标 
 Dim IconData As NOTIFYICONDATA 
 With IconData 
 .cbSize = Len(IconData) 
 .hwnd = frm.hwnd 
 .uId = 0 
 .uFlags = NIF_TIP Or NIF_ICON Or NIF_MESSAGE 
 .uCallBackMessage = WM_NOTIFYICON 
 .szTip = "" 
 .hIcon = frm.Icon.Handle 
 End With 
 Shell_NotifyIcon NIM_DELETE, IconData 
 SetWindowLong frm.hwnd, GWL_WNDPROC, lngPreWndProc 
 lngPreWndProc = 0 
 End If 
End Sub 
'************************************************************************* 
'**函 数 名:WindowProc 
'**输 入:ByVal hwnd(Long) - 
'** :ByVal msg(Long) - 
'** :ByVal wParam(Long) - 
'** :ByVal lParam(Long) - 
'**输 出:(Long) - 
'**功能描述:frmTest 窗口入口函数 
'**全局变量: 
'**调用模块: 
'**作 者:叶帆 
'**日 期:2004-10-14 09:19:06 
'**修 改 人: 
'**日 期: 
'**版 本:V1.0.0 
'************************************************************************* 
Function WindowProc(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 
 ' 拦截 WM_NOTIFYICON 消息 
 If msg = WM_NOTIFYICON Then 
 Select Case lParam 
 Case WM_RBUTTONUP 
 ' 右键单击图标是运行这里的代码, 可以在这里添加弹出右键菜单的代码 
 Case WM_LBUTTONDBLCLK 
 ' 左键单击 显示窗体 
 frmTest.Show 
 Case NIN_BALLOONSHOW 
 Debug.Print "显示气球提示" 
 Case NIN_BALLOONHIDE 
 Debug.Print "删除托盘图标" 
 Case NIN_BALLOONTIMEOUT 
 Debug.Print "气球提示消失" 
 Case NIN_BALLOONUSERCLICK 
 Debug.Print "单击气球提示" 
 End Select 
 End If 
 WindowProc = CallWindowProc(lngPreWndProc, hwnd, msg, wParam, lParam) 
End Function  
 
  
 
189 灰色按钮克星--按钮激活  
 灰色按钮克星--按钮激活  
-------------------------------------------------------------------------------- 
作者:bbsxwk  来源于:中国VB网  发布时间:2005-10-29  
现在有很多软件未注册时有些按钮是灰色的,不能按下,通过以下小程序即可激活他. 
 03年的时候我用delphi写过一个http://www.onlinedown.net/soft/23743.htm 当时跌跌撞撞,在大富翁里请教了好多高手才完成.现在学了VB了,于是自己从新用VB写了一个,从中也了解一下VB里一些API的用法. 
 我们要用到的API有: 
 GetForegroundWindow,EnumChildWindows,IsWindowEnabled,EnableWindow 
 下面我一一写出这几个API的意义 
 GetForegroundWindow:获得前台窗口的句柄。这里的“前台窗口”是指前台应用程序的活动窗口 
 EnumChildWindows:为指定的父窗口枚举子窗口 
 IsWindowEnabled:判断窗口是否处于活动状态(在vb里使用:针对vb窗体和控件,请用enabled属性) 
 EnableWindow:在指定的窗口里允许或禁止所有鼠标及键盘输入(在vb里使用:在vb窗体和控件中使用Enabled属性) 
 好了有这几个API就足够写出这个小程序了. 
 程序很简单,首先新建一个工程,在窗体里放下2个Label,1个Button,1个Timer 
 控件设置:把Label1的Caption设为"句柄:",Label2的Name设为LabHwnd,Caption为空.Command1的Caption为"激活",Timer1的Enable设为False,Interval设为1000. 
 以下为代码部分: 
 'Module 
Option Explicit 
Public Declare Function GetForegroundWindow Lib "user32" () As Long 
Public Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long 
Public Declare Function IsWindowEnabled Lib "user32" (ByVal hwnd As Long) As Long 
Public Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal fEnable As Long) As Long 
Public Function GetButtonHandle(ByVal hwnd As Long, lParam As Long) As Long '返回每个控件的句柄 
GetButtonHandle = True '设定为True才会再找下一个 
If IsWindowEnabled(hwnd) = False Then '判断是否有enable的东东 
 Call EnableWindow(hwnd, True) '调用激活 
End If 
End Function 
'Form 
Option Explicit 
Dim ButtonHandle As Long 
Private Sub Command1_Click() 
Timer1.Enabled = True 
End Sub 
Private Sub Timer1_Timer() 
LabHwnd.Caption = GetForegroundWindow '显示句柄 
ButtonHandle = GetForegroundWindow 
ButtonHandle = EnumChildWindows(ButtonHandle, AddressOf GetButtonHandle, ButtonHandle) '这个API我不是很懂第3个参数的意义,因为如果声明的时候把 ByVal lParam As Long 改为 ByVal lParam As Form 这样这个参数改为Form1就可以了,好像没有什么意义,希望知道的能告诉我实际含义. 
End Sub  
 
  
 
190 奇形怪状的窗体  
 奇形怪状的窗体  
-------------------------------------------------------------------------------- 
作者:不详  来源于:中国VB网  发布时间:2005-9-10  
普通的窗体都是方方的,使用API函数可以做出一些奇怪的形状。比如,窗体是圆角矩形,在中间挖一个椭圆形的洞。  
先要理解一个重要的概念:区域。区域是描述设备场景中某一块的GDI对象,每个区域都有一个句柄。一个区域可以是矩形,也可以是复杂的多边形,甚至是几个区域组织在一起。窗体默认的区域就是我们看到的矩形,当然它并非一定要用这个默认的区域 
现在开始,首先在窗体上做一个圆角矩形区域,这是窗体的大致轮廓。在圆角矩形里再确定一个椭圆形的区域,然后把这两个区域组织成一个区域,并设置窗体的区域为这个组织出来的区域。 
CreateRoundRectRgn函数用于创建一个圆角矩形区域;CreateEllipticRgn用于创建一个椭圆区域;CombineRgn函数用于将两个区域组合为一个新区域;SetWindowRgn函数允许您改变窗口的区域。使用其他的函数还可以做出其他更奇怪的窗体。 
源代码如下: 
Option Explicit 
' API 函数声明 
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long 
Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long 
Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long 
Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long 
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long 
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long 
'常数声明 
Private Const RGN_DIFF = 4 
' 目标区域被设置为两个区域不相交的部分 
'模块级变量声明 
Private OutRgn As Long 
' 外边的圆角矩形区域 
Private InRgn As Long 
' 里边的椭圆区域 
Private MyRgn As Long 
' 圆角区域剪切掉椭圆区域后的区域,也是窗体最终的形状 
Private Sub Form_Click() 
If OutRgn <> 0 And InRgn <> 0 And MyRgn <> 0 Then Exit Sub 
Dim w As Long, h As Long 
w = ScaleX(Form1.Width, vbTwips, vbPixels) 
h = ScaleY(Form1.Height, vbTwips, vbPixels) 
MyRgn = CreateRectRgn(0, 0, 0, 0) 
OutRgn = CreateRoundRectRgn(30, 30, w - 30, h - 30, 100, 100) 
InRgn = CreateEllipticRgn(100, 100, w - 100, h - 100) 
Call CombineRgn(MyRgn, OutRgn, InRgn, RGN_DIFF) 
Call SetWindowRgn(Form1.hWnd, MyRgn, True) 
Form1.BackColor = QBColor(4) 
End Sub 
Private Sub Form_DblClick() 
Unload Form1 
End Sub 
Private Sub Form_Load() 
OutRgn = 0 
InRgn = 0 
MyRgn = 0 
Form1.Width = 7800 
Form1.Height = 6000 
End Sub 
Private Sub Form_Unload(Cancel As Integer) 
If MyRgn <> 0 Then DeleteObject MyRgn 
If OutRgn <> 0 Then DeleteObject OutRgn 
If InRgn <> 0 Then DeleteObject InRgn 
End Sub 
这个程序运行后,在窗体上单击,窗体就会变形,双击窗体程序结束。要注意的是,在卸载窗体时,用DeleteObject函数删除已定义的区域。  
 
  
 
191 VB游戏写作技巧(1)秀图篇  
 VB游戏写作技巧(1)秀图篇  
-------------------------------------------------------------------------------- 
作者:不详  来源于:中国VB网  发布时间:2004-10-20  
一开始,我想先从游戏的图形先讲起好了,毕竟游戏最重要的就是画面,一个没有漂亮图形的游戏,我连碰都不想去碰。那该怎么处理游戏的图形呢?VB提供了一个非常好用的控制项--PictureBox,有了这个控制项我们才能轻松的在程式中秀出图形,现在就来看看PictureBox有那些特性可以让我们在游戏中使用。 
Picture 属性:只要将这个属性填入正常的图形档名,VB就会自动帮我们载入图形档。 
Visible 属性:这个属性可以让图形消失或让图形出现在画面上。 
用法:Form1.Picture1.Visible = False '消失 
Form1.Picture1.Visible = True '出现 
Left 属性:表示图形的位置的X座标。 
Top 属性:表示图形的位置的Y座标。 
用法:改变这两个属性就可以改变图形的位置。 
ScaleMode 属性:设定PictureBox所使用的座标单位,一般都设为"3-像素" 
知道了PictureBox的特性後,要怎么样把它应用到游戏中呢?举个例子好了,我现在要做一个打砖块的游戏,需要用到那些图片呢?砖块、球、击球的板子,一共有三张图,所以我们就使用三个PictureBox,将图片载入到PictureBox里面,如下面所示: 
Picture1 砖块的图片 
Picture2 球的图片 
Picture3 板子的图片 
接著我就可以写,当我按下方向键的右键时,Picture3的left属性+1,按下左键则-1,这样一来不就可以控制板子的左右移动了吗?球也是一样,只要每隔一段时间更改一次Picture2的left和top 属性,就可以做出球移动的效果了。 
或许有人会觉得奇怪,一张图就要用到一个PictureBox,小游戏的图不多还没关系,如果是RPG的话不就要动用到几千个甚至几万个PictureBox?岂不是麻烦死了?所以如果图片很多的时候,我通常都是把图全部都放在同一个图形档里面,这样就只要用到一个PictureBox了,要用图片时从里面把它抓出来就好了,不过要怎么抓呢?我建议使用函数BitBlt()来做图形的搬移。 
使用BitBlt函数前要先宣告: 
Declare Sub BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) 
hDestDC 目的地的DC 
x 目的地的座标x 
y 目的地的座标y 
nWidth 来源图片的宽度 
nHight 来源图片的高度 
hSrcDC 来源图片的DC 
xsrc 来源图片的座标x 
ysrc 来源图片的座标y 
dwrop 运算方法:&HCC0020 PUT 
&H8800C6 AND 
&HEE0086 OR 
&H660046 XOR 
现在有两个PictureBox 
Picture1 AutoRedRaw 属性设为Ture 
ScaleMode 属性设为"3-像素" 
Picture2 AutoRedRaw 属性设为Ture 
ScaleMode 属性设为"3-像素" 
若想将Picture2里(10,10)-(100,100)区域内的图形拷贝到Picture1的(0,0) 
可以这样写: 
BitBlt Picture1.hdc,0,0,90,90,Picture2.hdc,10,10,&HCC0020 
这样子平常写游戏时就只要设两个PictureBox,一个专门用来显示,另一个则用来放图形资料,需要时再用BitBlt函数覆制过去就好了,不是很方便吗? 
  
 
192 VB游戏写作技巧(2)网络篇  
 VB游戏写作技巧(2)网络篇  
-------------------------------------------------------------------------------- 
作者:不详  来源于:中国VB网  发布时间:2004-10-20  
这一次写的是如何用VB来写网路程式的方法,你可不要以为这是什么深奥的程式,其实只要一个Winsock 控制项就可以了,现在就来介绍一下Winsock 的用法: 
步骤一:首先要先把控制项给叫出来,你只要按下Ctrl+T後选取Winsock Control 5.0若是用VB6 的就选Winsock Control 6.0,这样就可以使用Winsock元件。 
步骤二:再来我们必须先确定程式是作Server端还是Client端的,要先设定一些属性: 
Server写法:winsock1.localPort = 5400 (数字可以随便设) 
winsock1.Listen (等待连线) 
Client写法:winsock1.RemoteHost = "对方IP" 
winsock1.RemoteProt = 5400 (必须要和Server端相同) 
winsock1.LocalProt = 0 
winsock1.Connect (连线) 
连线之前Client端要先知道Server端的IP,接著等到Server端等待连线时,Client端就可以呼叫Connect方法,双方连线成功後就可以传输资料。 
步骤三:当Client连线的时候Server端会引发ConnectionRequest事件,Server的程式要这样子写: 
Private Sub Winsock1_ConnectionRequest(ByVal requestID As long) 
winsock1.Close 
winsock1.Accept requestID 
End Sub 
步骤四:这样一来就可以传送资料了,传送和接受资料的方法如下: 
传送资料:mydata = "你好吗?" 
winsock1.sendData mydata 
这样就会把mydata给传到对方那里。 
接受资料:当有资料送到的时候会引发DataArrival事件。 
Privata Sub Winsock1_DtatArrival(ByVal bytesTotal As long) 
Dim mydata As String 
winsock1.GetData mydata 会把送到的资料给mydata 
End Sub 
Winsock 控制项就那么简单,只要会这些就可以写网路游戏了。  
 
  
 
193 用Winsock实现点对点通信  
 Winsock控件是VB5.0的新增功能,它解决了以往应用VB编程时网络中应用程序之间无法实现点对点通信的难题。Winsock使用的TCP协议和UDP协议允许建立并保持一个到远程计算机上的连接,且可以在连接结束之前实时地进行数据交换。用户仅通过设置属性并借助事件处理就能够轻而易举地连接到一个远程的计算机上,而且只用两个命令就可以实现数据交换。 
  使用TCP协议时,如果需要创建一个客户应用程序,就必须识别服务器的名称或IP地址。应用程序的通信端口随时都将仔细监测对方发出的消息,这是系统进行可靠连接的保证。一旦连接发生,任何一方都可以通过SendData发送和接收数据,并借助GetData把自己的数据分离出来。 
  传送数据时,需要先设定客户机的LocalPort属性,服务器则只需要把RemoteHost属性设定为客户机以太网的地址,并设定与客户机LocalPort属性相同的端口地址,借助SendData方法开始发送消息。客户机则在GetData事件中通过DataArrival事件分离出发送的信息。 
  一个Winsock控件可以让本地计算机连接到远程的计算机上,同时使用UDP或TCP协议,两个协议都能创建客户机和服务器应用。 
  使用Winsock控件时,通信的双方需要选定相同的协议。TCP协议适用于传送大容量、需要安全性保证的数据文件;而UDP协议适用于需要分别与很多下属通信,或者建立的连接比较多且为时变的情况,特别是在数据量很小的时候。设定时可以使用Winsock1.Protocol = sckTCPProtocol方法,首先要找到你的计算机的名称,并把它添入Winsock的LocalHost属性中。 
  创建一个应用程序时,首先要确定你建立的是客户方应用还是服务器服务,只有建立的服务器应用开始工作,并进入监听状态时,客户应用程序才开始建立连接,进入正常的通信状态。笔者建立了一个应用程序,它的功能是当客户方的鼠标移动时,服务器应用程序上能够实时显示该鼠标的位置。下面是建立服务器应用的方法: 
1.创建一个新的标准EXE文件; 
2.加入一个Winsock控件; 
3.加入如下代码: 
Private Sub Form_Load() 
tcpServer.LocalPort = 1001 
tcpServer.Localhost = 〃servser〃 
tcpServer.remotePort = 1002 
tcpServer.Localhost = 〃klint〃 
tcpServer.Listen 
End Sub 
′连接检查 
Private Sub tcpServer_ConnectionRequest _ 
(ByVal requestID As Long) 
If tcpServer.State <> sckClosed Then _ 
tcpServer.Close 
tcpServer.Accept requestID 
End Sub 
′发送数据 
Private Sub frmserver_monsemove(x,y) 
tcpServer.SendData 〃x〃& str(x) 
tcpServer.SendData 〃y〃& str(y) 
End Sub 
建立客户应用的方法为: 
1.创建一个新的标准EXE文件; 
2.加入一个Winsock控件; 
3.加入两个TEXT框—— txt_x和 txt_y; 
4.加入如下代码: 
Private Sub Form_Load() 
tcpServer.LocalPort = 1002 
tcpServer.Localhost = 〃klint〃 
tcpServer.remotePort = 1001 
tcpServer.Localhost = 〃servser〃 
tcpServer.Listen 
End Sub 
′连接检查 
Private Sub tcpklint_ConnectionRequest _ 
(ByVal requestID As Long) 
If tcpklint.State <> sckClosed Then _ 
tcpklint.Close 
tcpklint.Accept requestID 
End Sub 
Private Sub tcpClient_DataArrival _ 
(ByVal bytesTotal As Long) 
Dim strData As String 
tcpklint.GetData strData 
if left(strData,1)=〃X〃then 
txt_x.Text = strData 
else 
txt_y.Text = strData 
endif 
End Sub 
  以上例程实现的是一个非常简单的点对点通信,在此基础上略加改造,可以形成功能复杂的实时计算机网络A-A交互通信系统,用于控制、图形仿真等。 
  使用UDP协议建立对等通信和通过TCP建立客户/服务器通信的方法略有不同,它不需要建立客户和服务器,而是建立对等通信。此过程通过以下几步实现: 
1.设定Winsock的RemoteHost 属性为一个通信的计算机名称; 
2.设定 RemotePort 为一个接口号; 
3.调用Winsock的Bind 事件绑定本地的接口号。具体设定方法为: 
Private Sub Form_Load() 
With Winsock1 
.RemoteHost= 〃PeerB〃 
.RemotePort = 1001 ′远程连接号 
.Bind 1002 
′绑定的本地号 
End With 
End Sub 
  程序的其它部分与TCP方法类似,即通过SendData 和GetData 方法发送或提取数据。UDP和TCP协议在使用中各有特点,如果灵活使用,可以得到很好的效果。令人欣慰的是,VB5.0中Winsock给我们提供了一种简便的数据传送方法,使我们得以轻松地实现网络点对点通信。  
 
  
 
194 可以动态注册和反注册ActiveX控件  
 可以动态注册和反注册ActiveX控件  
-------------------------------------------------------------------------------- 
作者:不详  来源于:中国VB网  发布时间:2005-10-29  
'这是一个可以动态注册和反注册ActiveX控件的程序,任何一个 
'ActtiveX控件都有DllRegisterServer和 
'DllUnregisterServer两个输出函数 
'点击Command2反注册Threed32.Ocx控件,在VB菜单中选 
'Project|components或按Ctrl+T,在控件列表框中可以看 
'到已经没有Threed32.Ocx了。再运行程序,点击Command1 
'重新注册控件。 
'作者 PerFect 
'E-Mail zp-perfect@163.com 
Private Declare Function RegComCtl32 Lib "Threed32.OCX" _ 
 Alias "DllRegisterServer" () As Long 
Private Declare Function UnRegComCtl32 Lib "Threed32.OCX" _ 
 Alias "DllUnregisterServer" () As Long 
Private Declare Function FormatMessage Lib "kernel32" _ 
 Alias "FormatMessageA" (ByVal dwFlags As Long, _ 
 lpSource As Any, ByVal dwMessageId As Long, _ 
 ByVal dwLanguageId As Long, ByVal lpBuffer _ 
 As String, ByVal nSize As Long, Arguments As _ 
 Long) As Long 
Private Declare Function GetLastError Lib "kernel32" () As Long 
Const ERROR_SUCCESS = &H0 
Private Sub Command1_Click() 
 Dim astr As String 
  
 '注册Threed32.Ocx 
 If RegComCtl32 = ERROR_SUCCESS Then 
 MsgBox "注册成功" 
 Else 
 astr = String$(256, 20) 
 FormatMessage FORMAT_MESSAGE_FROM_SYSTEM Or _ 
 FORMAT_MESSAGE_IGNORE_INSERTS, 0&, GetLastError, _ 
 0&, astr, Len(astr), ByVal 0 
 MsgBox astr 
 End If 
End Sub 
Private Sub Command2_Click() 
 Dim astr As String 
  
 '反注册Threed32.Ocx 
 If UnRegComCtl32 = ERROR_SUCCESS Then 
 MsgBox "反注册成功" 
 Else 
 astr = String$(256, 20) 
 FormatMessage FORMAT_MESSAGE_FROM_SYSTEM Or _ 
 FORMAT_MESSAGE_IGNORE_INSERTS, 0&, GetLastError, _ 
 0&, astr, Len(astr), ByVal 0 
 MsgBox astr 
 End If 
End Sub  
 
  
 
195 用vb.net读取INI配置文件  
 用vb.net读取INI配置文件的方法,使用API  
因为对XML前不了解,所以对XML方式来做配置文件我都不能很好的实现 
但为了应行,只有先使用INI的文来记录了 
也就沿用了VB6里的INI文读取方法 
 '声明INI配置文件读写API函数 
 Private Declare Function GetPrivateProfileString()Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Int32, ByVal lpFileName As String) As Int32 
 Private Declare Function WritePrivateProfileString()Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Int32 
 '定义读取配置文件函数 
 Public Function GetINI()Function GetINI(ByVal Section As String, ByVal AppName As String, ByVal lpDefault As String, ByVal FileName As String) As String 
 Dim Str As String = LSet(Str, 256) 
 GetPrivateProfileString(Section, AppName, lpDefault, Str, Len(Str), FileName) 
 Return Microsoft.VisualBasic.Left(Str, InStr(Str, Chr(0)) - 1) 
 End Function 
 '定义写入配置文件函数 
 Public Function WriteINI()Function WriteINI(ByVal Section As String, ByVal AppName As String, ByVal lpDefault As String, ByVal FileName As String) As Long 
 WriteINI = WritePrivateProfileString(Section, AppName, lpDefault, FileName) 
 End Function 
 Private Sub Form1_Load()Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
 Dim path As String 
 path = Application.StartupPath + "\server.ini" 
 TextBox1.Text = GetINI("Server", "IP", "", path) 
 TextBox2.Text = GetINI("Server", "port", "", path) 
 End Sub 
 Private Sub Button1_Click()Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
 Try 
 Dim path As String 
 path = Application.StartupPath + "\server.ini" 
 WriteINI("Server", "IP", TextBox1.Text, path) 
 WriteINI("Server", "port", TextBox2.Text, path) 
 MsgBox("配置设置已经成功!!!!") 
 Me.Close() 
 Catch ex As Exception 
 MsgBox("错误!!!!") 
 End Try 
 End Sub  
 
  
 
196 INI的替代品--XML配置文件读取与保存  
 INI的替代品--XML配置文件读取与保存  
.Net中并没有提供INI读写的托管类库,如果使用INI必须调用非托管API。有一个NINI提供了托管类库。  
今天我们来实现XML配置文件读取与保存。  
1.集合类  
 首先我们需要一个集合类来保存键和键值。它必须同时提供键名和索引两种查找键值的办法。所以我们采用 System.Collections.Specialized.NameValueCollection 类。需要注意的是这个类的键值只能是String。  
 
Imports System.Xml  
Public Class SettingClass Setting  
 Inherits System.Collections.Specialized.NameValueCollection  
End Class  
2.XML配置文件格式  
 配置文件格式我们采用app.config的格式  
 
<?xml version="1.0" encoding="utf-8"?>  
<configuration>  
 <appSettings>  
 <add key="key1" value="value1"/>  
 </appSettings>  
</configuration>  
  
3.XML配置文件的读取  
 Sub LoadSetting()Sub LoadSetting(ByVal FilePath As String)  
 Dim Reader As XmlTextReader  
 Try  
 Reader = New XmlTextReader(FilePath)  
 Reader.WhitespaceHandling = WhitespaceHandling.None '忽略所用Whitespace  
 Me.Clear() '清除现有所有数据  
 Catch ex As Exception  
 MsgBox("找不到XML文件" + ex.ToString)  
 Exit Sub  
 End Try  
 Try  
 While Reader.Read  
 If Reader.Name = "add" Then  
 Dim Key, Value As String  
 Reader.MoveToAttribute("key")  
 Key = Reader.Value  
 Reader.MoveToAttribute("value")  
 Value = Reader.Value  
 Me.Set(Key, Value)  
 Reader.MoveToElement()  
 End If  
 End While  
 Catch ex As Exception  
 MsgBox("XML文件格式错误" + ex.ToString)  
 Exit Sub  
 Finally  
 Reader.Close()  
 End Try  
 End Sub  
3.XML配置文件的写入  
 Sub SaveSetting()Sub SaveSetting(ByVal FilePath As String)  
 Dim Writer As New XmlTextWriter(FilePath, System.Text.Encoding.Default)  
 Writer.WriteStartDocument() '写入XML头  
 Dim I As Integer  
 Writer.WriteStartElement("configuration")  
Writer.WriteStartElement("appSettings")  
 For I = 0 To Me.Count - 1  
 Writer.WriteStartElement("add")  
 Writer.WriteStartAttribute("key", String.Empty)  
 Writer.WriteRaw(Me.GetKey(I))  
 Writer.WriteEndAttribute()  
 Writer.WriteStartAttribute("value", String.Empty)  
 Writer.WriteRaw(Me.Item(I))  
 Writer.WriteEndAttribute()  
 Writer.WriteEndElement()  
 Next  
 Writer.WriteEndElement()  
 Writer.WriteEndElement()  
 Writer.Flush()  
 Writer.Close()  
 End Sub