宝峰科技

 找回密码
 注册

QQ登录

只需一步,快速开始

智能终端设备维修查询系统注册会员邮箱认证须知!
查看: 5238|回复: 1

[VB电子教程] VB常用内部函数一览表

[复制链接]

该用户从未签到

zxc3412 发表于 2010-5-20 18:46:16 | 显示全部楼层 |阅读模式

欢迎您注册加入!这里有您将更精采!

您需要 登录 才可以下载或查看,没有账号?注册

x

??Vb常用内部函数
??请单击要查看的函数组:
??类型转换函数 数学函数 日期与时间函数 随机数函数
??字符串函数 文件操作函数 窗体输入输出函数
??
??单击下面的大标题可以返回此处:
?? 类型转换函数
??1、 Int(x):求不大于自变量x的最大整数
??2、 Fix(x):去掉一个浮点数的小数部分,保留其整数部分
??3、 Hex$(x):把一个十进制数转换为十六进制数
??4、 Oct$(x):把一个十进制数转换为八进制数
??5、 Asc(x$):返回字符串x$中第一个字符的ASCII字符
??6、 CHR$(x):把x的值转换为相应的ASCII字符
??7、 Str$(x):把x的值转换为一个字符串
??8、 Cint(x):把x的小数部分四舍五入,转换为整数
??9、 Ccur(x):把x的值转换为货币类型值,小数部分最多保留4 位且自动四舍五入
??10、 CDbl(x):把x值转换为双精度数
??11、 CLng(x):把x的小数部分四舍五入转换为长整数型数
??12、 CSng(x):把x值转换为单精度数
??13、 Cvar(x):把x值转换为变体类型值
??14、 VarPtr(var):取得变量var的指针
?? 数学函数
??1、 Sin(x):返回自变量x的正弦值
??2、 Cos(x): 返回自变量x的余弦值
??3、 Tan(x): 返回自变量x的正切值
??4、 Atn(x): 返回自变量x的反正切值
??5、 Abs(x): 返回自变量x的绝对值
??6、 Sgn(x): 返回自变量x的符号,即当x为负数时,返回-1;当x为0时,返回
?? 0;当x为正数时,返回1
??7、 Sqr(x):返回自变量x的平方根,x必须大于或等于0
??8、 Exp(x):返回以e为底,以x为指数的值,即求e的x次方
?? 日期与时间函数
??1、 Day(Now):返回当前的日期
??2、 WeekDay(Now):返回当前的星期
??3、 Month(Now):返回当前的月份
??4、 Year(Now):返回当前的年份
??5、 Hour(Now):返回小时(0~23)
??6、 Minute(Now):返回分(0~59)
??7、 Second(Now):返回秒 (0~59)
?? 随机数函数
??1、 Rnd[(x)]:产生一个0~1之间的单精度随机数
??2、 Randmize[(x)]:功能同上,不过更好
?? 字符串函数
??1、 LTrim$(字符串):去掉字符串左边的空白字符
??2、 Rtrim$(字符串):去掉字符串右边的空白字符
??3、 Left$(字符串,n):取字符串左部的n个字符
??4、 Right$(字符串,n):取字符串右部的n个字符
??5、 Mid$(字符串,p,n):从位置p开始取字符串的n个字符
??6、 Len(字符串):测试字符串的长度
??7、 String$(n,字符串):返回由n个字符组成的字符串
??8、 Space$(n):返回n个空格
??9、 InStr(字符串1,字符串2):在字符串1中查找字符串2
??10、 Ucase$(字符串):把小写字母转换为大写字母
??11、 Lcase$(字符串):把大写字母转换为小写字母
??
?? 窗体输入输出函数
??1、 Print(字符串):在窗体输出字符串,可以用”&”对变量进行连接后输出
??2、 Tab(n):把光标移到该行的n开始的位置
??3、 Spc(n):跳过n个空格
??4、 Cls:清除当前窗体内的显示内容
??5、 Move 左上角x,左上角y,宽度,高度:移动窗体或控件
??6、 InputBox(prompt,…):跳出一个数据输入窗口,返回值为该窗口的输入值
??7、 MsgBox(msg,[type]…):跳出一个提示窗口
??
?? 文件操作函数
??1、 Open 文件名 [For方式] [Access存取类型] [锁定] AS [#]文件号 [Len=记录长度]
??功能:为文件的输入输出分配缓冲区,并确定缓冲区所使用的存取方式
??说明:
??1) 方式:指定文件的输入输出方式,可选,默认是Random,可以是以下值
??a、 Output:指定顺序输出方式,将覆盖原有内容
??b、 Input:指定顺序输入方式
??c、 Append:指定顺序输出方式,在文件未尾追加内容
??d、 Random:指定随机存取方式,也是默认方式,在Random方式时,如果没有Access子句,则在执行Open语句时,VB将按下列顺序打开文件:读/写、只读、只写
??e、 指定二进制文件。在这种方式下,可以用Get和Put语句对文件中任何字节位置的信息进行读写。在Binary方式中,如果没有Access子句,则打开文件的类型与Random方式相同
??2)、存取类型:放在关键字Access之后,用来指定访问文件的类型。可以是下列类型之一
??a、 Read:打开只读文件
??b、 Write:打开只写文件
??c、 Read Write:打开读写文件。这种类型只对随机文件、二进制文件及用Append方式打开的文件有效
?? 3)、锁定:该子句只在多用户或多进和环境中使用,用来限制其他用户或其他进程对打开进行读写操作。锁定类型包括:
??a、 默认:如不指定锁定类型,则本进程可以多次打开文件进行读写;在文件打开期间,其他进程不能对该文件执行读写操作
??b、 Lock Shared:任何机器上的任何进程都可以对该文件进行读写操作
??c、 Lock Read:不允许其他进程读该 文件。只在没有其他Read存取类型的进程访问该文件时,才允许这种锁定。
??d、 Lock Write:不允许其他进程写这个文件。只在没有其他Write存取类型的进程访问该文件时,才允许这种锁定
??e、 Lock Read Write:不允许其他进程读写这个文件
??如果不使用lock子句,则默认为Lock Read write
??4)、文件号:由用户自行指定一个由1~511之间的整数,只要该文件号未被使用就合法;打开文件后,可以用该文件号进行读写等操作
??5)、记录长度:是一个整型表达式。当选择该参量时,为随机存取文件设置记录长度。对于用随机访问方式打开的文件,该值是记录长度;对于顺序文件,该值是缓冲字符数。”记录长度”不能超过32767字节。对于二进制文件,将忽略Len子句
??举例:Open “price.dat” for Output as #1
??Open “C:\abc.dat” for radom as #1 len=256
??
??2、 Close [#文件号][,#文件号]……:关闭文件
??3、 Seek #文件号,位置:文件指针跳到指定位置,以字节为单位。取值1~pow(2,31)-1
??4、 Seek (文件号):返回当前文件指针的位置
??5、 FreeFile():取得一个未使用的文件号
??6、 Loc(文件号):返回指定文件的当前读写位置
??7、 LOF(文件号):返回文件长度
??8、 EOF(文件号):用来测试文件是否结束,结束返回true
??9、 Print #文件号,变量1,变量2,…变量n:按顺序将各变量的值写入顺序文件
??如果是print #文件号,则写入空行
??10、 Write #文件号,表达式表…:作用同 Print
??11、 Input #文件号,变量表….:读顺序文件,进行与Print相反的操作
??12、 Line Input #文件号,字符串变量:从顺序文件中读入一行
??13、 Input$(n,#文件号):从顺序文件读出 n个字符的字符串
??14、 Put #文件号,[记录号],变量:把除对象变量和数组变量外的任何变量(包括号含有单个数组元素的下标变量)的内容写入随机文件。
??例如:Put #2,,filebuff
??15、 Get #文件号,[记录号],变量:读随机文件,执行与put相反的操作
??16、 Get|put #文件号,[位置],变量:读写二制文件,位置是指下一次读写操作的位置。
??17、 Kill 文件名:删除文件
??18、 FileCopy 源文件名,目标文件名:复制文件
??19、 Name原文件名 as 新文件名:重命令文件
??
??
??
??msflexgrid中设置内容显示方式? [转贴 2006-11-15 15:59:58]
?? 字号:大 中 小
??使用
?? .FixedAlignment (设置指定列的对齐方式)
?? .ColAlignment (设置指定固定列的对齐方式)
??
?? 常数 值 描述
?? flexAlignLeftTop 0 单元格的内容左、顶部对齐。
?? flexAlignLeftCenter 1 字符串的缺省对齐方式。单元格的内容左、居中对齐。
?? flexAlignLeftBottom 2 单元格的内容左、底部对齐。
?? flexAlignCenterTop 3 单元格的内容居中、顶部对齐。
?? flexAlignCenterCenter 4 单元格的内容居中、居中对齐。
?? flexAlignCenterBottom 5 单元格的内容居中、底部对齐。
?? flexAlignRightTop 6 单元格的内容右、顶部对齐。
?? flexAlignRightCenter 7 数值的缺省对齐方式。单元格的内容右、居中对齐。
?? flexAlignRightBottom 8 单元格的内容右、底部对齐。
?? flexAlignGeneral 9 单元格的内容按一般方式进行对齐。字符串按“左、居中”显示,数字按
??“右、居中”显示。
??FormatString 属性
??
?? 设置 MSHFlexGrid的列宽、对齐方式、固定行文本和固定列文本。
?? 语法
?? object.FormatString [= string]
?? FormatString 属性的语法包含如下部分:
?? 部分 描述
?? object 一个对象表达式,其值为“应用于”列表中的一个对象。
?? string 一个字符串表达式,为格式化在行和列中的文本。如在说明中所述。
?? 说明 在设计时,MSHFlexGrid 语法分析和解释 FormatString 来获得如下信息:行和列的数目、行和列标头的文本、列宽和列对齐方式。
?? FormatString 属性包含由管道字符 (|) 分隔的段。管道字符之间的文本定义一列并且也可能包含特定的对齐字符。这些字符使整个列左对齐(<)、居中(^)或右对齐(>)。另外,根据缺省规定文本被指定给行 0,且文本宽度定义每一列的宽度。
?? FormatString 属性可能包含一个分号 (;)。这使得字符串的余下部分被解释为行标头和行宽度信息。另外,根据缺省规定文本被指定给列 0,且最长的字符串定义列 0 的宽度。 MSHFlexGrid 创建附加的行和列来驻留由 FormatString 定义的所有字段。如果只有几个字段被指定,附加的行和列不被删除。要删除附加的行和列,设置 Rows 和 Cols 属性。
??
?? FormatString 属性示例
?? 下面的示例举例说明 FormatString 属性如何工作。
?? 注意 如果正在使用 MSFlexGrid,用“MSFlexGrid1”代替“MSHFlexGrid1”。 '设置列标头。 s$ = "Sales "
?? MSHFlexGrid1.FormatString = s$
?? ' 设置行标头(注意开始的分号)。
?? s$ = ";Name|Address|Telephone|Social Security#"
?? MSHFlexGrid1.FormatString = s$
?? ' 设置列和行标头。
?? s$ = "|Name|Address|Telephone|Social Security#"
?? s$ = s$ + ";|Robert|Jimmy|Bonzo|John Paul"
?? MSHFlexGrid.FormatString = s$
?? MSHFlexGrid MSFlexGrid 都适用
?? Private Sub Form_Load()
?? With MSFlexGrid1
?? .Rows = 10
?? .Cols = 5
?? For j = 0 To 4
?? .ColAlignment(j) = 1 '--------->as this
?? For i = 0 To 9
?? .TextMatrix(i, j) = i * j
?? Next
?? Next
?? End With
?? End Sub
??首先,msflexgrid1.cellalignment=0 只是设置了当前单元格的显示方式
?? 让每个单元格都居左显示,有两种方法
?? 楼上是一种
?? 另外:
?? With MSHFlexGrid1
?? .Rows = 5
?? .Cols = 4
?? For i = 0 To .Rows - 1
?? For j = 0 To .Cols - 1
?? .Row = i
?? .Col = j
?? '在这了可以对单元格进行各种操作
?? .Text = i & "|" & j
?? .CellAlignment = 1
?? Next j
?? Next i
?? End With
?? 这种方法对于fixed的行和列也有效
??MSFlexGrid控件的CellAlignment 属性是设置单元格对齐方式的。
??例如:
??MSFlexGrid.Col=2
??MSFlexGrid.Row=3
??MSFlexGrid.CellAlignment=3''''把第2列,第3行设置为中间对齐。
??ColAlignment属性是设置该列对齐方式的。
??例如:MSHFlexGrid1.ColAlignment(3)=3''''把第3设置为中间对齐.
??
??后面数字解释如下:
??flexAlignLeftTop 0 单元格的内容左、顶部对齐。
??flexAlignLeftCenter 1 字符串的缺省对齐方式。单元格的内容左、居中对齐。
??flexAlignLeftBottom 2 单元格的内容左、底部对齐。
??flexAlignCenterTop 3 单元格的内容居中、顶部对齐。
??flexAlignCenterCenter 4 单元格的内容居中、居中对齐。
??flexAlignCenterBottom 5 单元格的内容居中、底部对齐。
??flexAlignRightTop 6 单元格的内容右、顶部对齐。
??flexAlignRightCenter 7 数值的缺省对齐方式。单元格的内容右、居中对齐。
??flexAlignRightBottom 8 单元格的内容右、底部对齐。
??flexAlignGeneral 9 单元格的内容按一般方式进行对齐。字符串按“左、居中”显示,数字按“右、居中”。
??VB编程经验之谈----打印篇
??打印多页Rich Text
??  打印对象在处理RichTextBox时由于忽视了Rich Text代码将不会工作得很好。为了打印RichTextBox,要使用SelPrint命令,但是SelPrint不是非常得友好,它按照自己的方式打印然后产生退纸动作。为了打印多页Rich Text,要找到每一页的开始和结束点,然后依此设置SelStart和SelLength,最后使用SelPrint打印出每一页。以下是工作的每一个步骤:
??  1、使用SaveFile命令保存编辑版本的文件。
??  2、转换编辑版本为打印版本:   
??  遍历这个文档,修改SelIndent和SelRightIndent的数值,使之适合于打印机(注意:编辑时的缩进数值对于屏幕是合适的,但不适用于打印机)。
??  做些其他的修改,比如:添加页眉,消除行号。
??  3、使用SelPrint循环一次打印一个页面。这里,计算行数是一个技巧,找到LFCRs是容易的,但是,也必须要计算一下行缠绕,它也算在了行统计中,以及绝对不允许发生的页面溢出情况。
??  4、使用SelRTF=""删除打印版本。
??  5、使用LoadFile重新启动编辑版本。
??  打印MSFlexGrid
??  这里有一个快速打印MSFlexGrid控件内容的方法:
??  Printer.PaintPicture MSFlexGrid_Name.Picture, 0, 0
??  Printer.EndDoc
??  如果想打印满页面的整个长度,请在前面添加下面2个语句:
??  Dim old_width as Integer
??  MSFlexGrid_Name.width=printer.width
??  然后,再在尾部添加:
??  MSFlexGrid_Name.width=old_width  
??  快速打印多个拷贝
??  当以TrueType字体打印一个文档时,系统将下载打印机需要的字体,这样做将花费很长的时间。你可以通过在一个打印机文档中打印所有的拷贝实现快速打印多个拷贝内容:  
??  For i = 1 To num_copies
??  注释: Print the document here...  
??  Printer.NewPage
??  Next i
??  Printer.EndDoc
??  打印灰色行和区域
??  黑白打印机不能打印灰色行,但是能通过发抖处理来创建灰色区域。为了创建围绕一个区域的一个灰色边界,使用DrawStyle=vbInvisible(5)来绘制一个窄灰色框,这样就没有了边界。
??  设置打印的边界
??  使用打印的scale熟悉来设置边界。设置了这个属性后,坐标(0,0)就映射到你需要加边的地方。比如,下面的代码设置左边界为0.5英寸,上边界为0.75英寸。然后再乘以1440转换为twip。
??  Printer.ScaleLeft = -0.5 * 1440
??  Printer.ScaleTop = -0.75 * 1440
??  Printer.CurrentX = 0
??  Printer.CurrentY = 0
??  很遗憾,打印机不能精确地按照你所想的进行打印。试一试使用下面的命令在左上角打印一个1英寸大小的方块:
??  Printer.Line (1440, 1440)-Step(1440, 1440)
??  看看偏离了多少。试一试多打印几次,如果发现打印机有一定规律的偏离,你就可以按照一定的差额进行增减来达到最佳的效果。
??  提供打印预览
??  建立打印程序时,先设置一个要绘制的对象做为参数,然后传递给程序一个打印的对象。
??  为了实现预览效果,传递给程序一个隐藏PictureBox。然后,根据需要的比例,使用PaintPicture拷贝这个隐藏图形到一个可见的PictureBox。在隐藏PictureBox上按照全尺寸绘制图形,首先允许你按比例决定了字体,并且,也实现了不失真地完成其他图形的描述。
?? 2008-6-11 来源:eNet论坛
??
??
??
??msflexgrid打印
??Option Explicit
??Private Const ColDistance = 400
??Private Const RowDistance = 150
??Private Totalwidth As Long
??Private FixedX As Long
??Private FixedY As Long
??Private LinesPerPage As Integer
??Private Lineheight As Integer
??Private Curx As Long
??Private Cury As Long
??Private LineStartx As Long
??Private LineStarty As Long
??Private LineEndy As Long
??Private MaxColWidth As Long
??\'区别于PrintGridNormal: 它打印时题头为第一列而不是第一行
??\'Title: 标题, 将被醒目打印
??\'GridToPrint: 待打印的 控件名称
??\'SubTitle: 附加标题
??Public Sub PrintGridRoutate(Title As String, Gridtoprint As MSFlexGrid, SubTitle As String)
??On Error GoTo PrinTErr
??If MsgBox("请准备好打印机,单击[确定]开始打印...", vbExclamation + vbOKCancel, "准备打印") = vbOK Then
?? Dim T_str As String
?? Dim P As Integer
?? Dim i As Integer
?? Dim j As Integer
?? Dim k As Integer
?? Dim StartRow As Long
?? Dim EndRow As Long
?? Dim L As Integer
?? \'Printer.PaperSize = 9 \'A4纸 210 x 297 毫米
?? P = 0
?? With Gridtoprint
?? StartRow = 1
?? EndRow = .Rows - 1
?? i = 0
?? Printer.Orientation = 1
?? LinesPerPage = 3
?? For k = 0 To EndRow - StartRow
?? If (k Mod LinesPerPage) = 0 Then
??\' Call PrintTitleRoutate(Gridtoprint, Title, SubTitle)
?? End If
?? Cury = FixedY
?? .row = k + StartRow
?? Printer.CurrentY = Cury
?? For j = 0 To .Cols - 1
?? If .ColWidth(j) <> 0 Then
?? .col = j
?? Printer.CurrentX = Curx
?? Printer.Print .Text
?? Cury = Printer.CurrentY + RowDistance * 2
?? Printer.CurrentY = Cury
?? End If
?? Next j
?? Curx = Curx + ColDistance * 1.5 + MaxColWidth
?? Cury = Printer.CurrentY + Lineheight
?? i = i + 1
?? If i = LinesPerPage Then
?? i = 0
?? P = P + 1
?? T_str = "第" & P & "/" & (EndRow - StartRow + 1) \\ LinesPerPage + 1 & "页"
?? Call PrintFooter(FixedX, Cury, T_str)
?? Call PrintTableRoutate(Gridtoprint, Gridtoprint.Cols)
?? Printer.EndDoc
?? Printer.Orientation = 1
?? LinesPerPage = 3
?? End If
?? Next k
?? End With
?? P = P + 1
?? T_str = "第" & P & "/" & (EndRow - StartRow + 1) \\ LinesPerPage + 1 & "页"
?? Call PrintFooter(FixedX, Cury, T_str)
?? Call PrintTableRoutate(Gridtoprint, Gridtoprint.Cols)
?? Printer.EndDoc
??End If
??Exit Sub
??PrinTErr:
?? On Error GoTo 0
?? Call MsgBox("打印机未准备好或有故障!", vbCritical + vbOKOnly, "错误")
?? Printer.KillDoc
??End Sub
??
??\'区别于PrintTitleRoutate: 它打印时题头为第一行而不是第一列
??Private Sub PrintTitleNormal(Gridtoprint As MSFlexGrid, Title As String, SubTitle As String)
??Dim j As Integer
??On Error GoTo PrinTErr
?? Title = Trim(Title)
?? Printer.FontSize = 16
?? Totalwidth = 0
?? For j = 0 To Gridtoprint.Cols - 1
?? If Gridtoprint.ColWidth(j) <> 0 Then
?? Gridtoprint.col = j
?? Totalwidth = Totalwidth + Gridtoprint.ColWidth(j) + ColDistance
?? End If
?? Next j
?? FixedX = (Printer.Width - Totalwidth) \\ 2
?? FixedX = IIf(FixedX > 500, FixedX - 200, FixedX)
?? Curx = (Printer.Width - Len(Title) * Printer.FontSize * 20.2) \\ 2
?? Cury = 1000
?? Printer.CurrentX = Curx
?? Printer.CurrentY = Cury
?? Printer.Print Title
?? Printer.FontSize = 10
?? Lineheight = RowDistance + Printer.FontSize * 20.2
?? Gridtoprint.row = 0
?? Curx = FixedX
?? Cury = Cury + 1000
?? LineStartx = FixedX - ColDistance \\ 2
?? LineStarty = Cury - RowDistance \\ 2
?? If SubTitle <> "" Then
?? Printer.CurrentX = Curx
?? Printer.CurrentY = Cury - RowDistance - Printer.FontSize * 20.2
?? Printer.Print SubTitle
?? End If
?? Printer.CurrentX = Curx
?? Dim OldFontSize As Single
?? OldFontSize = Printer.FontSize
?? Printer.FontSize = 11
?? Printer.Font.Bold = True
?? For j = 0 To Gridtoprint.Cols - 1
?? If Gridtoprint.ColWidth(j) <> 0 Then
?? Gridtoprint.col = j
?? Printer.CurrentY = Cury
?? Printer.Print Gridtoprint.Text
?? Curx = Curx + Gridtoprint.ColWidth(j) + ColDistance
?? Printer.CurrentX = Curx
?? End If
?? Next j
?? Printer.Font.Bold = False
?? Printer.FontSize = OldFontSize
??Exit Sub
??PrinTErr:
?? On Error GoTo 0
?? Call MsgBox("打印机未准备好或有故障!", vbCritical + vbOKOnly, "错误")
?? Printer.KillDoc
??End Sub
??
??Private Sub PrintFooter(X As Long, Y As Long, MyStr As String)
??On Error GoTo PrinTErr
?? Printer.CurrentX = X
?? Printer.CurrentY = Y
?? Printer.Print "打印时间:" & Format(Date, "yyyy-mm-dd") & " " & Format(Time, "hh:mm:ss")
?? Printer.CurrentX = X + Totalwidth - Printer.FontSize * 10.1 * LenB(MyStr)
?? Printer.CurrentY = Y
?? Printer.Print MyStr
??Exit Sub
??PrinTErr:
?? On Error GoTo 0
?? Call MsgBox("打印机未准备好或有故障!", vbCritical + vbOKOnly, "错误")
?? Printer.KillDoc
??End Sub
??
??Private Sub PrintTableRoutate(Gridtoprint As Control, R As Integer)
??Dim L As Integer
??Dim TableRowCol As Long
??On Error GoTo PrinTErr
?? TableRowCol = LineStarty
?? For L = 0 To R
?? Printer.Line (LineStartx, TableRowCol)-(LineStartx + Totalwidth, TableRowCol)
?? TableRowCol = TableRowCol + Lineheight
?? Next L
?? Printer.Line (LineStartx, TableRowCol)-(LineStartx + Totalwidth, TableRowCol)
?? LineEndy = TableRowCol
?? TableRowCol = LineStartx
?? Printer.Line (TableRowCol, LineStarty)-(TableRowCol, LineEndy)
?? TableRowCol = TableRowCol + Totalwidth - 3 * MaxColWidth - ColDistance * 3
?? For L = 0 To 3
?? Printer.Line (TableRowCol, LineStarty)-(TableRowCol, LineEndy)
?? TableRowCol = TableRowCol + ColDistance + MaxColWidth
?? Next L
??Exit Sub
??PrinTErr:
?? On Error GoTo 0
?? Call MsgBox("打印机未准备好或有故障!", vbCritical + vbOKOnly, "错误")
?? Printer.KillDoc
??End Sub
??
??码多了些,变量也没定义,不能直接用,参考而已
?? 总体思想就是把Grid的图形发到pictureBox中去,按分页的次数发。
?? 然后重设Grid,再发一次
?? SendMessage MFGridPrv.hwnd, WM_VSCROLL, SB_LINEUP, 1
?? 滚动来实现重设Grid
?? 以下代码供参考
?? Private Sub ScrollDown5()
?? '第五个按钮的集合代码
?? Dim i As Integer
??nMFGridCurRowTop = 1 'MFGridPrv当显示行顶行row值记录下一将显示的row
??nMFGridCurPos = 0 '当前位置标识,0首,1尾,-1 中间,初始化为0
??nMFGridFullType = -2 '当前所有行与MFGridPrv关系,0刚好相等,-1没有占满,1多出
??nMFGridRowNum = 0 '记录MFGridPrv中显示的行数,滚动依据,显示不全的不在其中
?? nMFGridDisplayHeight = 0 '记录MFGridPrv所有显示出来的行的总行高
??nMFGridCurPosLat = 0 '下一步位置标识,0首,1尾,-1 中间,初始化为0
?? nMFGridFullTypeLat = -2 '下一步所有行与MFGridPrv关系,0刚好相等,-1没有占满,1多出
??nMFGridRowNumLat = 0 '记录下一步MFGridPrv中显示的行数,滚动依据,显示不全的不在其中
??nMFGridDisplayHeightLat = 0 '记录下一步MFGridPrv所有显示出来的行的总行高
??'重设高度
??MFGridPrv.Height = nMFGridHeightOri
?? '移回首行
?? For i = 0 To MFGridPrv.Rows - 1
?? SendMessage MFGridPrv.hwnd, WM_VSCROLL, SB_LINEUP, 1
??Next i
??If nMFGridCurPage = 0 Then
?? Me.ToolbarPtn.Buttons(4).Enabled = False
?? End If
??Me.ToolbarPtn.Buttons(5).Enabled = True
?? For i = 0 To nMFGridCurPage - 1
?? subScrollDown
?? If nMFGridCurPos = 1 Then
?? nMFGridCurPage = i
?? Exit For
?? End If
?? Next i
?? End Sub
??
?? Private Sub subScrollDown()
?? Dim i As Integer
?? If nMFGridCurPos <> 1 Then '不到尾部时
?? Me.ToolbarPtn.Buttons(4).Enabled = True
??
?? '检查当前状态
?? subGetMFGridDisplayRow
?? 'MsgBox nMFGridRowNumRe & " " & MFGridPrv.Height
?? 'SendMessage MFGridPrv.hwnd, WM_VSCROLL, SB_PAGEDOWN, 1
?? '当前所有行与MFGridPrv关系,0刚好相等,-1没有占满,1多出
?? If nMFGridFullType = 1 Then '多出
?? '检查下一步的状态
?? subGetMFGridDisplayRowLat
?? If nMFGridCurPosLat = 1 Then
?? MFGridPrv.Height = nMFGridDisplayHeightLat
?? Me.ToolbarPtn.Buttons(5).Enabled = False
?? Me.ToolbarPtn.Buttons(4).Enabled = True
?? End If
?? For i = 0 To nMFGridRowNum - 1
?? SendMessage MFGridPrv.hwnd, WM_VSCROLL, SB_LINEDOWN, 1
?? Next i
??
?? 'SendMessage MFGridPrv.hwnd, WM_VSCROLL, SB_PAGEDOWN, 1
?? End If
?? If nMFGridFullType = 0 Then '刚好
?? '检查下一步的状态
?? subGetMFGridDisplayRowLat
?? If nMFGridCurPosLat = 1 Then
?? MFGridPrv.Height = nMFGridDisplayHeightLat
?? Me.ToolbarPtn.Buttons(5).Enabled = False
?? Me.ToolbarPtn.Buttons(4).Enabled = True
?? End If
?? For i = 0 To nMFGridRowNum - 1
?? SendMessage MFGridPrv.hwnd, WM_VSCROLL, SB_LINEDOWN, 1
?? Next i
?? End If
?? If nMFGridFullType = -1 Then '没占满
?? Me.ToolbarPtn.Buttons(5).Enabled = False
?? Me.ToolbarPtn.Buttons(4).Enabled = True
?? End If
??
?? 'SendMessage MFGridPrv.hwnd, WM_VSCROLL, SB_PAGEDOWN, 1
?? End If
?? End Sub
?? Private Sub subGetMFGridDisplayRow()
?? '函数名:subGetMFGridDisplayRow
?? '入口参数:无
?? '出口参数:无
?? '功能:得到MFGridPrv当前显示的行数,显示一半的不在其中,此为前滚
?? '编写日期:2002.9.4
?? '编写人:yuiee
?? '备注:只对MFGridPrv使用
?? Dim nRowHeightTmp As Integer '当前行高 ,为动态变量
?? Dim nCaluHeight As Integer '动态行高nRowHeight相加的和
?? Dim nMFGridHeight As Integer '控件高
?? Dim nNumTmp As Integer '行数
?? Dim nDisplayHeightTmp '显示出来的行的总行高
?? Dim nTypeTmp As Integer '数据与MFGridPrv关系
?? Dim bExitNo As Boolean '
?? Dim i As Integer
?? '初始高度在调用此过程前设定
?? nMFGridHeight = nMFGridHeightOri
??
??
??
?? nRowHeightTmp = MFGridPrv.RowHeight(0) '标头高
?? nMFGridFullType = -2
?? bExitNo = True
?? For i = nMFGridCurRowTop To MFGridPrv.Rows - 1
?? MFGridPrv.Row = i
??
?? nDisplayHeightTmp = nRowHeightTmp
?? nMFGridRowNumRe = nRowHeightTmp
?? nRowHeightTmp = nRowHeightTmp + MFGridPrv.RowHeight(i)
?? If nRowHeightTmp > nMFGridHeight Then
?? nMFGridFullType = 1
?? bExitNo = False
?? Exit For
?? Else
?? nNumTmp = nNumTmp + 1
?? End If
??
?? Next i
?? If nMFGridFullType = 1 Then
?? If nMFGridCurRowTop <> 1 Then
?? nMFGridCurPos = -1 '中间
?? Else
?? nMFGridCurPos = 0
?? End If
?? End If
?? If nMFGridFullType = -2 Then
?? nMFGridRowNumRe = nRowHeightTmp
?? If nRowHeightTmp < nMFGridHeight Then
?? nMFGridFullType = -1 '小于
?? Else
?? nMFGridFullType = 0 '刚好
?? End If
?? nMFGridCurPos = 1 '到尾部
?? End If
?? nMFGridRowNum = nNumTmp
??
?? If nMFGridCurPos <> 1 Then
?? '得到下一步起始点
?? nMFGridCurRowTop = i
?? End If
??
??
??
?? End Sub
??
??用Printer对象的PaintPicture方法可以输出图象。
??其语法格式如下:
??object.PaintPicture picture,x1,y1,width1,height1, x2,y2,width2,height2,opcode
??object可以是窗体Form、PictureBox控件和Printer对象。其余的参数说明如下:
??picture:这是一个必选参数,用于指定要输出的图象。它必须是窗体Form或PictureBox控件的Picture属性。
??x1,y1:这是必选参数,用于指定要输出图象的左上角坐标,单位的ScaleMode属性决定。
??width1,height1:这是可选参数,用于指定输出图象的宽和高。如果源图的宽和高比这里指定的宽和高要大或小,则输出的图象会相应地压缩或放大到Width1和height1指定的大小。如果省略则按源图的大小输出。
??x2,y2这是可选参数,用于在Picture参数指定的图象中指定一个剪切区域的左上角坐标。如果省略,则按取值为0处理。
??width2,height2:这是可选参数,用于指定剪取区域的宽和高。如果省略,则width2取值为原图的宽度减去x2,height2取值为原图的高度减去y2。
??opcode:这是可选参数,用于指定光栅操作码。它决定源图象以何种方式写到目标图象中。常用的值有vbSrcCopy,vbSrcAnd等。其它的常量值及其说明可以在Visual Basic的联机帮助中通过查找"RasterOp Constants"得到。
?? 在上述参数中指定可选参数时,最后一个可选参数前的所有参数必须指定,如果最后一个可选参数后的可选参数省略时,无须添加逗号。
?? width1,height1两个参数的取值可以是负数,当它们取负值时,会输出一个扳反的图象。为了测试方便可以在PictureBox控件上输出结果以观察不同参数下的各种效果。
??实例:
??(1)程序功能:将PictureBox控件Picture1中的图象用PaintPicture方法以三种不同方式输出到PictureBox控件Picture2中。
??(2)界面设计和控件属性设置:
??------------------------------------------------------
??工程名P
??======================================================
??窗体 Name frmPP
?? Caption "图象输出演示"
?? WindowState 2-Maximized
?? StartupPosition 2-屏幕中心
??------------------------------------------------------
??命令按钮 Name cmdPrint
?? Caption "打印图象"
??------------------------------------------------------
??命令按钮 Name cmdPP
?? Caption "打印"
??------------------------------------------------------
??图片框 Name picOld
?? ScaleMode 6-Millimeter
?? Picture WinLogo.bmp
??------------------------------------------------------
??图片框 Name picNew
?? ScaleMode 6-Millimeter
?? AutoRedraw True
??------------------------------------------------------
??(3)程序清单:
??Private Sub cmdPrint_Click()
??picNew.PaintPicture picOld.Picture,0,0,29,12
??picNew.PaintPicture picOld.Picture,30,30,29,12
??picNew.PaintPicture picOld.Picture,30,70,29,-12
??End Sub
??
??Private Sub cmdPP_Click()
??' 对打印机进行初始设置
??Printer.Orientation = vbPRORPortrait
??Printer.PaperSize = vbPRPSA4
??Printer.ScaleMode = vbMillimeters
??
??' 设置打印参数和打印内容
??Printer.CurrentX = 50
??Printer.CurrentY = 50
??Printer.FontName = "宋体"
??Printer.FontSize = 12
??strContents = "基本打印流程演示"
??
??' 打印输出内容
??Printer.Print strContents
??Printer.CurrentX = 0
??Printer.CurrentY = 0
??Printer.PaintPicture picNew.Image, 0, 0, 29, 12
??Printer.CurrentX = 29
??Printer.CurrentY = 12
??Printer.PaintPicture picOld.Picture, 0, 0, 29, 12
??Printer.EndDoc
??
??End Sub
??(4)小结:
?? 由于第三个输出语句中使用于指定输出图像高度的参数使用了负数,所以输出的结果是一个垂直折反的图像。
?? 命令按钮cmdPP中Printer.PaintPicture方法,将整个打印印作用图片输出目标,因此,它的输出位置由后面的参数决定,而不受Printer.CurrentX和Printer.CurrentY的影响。
?? 尽管使用Printer对象进行打印输出存在着需要编写大量代码、逻辑上较为复杂的缺点,但是,程序员却有更大的灵活性,可以掌握打印过程中的每一个细节,使得在执行一些复杂的打印输出任务时仍然可以应付自如。
??
??
??
??
??'让VB6的MSFlexGrid表格控件支持鼠标滚轮的代码2008年05月27日 星期二 10:34
??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 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 Const GWL_WNDPROC As Long = (-4)
??Private Const WM_MOUSEWHEEL As Long = &H20A
??Public LineNum As Integer
??Private m_OldWindowProc As Long
??Public CtlWheel As Object
??
??
??
??
??这个问题困惑了我两天了。我把我现在写的代码贴上来,请各位高手帮小弟看一下
??此段代码在 model中
??Public Type POINTL
?? x As Long
?? y As Long
?? End Type
??
?? Declare Function CallWindowProc Lib "USER32" Alias "CallWindowProcA" _
?? (ByVal lpPrevWndFunc As Long, _
?? ByVal hwnd As Long, _
?? ByVal Msg As Long, _
?? ByVal wParam As Long, _
?? ByVal lParam As Long) As Long
??
?? Declare Function SetWindowLong _
?? Lib "USER32" Alias "SetWindowLongA" _
?? (ByVal hwnd As Long, _
?? ByVal nIndex As Long, _
?? ByVal dwNewLong As Long) As Long
??
?? Declare Function SystemParametersInfo _
?? Lib "USER32" Alias "SystemParametersInfoA" _
?? (ByVal uAction As Long, _
?? ByVal uParam As Long, _
?? lpvParam As Any, _
?? ByVal fuWinIni As Long) As Long
??
?? Declare Function ScreenToClient Lib "USER32" (ByVal hwnd As Long, xyPoint As POINTL) As Long
??
?? Public prewndpro As Long
?? Public Const GWL_WNDPROC = -4
?? Public Const SPI_GETWHEELSCROLLLINES = 104
?? Public Const WM_MOUSEWHEEL = &H20A
?? Public WHEEL_SCROLL_LINES As Long
??
??
?? Public Sub changedefort(ByVal hwnd As Long) '修改消息处理过程的地址, 将消息发送给newWindowProc函数,
?? prewndpro = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf newWindowProc)
?? Call SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, WHEEL_SCROLL_LINES, 0)
?? If WHEEL_SCROLL_LINES > Int(mainform.MSFlexGrid1.Height / mainform.MSFlexGrid1.CellHeight) Then
?? WHEEL_SCROLL_LINES = Int(mainform.MSFlexGrid1.Height / mainform.MSFlexGrid1.CellHeight)
?? End If
??
?? End Sub
??
?? Public Sub undochangedefort(ByVal hwnd As Long) '将消息处理过程的地址复原
?? Dim returnvalue As Long
?? returnvalue = SetWindowLong(hwnd, GWL_WNDPROC, prewndpro)
??
?? End Sub
??
?? '用newWindowProc处理鼠标滚动事件
?? Public Function newWindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
?? Dim pt As POINTL
?? Select Case uMsg
?? Case WM_MOUSEWHEEL '如果是鼠标的滚轮事件
?? Dim wzDelta, wKeys As Integer 'fwKeys指出是否有CTRL、SHIFT、鼠标键(左、中、右、附加)按下,允许复合。zDelta传递滚轮滚动的快慢,该值小于零表示滚轮向后滚动(朝用户方向),大于零表示滚轮向前滚动(朝显示器方向)
?? wzDelta = HIWORD(wParam)
?? wKeys = LOWORD(wParam)
?? If Sgn(wzDelta) = 1 Then '大于零,鼠标前滚
?? mainform.MSFlexGrid1.row = mainform.MSFlexGrid1.row - WHEEL_SCROLL_LINES
?? mainform.MSFlexGrid1.“refresh”
?? Else '小于零,库表后滚
?? mainform.MSFlexGrid1.row = mainform.MSFlexGrid1.row + WHEEL_SCROLL_LINES
?? mainform.MSFlexGrid1.“refresh”
?? End If
?? Case Else
?? newWindowProc = CallWindowProc(prewndpro, hw, uMsg, wParam, lParam)
?? End Select
??
?? End Function
??
?? Public Function HIWORD(ByVal LongIn As Long) As Integer
?? ' 取出32位值的高16位
?? HIWORD = (LongIn And &HFFFF0000) \ &H10000
?? End Function
??
?? Public Function LOWORD(ByVal LongIn As Long) As Integer
?? ' 取出32位值的低16位
?? LOWORD = LongIn And &HFFFF&
?? End Function
??
?? 下面是在mainform 中的调用过程
?? Private Sub MSFlexGrid1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
?? '判断鼠标的移动范围是不是在msflexgrid中
?? If x > mainform.Frame1.Left And x < mainform.Frame1.Left + mainform.MSFlexGrid1.Width Then
?? If y > mainform.Frame1.Top And y < mainform.Frame1.Top + mainform.MSFlexGrid1.Height Then
?? changedefort mainform.MSFlexGrid1.hwnd
?? undochangedefort mainform.MSFlexGrid1.hwnd
?? End If
?? End If
?? End Sub
??
?? 现在执行到 changedefort 后没有转到我定义的 newWindowProc函数中去执行,为什么呢,还有就是我觉得在mousemove事件中添加这段代码邮点不合适, 但是我也不知道该放在那个是里面更合适
?? 哎! 真是困惑阿
??
??在模块中
??Public Function FlexScroll(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
?? Select Case wMsg
?? Case WM_MOUSEWHEEL
?? Select Case wParam
?? Case -7864320 '向下滚
?? SendKeys "{PGDN}"
?? Case 7864320 '向上滚
?? SendKeys "{PGUP}"
?? End Select
??
?? End Select
?? FlexScroll = CallWindowProc(Oldwinproc, hWnd, wMsg, wParam, lParam)
?? End Function
??
?? 在窗体中:
?? Private Sub MSHFlexGrid1_GotFocus()
?? Oldwinproc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
?? SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf FlexScroll
?? End Sub
??
?? Private Sub MSHFlexGrid1_LostFocus()
?? SetWindowLong Me.hWnd, GWL_WNDPROC, Oldwinproc
?? End Sub
??
?? 使用过很多次,好像还没发生过系统崩溃的显现...
??
??
??
??MouseDown、MouseUp、MouseMove。VB 似乎提供了很好的 Mouse 事件。但好象还缺少什么!对!还差 MouseExit(鼠标移出)事件。在 VB 中,我们要捕捉 MouseExit 事件,必须用 API 函数:
??Private Declare Function SetCapture Lib "user32" (ByVal hWnd As Long) As Long
??Private Declare Function ReleaseCapture Lib "user32" () As Long
??然后,我们可以在控件(以 Picture1 为例)的 MouseMove 事件上加上以下代码:
??
??With Picture1 'Change this to the name of the control
??If Button = 0 Then
??If (X < 0) Or (Y < 0) Or (X > .Width) Or (Y > .Height) Then
??'Mouse pointer is outside button, so let other controls receive
??'mouseevents too:
??ReleaseCapture
??' 放入鼠标离开的代码
??Else
??' Mouse pointer is over button, so we'll capture it, thus
??' we'll receive mouse messages even if the mouse pointer is
??' not over the button
??SetCapture .hwnd
??' 放入鼠标进入的代码
??End If
??
??
??
??模拟MouseEnter,MouseExit事件
??
??p>  很多第三方的控件都提供的 MouseEnter 和 MouseExit 事件来补充 MouseMove 事件的不足(MouseMove 事件不能有效的捕获鼠标是否已在控件外),但是这些控件或要注册,或集合了其他实际没有什么作用控件,另外在程序中加入太多的控件也会影响程序的性能,利用 Windows 的 API 函数,我们可以在 MouseMove 中模拟 MouseEnter 和 MouseExit,虽然我提供的源代码中没有真正的这两个事件,但的确提供了这两个事件所具备的功能。好了!让我们实现吧。
??  首先加载一个模块,在模块中声明以下两个 API 函数:
??Public Declare Function SetCapture Lib "user32" _
??(ByVal hwnd As Long) As Long
??Public Declare Function ReleaseCapture Lib "user32" () As Long
??  SetCapture 的功能是:设置鼠标捕获指定的窗口(Windows 每个控件都是一个窗口。比如桌面上显示的图标就是一个窗口,其实是两个,另一个显示描述这个图标的文本),系统将收到这个窗口所有的鼠标移动或击按的所有信息。
??ReleaseCapture 的功能是:取消捕获鼠标信息。
??  Windows 系统就是一个消息系统,系统一直在等待用户的消息,并加一相应,但处理完一个消息后,系统有处以下一轮的等待。消息传递是 Windows 的核心。
??  让我们在 Form1 中放置一个按钮或其他控件,但此控件必须具有窗口句柄(hWnd),比如 VB 提供的 Image 控件是一个次图形控件,没有窗口句柄,而 Picture,Command Button 等控件就有窗口句柄,我们就拿 Command Button 来作示范,在 Form1 上放置一个 Command Button,在 Command1_MouseMove()事件内加入以下代码:
??Private Sub Command1_MouseMove(Button As Integer, _
??Shift As Integer, X As Single, Y As Single)
??With Command1
??当鼠标在越出控件外
??If Not ((X $#@60; 0) Or (Y $#@60; 0) Or _
??(X $#@62; .Width) Or (Y $#@62; .Height)) Then
??鼠标指针在按钮外时,让其他控件也收到标事件
??ReleaseCapture
??为了不让 MouseMove 事件反复触发
??If .Caption $#@60;$#@62; "outside" Then
??.Caption = "outside"
??E If
??| 鼠标指针在按钮上,捕获他但鼠标移出是我们将收到鼠标事件
??SetCapture .hwnd
??Else
??.Caption = "inside"
??End If
??End With
??End Sub
??
??
??
??
??
??
??
??我设计了一个系统 考虑的安全方面的问题,想进行如下功能:
??当鼠标停止的时候TIMER开始工作,当鼠标停止的的时间超过一个时间(比如20分钟)就会出现一个提示筐:提示“已经20分钟无任何造作,是否退出系统”的提示。
??
??
??请哪位大侠帮帮我 重金酬谢!!!!!!!
??问题补充:
??当关闭系统的时候点击右上角的小X 就直接退出系统了
??能不能写段代码 当点击小X(关闭按钮)的时候弹出提示筐 确认是否关闭系统??
??
??Option Explicit
??
??Private mChkMin As Long
??Private mTmrCount As Long
??
??
??Private Sub Form_Load()
??Timer1.Interval = 60000 '1 min
??Timer1.Enabled = True
??mChkMin = 20 '
??End Sub
??
??Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
??
?? mTmrCount = 0 'reset count to 0
??
??End Sub
??
??''当关闭系统的时候点击右上角的小X 就直接退出系统了
??'能不能写段代码 当点击小X(关闭按钮)的时候弹'出提示筐 确认是否关闭系统??
??Private Sub Form_Unload(Cancel As Integer)
??dim ret as long
??ret = MsgBox(" 是否退出系统 ?", vbYesNo + vbInformation)
??If ret = vbNo Then
?? Cancel = True
??End If
??End Sub
??
??Private Sub Timer1_Timer()
??mTmrCount = mTmrCount + 1
??Dim ret As Long
??
??If mTmrCount >= mChkMin Then
?? ret = MsgBox("已经" & mChkMin & "分钟无任何造作,是否退出系统", vbYesNo + vbInformation)
?? If ret = vbYes Then
?? End
?? End If
?? mTmrCount = 0
??End If
??End Sub
??
??如何用VB制作安装包_百度知道
??可以利用外接程序。。。
??打开需要打包的工程,选择菜单栏中的“外接程序”->外接程序管理器,在对话框中选择“打包和展开向导”,在“加载行为”选项组中选中“加载/卸载”复选框,然后单击确定按钮
??然后选择菜单栏中的"外接程序",发现比刚才多了一个“打包和展开向导”,选择它在对话框中单击打包按钮,后边的事情就简单多了(向导一般做的都很容易的)
??1.选择安装包保存位置
??默认情况下安装包会放到工程文件目录下的“包”目录。可以根据需要进行修改。单击“下一步”
??2.选择包含文件
??“包含文件”对话框已经自动找出了工程中应用的控件、DLL等文件,检查一下有没有一楼的文件。如果有,可以通过“添加”按钮增加用户需要的文件,例如帮助文件Help.chm
??3.选择打包文件类型
??单击“下一步”显示压缩文件选项对话框。现在的安装程序一般都用光盘作为载体,选中单个压缩文件即可
??4.设置安装程序标题
??单击“下一步”显示“安装程序标题”对话框,输入安装程序标题,它会显示在安装背景上。
??5.创建启动菜单项
??单击“下一步”显示“启动菜单项”对话框。在这里创建“开始菜单”中显示的项目,默认只有运行程序。
??6.指定安装位置
??单击“下一步”显示“安装位置”对话框,在这里设置安装包中的文件具体的安装目录,同样是用宏来指定还可以设置子目录,安装时会自动创建不存在的子目录。
??7.共享文件
??单击“下一步”显示“共享文件”对话框选择可能被多个文件使用的文件如ActiveX控件,这样当程序卸载时,不会把共享文件也删除。
??
??另外,可以向楼上说的用第三方打包工具。“打包和展开向导”虽然功能不够强大但简单易用
??多试两次就会了,针对一般的应用已经足够了。
??,有不会的在用QQ问我吧 412331088
??参考资料:http://zhidao.baidu.com/question/42181647.html?si=5
??
??实现“绿色”软件(影子版主)
??现在非常流行“绿色”软件,不需要什么安装程序只要一个 EXE 文件就可以运行程序
??了,而在 VB 的编程中有许多地方需要调用第三方的控件(很难用 API 函数搞定所有的功能),这就需要制做一个安装程序,把所需要的控件、DLL 文件或其他文件打包进去了,那么在 VB 中怎么用变通的方法实现“绿色”软件呢,请看:
??示例:
??1、主程序.EXE
??用 VB6.0 编写的程序,调用了 Winsock 控件,如果在没有安装 VB5.0、6.0 的机器上运行则会出现错误,导致程序运行失败,这时如果按一般的方法,只有把这个程序用 VB5.0、6.0 的安装程序进行打包,不然只有用用2的方法来解决了。
??2、注册程序.EXE
??用 VB6.0 编写的程序,使用资源文件的方法,把 Winsock 控件封装到本程序中,在运行主程序.EXE之前,先运行本程序,通过 API 函数 GetSystemDirectory 取得系统的 WinddowsSystem 的目录,然后把 Winsock 控件复制到该目录下,并用 Shell 来完成控件的注册。
??⑴启动 VB6.0,在“外接程序→外接程序管理器”中加载“Visual Basic 6 资源编辑器”
??⑵在 VB 资源编辑器窗口中,点击“添加自定义资料”,增加 Winsock 控件(C:WinddowsSystemMswinsck.ocx),再双击刚刚创建的自定义资源,弹出”编辑属性”窗口,定义如下:
??
??类型:
??“OCX”
??
??标识号:
??101
??
??语言:
??中文(中国)
??
??⑶保存资源文件,写如下代码:
??Option Explicit
??Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
??Const MAX_PATH = 260 '定义足够长的字符串
??Private Sub Form_Load()
??Dim TempFile() As Byte
??Dim FileNum As Integer
??Dim TempDir As String
??TempDir = GetWinSysDir '自定义函数取得系统的 WinddowsSystem 的目录
??TempFile = LoadResData(101, "OCX") '用以从资源 (.res) 文件装载若干可能类型的数据,并返回一个 Byte 数组
??FileNum = FreeFile
??Open TempDir & "Mswinsck.ocx" For Binary Access Write As #FileNum '新建文件(把 Winsock 控件复制到指定目录下)
??Put #FileNum, , TempFile
??Close #FileNum
??
??'Shell "regsvr32 " & TempDir & "Mswinsck.ocx ", vbNormalFocus '注册控件,有弹出对话框
??Shell "regsvr32 " & TempDir & "Mswinsck.ocx /s", vbNormalFocus '注册控件,无弹出对话框
??
??MsgBox "注册成功,现在本程序可正常运行了!!", vbOKOnly, "注册控件"
??
??Unload Me
??End Sub
??
??Public Function GetWinSysDir() '定义读取WinddowsSystem 的所在目录的函数
??Dim S As String, Length As Long
??S = String(MAX_PATH, 0) '赋值
??Length = GetSystemDirectory(S, MAX_PATH) 'S为取得目录,MAX_PATH 为长度
??S = Left(S, InStr(S, Chr(0)) - 1) '去掉多余的空格
??GetWinSysDir = S
??End Function
??'补充:S 和 MAX_PATH 的值是可以随便赋的,
??'如: Dim S As String * 20
??' Length = GetSystemDirectory(S, 20)
??3、补充说明
??在用 VB6.0 保存上述两个程序后,请再使用 VB5.0 重新打开这两个程序,并编译为主程序.EXE、注册文件.EXE。(用 VB5.0 编译的程序,在 Win98、2000 下不需要任何 DLL 文件)
??程序运行
??4、程序运行
??将主程序.EXE、注册文件.EXE两个文件,复制到任意机器上,先运行注册文件.EXE注册第三方的控件,再运行主程序.EXE,就不会有任何的错误了,一个变通的“绿色”软件就完成了。Edited by: LionCSQ
??
??StrConv 函数
??
?? 返回按指定类型转换的 Variant (String)。
??
?? 语法
?? StrConv(string, conversion, LCID)
?? StrConv 函数的语法有下面的命名参数:
?? 部分 说明
?? string 必要参数。要转换的字符串表达式。
?? conversion 必要参数。Integer。其值的和决定转换的类型。
?? LCID 可选的。如果与系统LocaleID不同,则为LocaleID(系统LocaleID为缺省值。)
??
?? 设置值
?? conversion 参数的设置值为:
?? 常数 值 说明
?? vbUpperCase 1 将字符串文字转成大写。
?? vbLowerCase 2 将字符串文字转成小写。
?? vbProperCase 3 将字符串中每个字的开头字母转成大写。
?? vbWide* 4* 将字符串中单字节字符转成双字节字符。
?? vbNarrow* 8* 将字符串中双字节字符转成单字节字符。
?? vbKatakana** 16** 将字符串中平假名字符转成片假名字符。
?? vbHiragana** 32** 将字符串中片假名字符转成平假名字符。
?? vbUnicode 64 根据系统的缺省码页将字符串转成 Unicode。
?? vbFromUnicode 128 将字符串由 Unicode 转成系统的缺省码页。
??
?? *应用到远东国别。
?? **仅应用到日本。
?? 注意 这些常数是由 VBA 指定的。可以在程序中使用它们来替换真正的值。其中大部分是可以组合的,例如 vbUpperCase + vbWide,互斥的常数不能组合,例如 vbUnicode + vbFromUnicode。当在不适用的国别使用常数 vbWide、vbNarrow、vbKatakana,和 vbHiragana 时,就会导致运行时错误。
?? 下面是一些一般情况下的有效分界符:Null (Chr$(0)),水平制表符 (Chr$(9)),换行 (Chr$(10)),垂直制表符 (Chr$(11)),换页 (Chr$(12)) ,回车 (Chr$(13)),空白 (SBCS) (Chr$(32))。在 DBCS中,空白的实际值会随国家/地区而不同。
??
?? 说明
?? 在把 ANSI 格式的 Byte 数组转换为字符串时,您应该使用 StrConv 函数。当您转换 Unicode 格式的这种数组时,使用赋值语句。
??
??
?? 我的理解是:
?? vb中的字符串都是unicode编码,即:任何一个字符都是用双字节表示。
?? LenB("12魏家台")=8,说明占用8个字节
?? 用strConv(str,vbfromunicode)可以将串转换为ansi的,即gb2312或者gbk,特点是,中文双字节,英文单字节。
?? 得到的ansi仍然是字符串,不过在vb下显示是乱码,因为vb会按照unicode的编码去理解它的。如,这时“12”只有2个字节,但vb会认为这时一个unicode字符。
?? 为了分析这个ansi串,需要将其转换为字节数组。很简单
?? dim byt() as byte
?? byt=sAnsi
?? 为了比较,我在baidu里百度了一下"12魏家台",得到了其编码是“12%CE%BA%BC%D2%CC%A8”,经验证,每2个16进制数,就是相应的中文的ansi编码。
??
?? 终于得到一个结论/办法:把中文转换为ansi,编码为文本串,发送到服务器。在服务器端用GB2312或者GBK代码页解析。
?? 我没有用大量中文进行测试,只选择了“镕”字测试了一下,结果,可以被服务器正确的识别。

该用户从未签到

sc85343012 发表于 2010-12-21 16:46:55 | 显示全部楼层
哇   眼花缭乱。。。。     顶起
您需要登录后才可以回帖 登录 | 注册

本版积分规则

免责声明

本站中所有被研究的素材与信息全部来源于互联网,版权争议与本站无关。本站所发布的任何软件编程开发或软件的逆向分析文章、逆向分析视频、补丁、注册机和注册信息,仅限用于学习和研究软件安全的目的。全体用户必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。学习编程开发技术或逆向分析技术是为了更好的完善软件可能存在的不安全因素,提升软件安全意识。所以您如果喜欢某程序,请购买注册正版软件,获得正版优质服务!不得将上述内容私自传播、销售或者用于商业用途!否则,一切后果请用户自负!

QQ|Archiver|手机版|小黑屋|联系我们|宝峰科技 ( 滇公网安备 53050202000040号 | 滇ICP备09007156号-2 )

Copyright © 2001-2023 Discuz! Team. GMT+8, 2024-12-22 13:11 , File On Powered by Discuz! X3.49

快速回复 返回顶部 返回列表