登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

面包会有的

... ...

 
 
 

日志

 
 

VB使用大全 - 11  

2007-09-08 14:36:31|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

171、如何防止使用者按下 CTRL + ALT + DEL

有些时候,我们的应用程序执行时,不希望使用者按下 CTRL + ALT + DEL 来异常结束程序或关机,这时候我们可以在启动程序时,将 CTRL + ALT + DEL 功能键之功能取消,然后在结束程序之前,再从新恢复 CTRL + ALT + DEL 之功能。

在模组声明区中加入以下声明及模组:

Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, lpvParam As Any, ByVal fuWinIni As Long) As Long

Public Const SPI_SCREENSAVERRUNNING = 97

Public Sub Disable_Ctrl_Alt_Del()

'让 CTRL+ALT+DEL 失效

Dim AyW As Integer

Dim TurFls As Boolean

AwY = SystemParametersInfo(SPI_SCREENSAVERRUNNING, True, TurFls, 0)

End Sub

Public Sub Enable_Ctrl_Alt_Del()

'让 CTRL+ALT+DEL 恢复功能

Dim AwY As Integer

Dim TurFls As Boolean

AwY = SystemParametersInfo(SPI_SCREENSAVERRUNNING, False, TurFls, 0)

End Sub

'实际使用时,在 Form 中加入以下程序码:

Private Sub Form_Load()

Disable_Ctrl_Alt_Del

End Sub

Private Sub Form_Unload(Cancel As Integer)

Enable_Ctrl_Alt_Del

End Sub

172、如何将 Excel 的资料表导入 Access资料库?

将程序码做成模组,只要传入必要之参数即可!

此一模组共有四个参数:

1、sSheetName:要导出资料的资料表名称 (Sheet name),例如 Sheet1

2、sExcelPath:要导出资料的 Excel 文件路径名称 (Workbook path),例如 C:\book1.xls

3、sAccessTable:要导入的 Access Table 名称,例如 TestTable

4、sAccessDBPath:要导入的 Access 文件路径名称,例如 C:\Test.mdb

在声明区中加入以下声明:

Private Sub ExportExcelSheetToAccess(sSheetName As String, sExcelPath As String, sAccessTable As String, sAccessDBPath As String)

Dim db As Database

Dim rs As Recordset

Set db = OpenDatabase(sExcelPath, True, False, "Excel 5.0")

Call db.Execute("Select * into [;database=" & sAccessDBPath & "]." & sAccessTable & " FROM [" & sSheetName & "$]")

MsgBox "Table exported successfully.", vbInformation, "Yams"

End Sub

使用范例如下:将 C:\book1.xls 中的 Sheet1 导入 C:\Test.mdb 成为 TestTable

ExportExcelSheetToAccess "Sheet1", "C:\book1.xls", "TestTable", "C:\Test.mdb"

173、取得个人电脑中的设定资讯

许多在控制面板中的设定,如果在 VB 的程序中需要知道的话,我们都可以透过 GetLocaleInfo 这个 API 来取得!以下我们已经将它模组化 (WinLocaleInfo),只 传入一个参数即可得到解答!

在声明区中加入以下的声明及模组:

Private Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long

Public Function WinLocaleInfo(ByVal lnfoType As Long) As String

Dim sLCData As String

Dim nRet As Long

nRet = GetLocaleInfo(0, lnfoType, sLCData, 0)

If nRet Then

sLCData = Space$(nRet)

nRet = GetLocaleInfo(0, lnfoType, sLCData, Len(sLCData))

If nRet Then

WinLocaleInfo = Left$(sLCData, nRet)

End If

End If

End Function

实际在运用时,可传入的参数相当多,连我也不知道到底有多少个,不过别担心,只要在 VB 附的 API 检视员中就可以找到所有可以传入的参数了!这些参数有一个共通点,都是以 "LOCALE_" 为开头字串,以下举几个例子给大家看看:

LOCALE_SCURRENCY = &H14 ' 货币符号

