VB调用公用对话框的四种方法
(2019-02-13 11:16:26)
标签:
公用对话框vb源代码调用方法 |
分类: VB编程 |
调用公用对话框的四种方法
很多程序都要调用公用对话框,比如:打开文件、保存文件、修改颜色、选择字体等等。下面就介绍调用公用对话框的方法。第一种需要在窗体上添加COMDLG32.OCX控件,后面三种都不需要,从此就不用再带着COMDLG32.OCX文件满世界跑了!
一、直接使用COMDLG32.OCX控件
这是用得最多的办法,但使得我们发布程序时都要带上COMDLG32.OCX文件,不大方便。
首先在【工程→部件→控件】对话框中勾选“Microsoft Common Dialog Control
6.0”,然后在工具箱中选取CommonDialog控件放到窗体上。这个控件的使用代码就从略了。
二、添加许可证
此方法的代码较简单,适用于程序有多个窗体都需要调用对话框时。代码:
Form1(或启动窗体)中的代码:
Private Sub Form_Load()
Licenses.Add "MSComDlg.CommonDialog"
End Sub
应用窗体中的代码:
Option Explicit
Dim WithEvents Dlg As VBControlExtender
Private Sub Form_Load()
Set Dlg = Controls.Add("MSComDlg.CommonDialog", "Dlg")
End Sub
Private Sub 打开_Click()
On Error GoTo 100
Dim OpenName As String
With Dlg.object
End With
Debug.Print OpenName
100
End Sub
Private Sub 字体_Click()
Me.AutoRedraw = True
With Dlg.object
End With
AutoRedraw = True
Cls
Print "中华人民共和国"
End Sub
Private Sub 颜色_Click()
With Dlg.object
End With
End Sub
三、在程序运行中添加控件
本方法对于没有窗体但又需要调用公用对话框的程序特别有用,代码很简单。缺点是在没有装VB的机器上运行可能会发生错误。
注意第二种方法调用是 Dlg.object,本方法是Dlg。
应用过程中的代码如下:
Private Sub 保存()
On Error GoTo 100
Dim NewName As String, dlg As Object
Set dlg = CreateObject("MSComDlg.CommonDialog")
With dlg
End With
Debug.Print NewName
100
End Sub
Private Sub 字体()
Dim Dlg As Object
Set Dlg = CreateObject("MSComDlg.CommonDialog")
With Dlg
End With
AutoRedraw = True
Cls
Print "中华人民共和国"
End Sub
Private Sub 颜色()
Dim Dlg As Object
Set Dlg = CreateObject("MSComDlg.CommonDialog")
With Dlg
End With
End Sub
四、用API函数调用公用对话框
笔者在网上收集了用
API函数调用公用对话框的代码,进行了验证,并去伪存真去芜存精,改正了以讹传讹的错误,适当地添加了注释,在此发表,供各位使用。对于程序中只用了某一个对话功能(例如只用到了打开文件)的程序来说,特别有用,你可以根据情况,选用其中某一个调用的有关代码。但是有一个问题要注意:原来使用CommonDialog控件时一般会选择“‘取消’引发错误”,那么用户点击“取消”后程序就会转到错误陷阱去处理;而使用API函数调用公用对话框时,用户点击“取消”不会引发错误,只是函数的返回值为空值或0值。
测试时,请在窗体上添加一个文本框,四个按纽。
代码如下:
Option Explicit
'========================打开/保存对话框 API
函数及结构===================
Private Type tagOPENFILENAME
End Type
Private Declare Function GetOpenFileName Lib "comdlg32.dll"
Alias "GetOpenFileNameA" (ofn As tagOPENFILENAME) As
Boolean
Private Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (ofn As tagOPENFILENAME) As Boolean
'========================颜色对话框 API 函数及结构==========================
'对话框不支持彩色调色板,对话框提供的颜色的选择仅限于系统颜色和这些颜色的混合值,但可以为
'对话框提供一个CCHOOKProc程序,此钩子程序能处理发送给对话框的信息。通过建立CHOOSECOLOR结
'构中Flags成员的CC_ENABLEHOOK标志和指定IpfnHook成员中挂钩程序的地址,可使挂钩程序生效。
Private Type ChooseColor
End Type
Private Declare Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As ChooseColor) As Long
'========================字体对话框 API
函数及结构==========================
Private Type ChooseFont
End Type
Private Type LOGFONT
End Type
Private Declare Function ChooseFont Lib "comdlg32.dll" Alias
"ChooseFontA" (pChoosefont As ChooseFont) As Long
Private Declare Sub CopyMemoryStr Lib "kernel32" Alias
"RtlMoveMemory" (lpvDest As Any, ByVal lpvSource As String, ByVal
cbCopy As Long)
'========================打印对话框 API
函数及结构==========================
Private Declare Function PrintDlg Lib "comdlg32.dll" Alias
"PrintDlgA" (pPrintdlg As PRINTDLG) As Long
Private Declare Function PageSetupDlg Lib "comdlg32.dll" Alias
"PageSetupDlgA" (pPagesetupdlg As PAGESETUPDLG) As Long
'=========================================================================
Dim fName As String
Private Sub Command1_Click() '打开
Dim OpenName As String, st As String, z As String
OpenName = CmdDlg(1, ,
"文本文件(*.txt,*.htm)|*.TXT;*.htm|所有文件(*.*)|*.*", , &H200C,
fName)
If InStr(OpenName, ".") Then
End If
End Sub
Private Sub Command2_Click() '保存
Dim SaveName As String, st As String
SaveName = CmdDlg(0, ,
"文本文件(*.txt,*.htm)|*.TXT;*.htm|所有文件(*.*)|*.*", , &H200A,
fName)
If InStr(SaveName, ".") Then
End If
End Sub
Private Sub Command3_Click() '颜色
Dim cc As ChooseColor
cc.lStructSize = Len(cc)
cc.hwndOwner = Me.hWnd
cc.hInstance = App.hInstance '返回当前应用程序实例的句柄
cc.flags = 0
cc.lpCustColors = 0 'RGB(255, 124, 255)
If ChooseColor(cc) Then Text1.BackColor = cc.rgbResult
End Sub
Private Sub Command4_Click() '字体
AlterFont Text1
End Sub
Private Function AlterFont(lObject As Object) As Boolean
Dim cf As ChooseFont, lFont As LOGFONT
'-----字体、字形、字号 3 个下拉框预设值-----------------
With lObject.Font
'--------------------------------------------------------
End With
End Function
'返回选择的全路径文件名
'参数:1.对话框类型(0保存,1打开);2.对话框标题;3.过滤器字符串;4.过滤器索引;5.标志;6.文件名;7.文件名缓冲区大小
Private Function CmdDlg(Optional ByVal DlgType As Boolean = True,
_
On Error GoTo CmdDlg_Error
Dim ofn As tagOPENFILENAME
Dim fResult As Boolean
If Len(Filter) Then Filter = Replace(Filter, "|", vbNullChar) 'Filter以Chr(0)为分隔符
With ofn
End With
If DlgType Then fResult = GetOpenFileName(ofn) Else fResult =
GetSaveFileName(ofn)
If fResult Then
Else
End If
CmdDlg_Error:
End Function