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