LOCALE_SDATE = &H1D ' 日期分隔字元

LOCALE_SDAYNAME1 = &H2A ' 完整星期名称

LOCALE_SDECIMAL = &HE ' 小数点符号

'以下是一个实例:

Private Sub Command1_Click()

Text1 = WinLocaleInfo(&H14) '可能返回 NT$

Text2 = WinLocaleInfo(&H1D) '可能返回 /

Text3 = WinLocaleInfo(&H2A) '可能返回 星期一

Text4 = WinLocaleInfo(&HE) '可能返回 .

End Sub

174、您想知道有谁正在使用您的 Access 资料库吗?

如果您使用 Access 建立了一个多人使用的资料库环境,有时候您必须要知道有谁正在使用程序连进这个共享的资料库,但是您又不想因为如此而要建立一套完整的 Access 安全系统,您有二个选择:

第一个:

您可以在资料库中建立一个 "Login Table",每次使用者进入或离开系统时就 Update 这个 Table.

第二个:

较好一点,您可以使用 msldbusr.dll,它可以告诉您目前正连进资料库的电脑名称 (Computer Name),这些资料其实是存放在扩展名为 LDB 的文件中。一旦您从 DLL 中抓到这些资料,您便可以送出讯息,通知 Client 端的使用者 (Remote User) 结束应用程序,以中断和资料库的连结,然后您便可以使用 Exclusive Mode 来维护资料库了。

在这里,我们要说明的是第二种方法,也就是使用 msldbusr.dll。它提供了二个 Function,说明如下:

1、LDBUser_GetUsers:呼叫后会返回二部份,一个是使用者阵列,一个是连结到资料库的使用者数。

Declare Function LDBUser_GetUsers Lib "MSLDBUSR.DLL" (lpszUserBuffer() _

As String, ByVal lpszFilename As String, ByVal nOptions As Long) As Integer

lpszUserBuffer():返回使用者阵列,注意!必须使用 ReDim 声明成变动阵列!

lpszFilename:资料库名称 ( .mdb 完整路径 ),若 .ldb 文件不存在,会返回错误代码。

nOptions:下参数声明资料回传的型态。可以使用的参数有四个,如下:

1=返回自从 .ldb 产生后,所有曾经使用资料库的使用者机器名称 (Computer Name) 及数目。

2=只返回目前正在使用资料库的使用者机器名称 (Computer Name) 及数目。

4=只返回导致目前资料库损毁的使用者机器名称 (Computer Name)。

8=只返回使用者的总数,但是并不返回使用者阵列。

2、LDBUser_GetError:呼叫 LDBUser_GetUsers 若有错误产生,可根据返回的错误代码找到说明。

Declare Function LDBUser_GetError Lib "MSLDBUSR.DLL" (ByVal nErrorNo As Long) As String

nErrorNo:呼叫 LDBUser_GetUsers 产生错误所返回的代码,介于 -1 至 -14 之间。说明如下:

-1 = Can't open the LDB file. ( 无法开启 LDB 文件 )

-2 = No user connected. ( 没有使用者在使用资料库 )

-3 = Can't create an array. ( 无法建立阵列 )

-4 = Can't redimension array. ( 无法重新建立阵列 )

-5 = Invalid argument passed. ( 传入无效的参数 )

-6 = Memory allocation error. ( 内存配置错误 )

-7 = Bad index. ( 无效的索引 )

-8 = Out of memory. ( 内存不足 )

-9 = Invalid argument. ( 无效的参数 )

-10= LDB is suspected as corrupted. ( LDB 文件可能损毁 )

-11= Invalid argument. ( 无效的参数 )

-12= Unable to read MDB file. ( 无法读取 MDB 文件 )

-13= Can't open the MDB file. ( 无法开启 MDB 文件 )

-14= Can't find the LDB file. ( 找不到 LDB 文件 )

'范例程序:( 移除所有的 Form,请将以下程序复制到 .bas 文件中即可执行 )

Option Explicit

Declare Function LDBUser_GetUsers Lib "MSLDBUSR.DLL" (lpszUserBuffer() _

As String, ByVal lpszFilename As String, ByVal nOptions As Long) As Integer

Declare Function LDBUser_GetError Lib "MSLDBUSR.DLL" (ByVal nErrorNo As Long) As String

Sub MAIN()

Dim psMDBFilename As String

psMDBFilename = InputBox("请输入资料库名称:")

If Len(psMDBFilename) Then

ShowUsers psMDBFilename

End If

End Sub

Sub ShowUsers(psFilename As String)

ReDim lpszUserBuffer(1) As String

Dim psError As String

Dim cUsers As Long

Dim iLoop As Long

'呼叫 LDBUser_GetUsers 返回使用者阵列

cUsers = LDBUser_GetUsers(lpszUserBuffer(), psFilename, 1)

'确认是否返回使用者阵列

If (cUsers = 0) Then

Debug.Print "No Users."

GoTo Exit_ShowUsers

End If

'若有错误则显示错误讯息

If (cUsers < 0) Then

psError = LDBUser_GetError(cUsers)

Debug.Print "Error #:"; cUsers; "--"; psError

GoTo Exit_ShowUsers

End If

'显示使用者阵列

For iLoop = 1 To cUsers

Debug.Print "User "; iLoop; ":"; lpszUserBuffer(iLoop)

Next iLoop

Exit_ShowUsers:

End Sub

'除了上面的范例之外,Microsoft 也提供了一个更完整的范例,它有一个容易理解的介面设计:

如果您在这个主题中想要更多的资讯,或想取得 Microsoft 提供的更多的工具程序,您可以参考:

http://support.microsoft.com/support/kb/articles/q176/6/70.asp

175、为何声明资料库型态变量时出现《编译错误:使用者自订型态尚未定义》

很多人在学习用 VB 撰写资料库程序时,都会从使用 VB 提供的 Data Control 加上各种资料库感知控制项 ( Data Aware Control ) 开始,因为这样子的组合,您甚至一行程序都不用写就可以完成一支简单的资料库程序了!

然而,为了程序控制的灵活度或其他原因,您会开始想要自己声明资料库物件,自己控制各种资料的处理动作,于是您在程序中加入了类似以下的声明: ( 因为书上及 Help 都这么写 )

Dim DB As Database

Dim SS As Snapshot

:写了一支很简单的程序之後,当您想看看成果,而按下【开始执行】的按钮时,却从电脑中发出了一声令人惊心动魄、代表错误的声响! (如果您有装 Sound Card 的话) 您一遍一遍的检查程序,已经是最简单的程序了,怎么可能会错误呢!让我们来看看错误讯息:《编译错误:使用者自订型态尚未定义》

其实您的程序并没有错,您声明的资料型态也都是对的,只是定义它的物件程序库或型态程序库并没有在 Visual Basic 中注册而已。解决方法如下:

从【专案】功能表中选择【设定引用项目】,在【可引用的项目】栏中选择【Microsoft DAO x.x Object Library】【Microsoft DAO x.x/x.x Compatibility Library】即可。

其中 x.x 代表的是某一个资料库引擎的版本,x.x/x.x 则代表相容于好几个版本的资料库引擎!

如果您的公司中有人使用 Access2.0 / Access95 / Access97 ...等多个不同的版本时,您可以使用 【Microsoft DAO 2.5/3.5 Compatibility Library】。

176、模拟 VB 程序执行时产生的错误讯息

VB 程序执行时若有错误产生,而程序中又没有错误控制的话,便会出现 VB 内定的错误编号及错误讯息,但是这个错误讯息通常都很简短,所以使用者和写程序的人反应时,有时候也不知道是什么意思及该如何处理。而且这种错误有时候在开发人员的机器上不会发生,只有在使用者的机器上才会发生,所以开发人员也模拟不出来!

虽然 VB 的错误编号及讯息都很简短,但是在 VB 的线上说明中都有比较详细的错误分析及解决方法,只是有些人找不到,所以常常有人在问 VB 产生的错误讯息是什么意思及该如何处理。

VB 的 Err 物件其实就可以让我们模拟错误,以下的 Sample 是从 VB 的 HELP 中节录出来的:

' If an error occurs, construct an error message

On Error Resume Next ' Defer error handling.

Err.Clear

Err.Raise 6 ' Generate an "Overflow" error.

' Check for error, then show message.

If Err.Number <> 0 Then

Msg = "Error # " & Str(Err.Number) & " was generated by " & Err.Source & Chr(13) & Err.Description

MsgBox Msg, , "Error", Err.HelpFile, Err.HelpContext

End If

以上的程序加了 On Error Resume Next,所以并不会中断跳出来,而出现的讯息框内容如下,有错误编号及错误讯息,而且错误讯息很简短,而且它只有一个【确定】按钮,对我们帮助不大:

Error # 6 was generated by Project1

OverFlow

今天如果在 Design Time 时将 On Error Resume Next 拿掉,出现的讯息框如下:

Run-time error '6'

OverFlow

除了以上的讯息外,它有四个按钮,分别是【Continue】、【End】、【Debug】、【Help】,而最后一个按钮【Help】就可以让我们直接进到 Help 看到以下的详细说明:

Overflow (Error 6)

An overflow results when you try to make an assignment that exceeds the limitations of the target of the assignment. This error has the following causes and solutions:

The result of an assignment, calculation, or data type conversion is too large to be represented within the range of values allowed for that type of variable.

Assign the value to a variable of a type that can hold a larger range of values.

An assignment to a property exceeds the maximum value the property can accept.

Make sure your assignment fits the range for the property to which it is made.

For additional information, select the item in question and press F1.

所以,下一次您就可以使用这个方法来方便找到详细的错误说明!

177、如何取得文件大小?

VB6 提供了一个新的物件模型,叫做 FSO (File System Object) 物件模型,运用它,我们可以很方便的处理磁盘、资料夹和文件的一些动作。

FSO 物件模型含有好几个物件,其中有一个 File 物件是用来求得文件的相关资讯,在目前这个主题,我们就可以使用 File 物件!它有一个属性是 Size,对文件来说就是指文件的大小 (单位为位元组)。 (注一)

虽然使用 File 物件的 Size 属性就可以求得文件的大小,但是它有以下二个缺点:

1、只能用于 VB6 以后的版本。

2、它不是 VB6 内定的功能,必须另外引用 Scrrun.dll (Microsoft Scripting Runtime) 才可以!

以下的二个方法就可以使用在所有的 VB 版本中 (含 VB6),而且是 VB 内定的功能:

1、FileLen 函数:返回一个 Long,代表一个文件的长度,单位是位元组。

语法:FileLen(pathname) ' pathname 是全路径之文件名称

适用:取得一个尚未开启的文件的长度大小 (注二)

2、LOF 函数:返回一个 Long ,单位为位元组,用来代表由 Open 陈述式所开启的文件之大小。

语法:LOF(filenumber) ' filenumber 是一个文件代码

适用:取得一个已开启的文件的长度大小

注一:File 物件的 Size 属性除了可以求得一个文件的大小,也可以用来取得整个目录的所有文件大小!

注二:使用 FileLen 函数时,如果所指定的文件正在开启中,则所返回的值是这个文件在开启前的大小。

178、如何一次读取整个文件的内容?

通常我们要读取整个文件的内容时,都是一行一行读进来,再使用变数来累加。除了这种方法之外,您还可以使用 GET Function,只要呼叫一次就可以读入一整个文件了!而且速度更快!

以下这个模组就是使用 GET 来读入整个文件,参数只有一个,就是含路径的文件名:

Function FileContent(FileName As String) As String

Dim FileNo As Integer

Dim FileString As String

FileNo = FreeFile

Open FileName For Binary As #FileNo

FileString = Space(FileLen(FileName))

Get #FileNo, , FileString

Close #FileNo

FileContent = FileString

End Function

使用实例如下:

Private Sub Command1_Click()

RichTextBox1 = FileContent("C:\Test.txt") (注)

End Sub

注:

当文件大小小于 64K 时可使用 TextBox

当文件大小大于 64K 时请使用 RichTextBox

若是 VB6 您还可以使用 FSO 物件模型中的 TextStream 物件的 ReadAll 方法来读一个完整的 TextStream 文件并返回得到的字串。

对于太大的文件,使用以上的方法浪费记忆体资源。应使用其它的技术去输入一个文件,比如一列一列地读取文件。

179、如何使用文本文件来存取 ListBox 内的资料?

当我第一次在网路上的讨论区中看到有人提到以下的二个问题时:

1、请问如何将 TextBox 或 ListBox 的资料存到文本文件中?

2、请问如何将文本文件中的资料一行一行读出放到 ListBox 中?

我真的有一点惊讶,因为我一直都是待在民营企业的 MIS 部门,所有的系统都要使用到资料库,像这样的问题,我们在系统设计时,都会在资料库中用一个片语文件来存放,不管系统大小,都可以将这一类的资料存在片语文件中,再依类别来区分,还可以依使用者 要来加以编号排序,除此之外,也方便统一管理。

不过,不管是国内或国外的讨论区中,这样的问题却一直不断的有人在问,而且频率不低,这让我体会到,基于各种理由,并不是所有人都一定要使用资料库来存放这些资料!

若要使用文本文件来存放这些资料,其实最需要了解的,就是文本文件的存取方法!

在以下的范例中,我使用到二个 ListBox 及二个 CommandButton,不需更改任何属性!按下 Command1 时,会将 List1 中的资料放到暂存文件中,按下 Command2 时,再将暂存文件中的资料放到 List2 中。

Private Sub Command1_Click()

'将 ListBox 资料放到文本文件中

Dim i As Integer

Open "c:\temp.txt" For Output As #1

For i = 0 To List1.ListCount - 1

Print #1, List1.List(i)

Next

Close #1

End Sub

Private Sub Command2_Click()

'将文本文件中资料读出放到 ListBox 中

Dim wstr As String

Open "c:\temp.txt" For Input As #1

Do While Not EOF(1) '执行回圈直到文件尾为止。

Input #1, wstr

List2.AddItem wstr

Loop

Close #1

End Sub

不过如果您的系统有使用到资料库,而您之前没有想到要使用资料库的片语文件来存放这些资料的话,我建议您试试看,您会发现片语文件真的很方便,不管什么杂七杂八的资料,只要一个文件就解决了!

180、字串取代之【全部取代】

在一般的应用软体中,例如 Word、小作家、Excel....等,都会提供字串取代【全部取代】的功能,这个功能很简单,就是将整篇文章从头到尾找一遍,碰到您要找的字串,就将它转换成您要取代的字串。

当然,或许您会说 VB6 不是己经有提供这个功能了吗?没错!VB6 己经有提供这个功能了,但是据我所知,目前企业界实际在使用 VB6 的比例并不高!大部份还是使用 VB5 / VB4-32,这个模组就是专为 VB6 以前的版本写的。

以下这个模组 myReplaceString ,它共有三个参数,说明如下:

1、hString:您要搜寻的一篇文章。

2、hSource:要搜寻到的子字串。

3、hTarget:用来取代的子字串。

整个模组的程序码很短,如下:

Public Function myReplaceString(ByVal hString As String, ByVal hSource As String, ByVal hTarget As String) As String

  tLen = Len(hSource)

  tChk = (Len(hTarget) = Len(hSource))

  tLoc = 1

  Do

    tLoc = InStr(tLoc, hString, hSource)

    If tLoc <> 0 Then

      If tChk Then

        Mid(hString, tLoc, tLen) = hTarget

      Else

        hString = Left(hString, tLoc - 1) + hTarget + _

        Mid(hString, tLoc + tLen)

      End If

      tLoc = tLoc + Len(hTarget)

    Else

      Exit Do

    End If

  Loop

  myReplaceString = hString

End Function

而返回值就是已经经过转换后的新文章!

181、如何在 VB5 中打开 VB6 的工程?

如果您用 VB5 打开 VB6 撰写的工程,会出现一个类似以下的讯息:

"Retained 为不正确的键。无法载入文件 C:\Windows\Desktop\Project1.vbp。"

"Retained is an invalid key. The file C:\Windows\Desktop\Project1.vbp can't be loaded".

那是因为在 VB6 的工程的 .vbp 文件中,多了一个之前的 VB 版本不认得的键值 "Retained" 的缘故!

要解决这个问题很简单,您只要依照以下的几个步骤:

1、使用记事本 (Notepad.exe) 打开 VB6 的工程的 .vbp 文件。

2、在这个文件中找到包含 "Retained" 字串的那一行,将那一整行移除。

3、存文件。

这样子您就可以使用 VB5 来打开之前使用 VB6 开发的工程了!很简单吧!

注:我在别的网站上看到有人说,这样子做了之后不一定百分之百成功,不过我自己试了之后,倒是没有出现错误,各位也自己试试吧!

182、VB6.0 的 Help 在那里?MSDN 是什么?

很多人在安装了 VB6.0 ,开始撰写程序之后,遇到了问题,按下【F1】,却出现了错误讯息,告诉您:【MSDN 不存在......,请重新安装 MSDN】

有的人还会觉得很奇怪,VB6.0 的 Help 出了什么问题了?MSDN 又是什么?为什么要重新安装 MSDN?其实,从 VB6.0 以后,Microsoft 已经将它所有的开发软件,合并成 Microsoft Visual Studio 6.0,一起出售 ( 当然,也有分开独立贩售的版本 ),在合并软件的同时,Microsoft 也将每一个开发软件的 Help 挪出来,统一放在 MSDN 光盘中,所以,现在不管您买的是合并软件的 Microsoft Visual Studio 6.0 或是独立贩售的 VB6.0 版本,都会另外附上二片 Microsoft MSDN Library 光盘。

今天,如果您购买的是独立贩售的 VB6.0 版本,在您安装完 VB6.0 之前,安装程序会要求您放入 MSDN 光盘,它会继续帮您安装 MSDN (也就是新版的 Help)。至于安装的注意事项,请参考

问题10:不方便的 Msdn -- VB6.0 的 Help

如果您安装 VB6.0 时,没有同时安装 MSDN,也没关系,您只要找到 MSDN 光盘,将第一片放入光驱,直接执行 Setup.exe 即可!

注:VB6 及 Microsoft Visual Studio 6.0 所附之 MSDN Library 光盘其实只是一个特殊版本,是专门针对 Microsoft Visual Studio 6.0 所推出的!MSDN Library 光盘在 VB6 及 Microsoft Visual Studio 6.0 出现之前就已经存在很久了,是微软针对程序开发人员的官方的技术资源,它定期提供产品操作手册、范例程序、技术文章、公用程序及许多最新的技术资料。而随 VB6 及 Microsoft Visual Studio 6.0 所附之 MSDN Library 光盘内容包含 VB6 及 Microsoft Visual Studio 6.0 的最新产品手册 (电子书) 及技术资料。

183、如何判断资料库中某一个 Table 是否存在?(ADO)

要判断资料库中某一个 Table 是否存在?最简单的方法就是错误尝试法!什么叫做错误尝试法呢?就是先假设它存在,直接去打开它,如果它真的存在,不会有错误产生,但是如果它不存在的话,就会有错误产生!做法大致如下:

1、设定 On Error Resume Next

2、直接打开要检查的 Table

3、如果文件存在,则 err.Number=0

我们就以 Access 为例,资料库使用 VB 内附的 Biblio.mdb,程序码如下:

On Error Resume Next '1

Set Conn = CreateObject("ADODB.Connection")

Conn.open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=C:\Biblio.mdb"

Set rs = Conn.execute("Titles") '2

If Err.Number <> 0 Then MsgBox "Table 不存在" Else MsgBox "Table 存在" '3

184、如何移除或更改桌面背景的底色图案 (Wallpaper)?

SystemParametersInfo 这个 API 可以设定许多 Windows 系统的功能参数,而其中一个参数就是桌面底图!通常一般的使用者会透过控制面板中的【显示器】来设定桌面底图。

在底下的范例中,我们使用 SPI_SETDESKWALLPAPER 这个参数及图片文件名称来设定新的桌面底图,同时使用 SPIF_SENDWININICHANGE 来通知各个视窗这个改变。

'在表单的声明区中加入以下声明及常数:

Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByVal lpvParam As String, ByVal fuWinIni As Long) As Long

Const SPI_SETDESKWALLPAPER = 20

Const SPIF_UPDATEINIFILE = &H1

Const SPIF_SENDWININICHANGE = &H2

'在表单上加入一个 CommandButton (Command1) 来移除桌面底图,程序码如下:

Private Sub Command1_Click()

Dim X As Long

X = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0&, "(None)", SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)

MsgBox "桌面底图 (Wallpaper) 已经被移除"

End Sub

'在表单上加入另一个 CommandButton (Command2) 来更改桌面底图,程序码如下:

Private Sub Command2_Click()

Dim FileName As String

Dim X As Long

FileName = "c:\windows\test.bmp"

X = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0&, FileName, SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)

MsgBox "桌面底图 (Wallpaper) 已经被更改"

End Sub

185、如何在不开启文件的情况下打印各类文件?

您还记得或怀念以前 DOS 时代,在 DOS 的命令列就可以直接下指令打印文件吗?

其实这个题目的标题,就如同当今的报纸标题一般,有点夸张,因为要打印文件,势必要先开启文件!

但是您也不用失望,既然标题会这样订,表示我也有好方法 (其实应该说 Microsoft 有提供好方法)!您只要使用 ShellExecuteAny 这个 API,对于各种不同格式不同类型的文件,您都不用自己先去启动开启该类文件的应用程序,再开启文件,再打印文件!

看到上面的说明,是否让您回想起之前我们提到过的二个主题:

如何用 VB 启动其他程序或开启各类文件?

完全模拟【开始】中的【运行...】功能

在这二个主题中,我们都有提到,不必管文件的扩展名是什么?格式是什么?您都可以使用如下面

Shell("Start C:\Test.txt")

Call Shell("rundll32.exe url.dll,FileProtocolHandler " & Text1, 1)

的方式来启动程序或开启文件。今天,我们要提到的 API 也可以开启或执行各种不同类型的文件,但是那不是我们今天的重点 (如果各位有兴趣的话,请自行研究!),今天的重点是 ShellExecuteAny 这个 API 它可以:

1、自动依文件型态帮我们在 Background 启动应用程序。

2、自动打印文件。

3、自动再关闭文件。

应用在我们的 VB 程序中的话,使用者只要输入或选择文件,不管什么文件 (当然是指在注册表中曾经注册过的文件类型),都可以打印!

'以下是完成的模组:

Private Declare Function ShellExecuteAny Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As Any, ByVal lpDirectory As Any, ByVal nShowCmd As Long) As Long

Const SW_SHOWMINNOACTIVE = 7

Sub PrintAnyFile(FileToPrint As String)

Dim Ret As Long

Ret = ShellExecuteAny(Me.hwnd, "print", FileToPrint, ByVal 0&, ByVal 0&, SW_SHOWMINNOACTIVE)

End Sub

'实际使用案例如下:

Private Sub Command1_Click()

PrintAnyFile Text1.Text

End Sub

其实上面这种打印文件的方式,它的作用方式,和我们直接将文件文件拖拉到打印机的图示上去打印文件是一样的道理! (如果您之前尚不知道这个功能的话,您现在可以试试看将一份文件直接拖拉放到打印机的图示上,看看结果如何!)

  评论这张
 
阅读(1046)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018