首页 | IT新闻 | 硬件 | 操作系统 | 开发 | 网络编程 | 数据库 | 热门框架 | 网络安全 | 组网 | 建站指南 | 网页制作 | 特效 | 实用技巧 | 服务器 | 办公 | QQ | 探索 | 社区

  • 技术部落
  • 部落首页 > 程序开发 > C/C#/C++ > 正文
  • 用API实现Windows下的通用对话框
      2007-8-30  来源:CSDN  编辑:Jsbulo  热度:

      大家在写程序的时候,难免会用到Windows的通用对话框,如打开、保存、字体、颜色、打印等。这些通用对话框在外部控件里可以加载,不过打包的时候还要带上控件,所以会很麻烦,并且会加大安装程序的大小。笔者通过实践,总结出了通过API实现这些对话框的方法,写出来与大家分享。

    定义一个类模块,方法:工程->添加类模块。代码如下:

    Option Explicit

    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 Type OPENFILENAME
        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

    Private Type PRINTDLG
        lStructSize As Long
        hwndOwner 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
    End Type

    Private 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

    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 As String * 31
    End Type

    Private Type CHOOSEFONT
        lStructSize As Long
        hwndOwner As Long          ’  caller’s window handle
        hdc As Long                ’  printer DC/IC or NULL
        lpLogFont As Long
        iPointSize As Long         ’  10 * size in points of selected font
        Flags As Long              ’  enum. type flags
        rgbColors As Long          ’  returned text color
        lCustData As Long          ’  data passed to hook fn.
        lpfnHook As Long           ’  ptr. to hook function
        lpTemplateName As String     ’  custom template name
        hInstance As Long          ’  instance handle of.EXE that
                                       ’    contains cust. dlg. template
        lpszStyle As String          ’  return the style field here
                                       ’  must be LF_FACESIZE or bigger
        nFontType As Integer          ’  same value reported to the EnumFonts
                                       ’    call back with the extra FONTTYPE_
                                       ’    bits added
        MISSING_ALIGNMENT As Integer
        nSizeMin As Long           ’  minimum pt size allowed &
        nSizeMax As Long           ’  max pt size allowed if
                                           ’    CF_LIMITSIZE is used
    End Type

    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

    Private Type PAGESETUPDLG
        lStructSize As Long
        hwndOwner As Long
        hDevMode As Long
        hDevNames As Long
        Flags As Long
        ptPaperSize As POINTAPI
        rtMinMargin As RECT
        rtMargin As RECT
        hInstance As Long
        lCustData As Long
        lpfnPageSetupHook As Long
        lpfnPagePaintHook As Long
        lpPageSetupTemplateName As String
        hPageSetupTemplate As Long
    End Type

    Public Enum FileFlags
        OFN_ALLOWMULTISELECT = &H200
        OFN_CREATEPROMPT = &H2000
        OFN_ENABLEHOOK = &H20
        OFN_ENABLETEMPLATE = &H40
        OFN_ENABLETEMPLATEHANDLE = &H80
        OFN_EXPLORER = &H80000                         ’  new look commdlg
        OFN_EXTENSIONDIFFERENT = &H400
        OFN_FILEMUSTEXIST = &H1000
        OFN_HIDEREADONLY = &H4
        OFN_LONGNAMES = &H200000                       ’  force long names for 3.x modules
        OFN_NOCHANGEDIR = &H8
        OFN_NODEREFERENCELINKS = &H100000
        OFN_NOLONGNAMES = &H40000                      ’  force no long names for 4.x modules
        OFN_NONETWORKBUTTON = &H20000
        OFN_NOREADONLYRETURN = &H8000
        OFN_NOTESTFILECREATE = &H10000
        OFN_NOVALIDATE = &H100
        OFN_OVERWRITEPROMPT = &H2
        OFN_PATHMUSTEXIST = &H800
        OFN_READONLY = &H1
        OFN_SHAREAWARE = &H4000
        OFN_SHAREFALLTHROUGH = 2
        OFN_SHARENOWARN = 1
        OFN_SHAREWARN = 0
        OFN_SHOWHELP = &H10
       
        PD_ALLPAGES = &H0
        PD_COLLATE = &H10
        PD_DISABLEPRINTTOFILE = &H80000
        PD_ENABLEPRINTHOOK = &H1000
        PD_ENABLEPRINTTEMPLATE = &H4000
        PD_ENABLEPRINTTEMPLATEHANDLE = &H10000
        PD_ENABLESETUPHOOK = &H2000
        PD_ENABLESETUPTEMPLATE = &H8000
        PD_ENABLESETUPTEMPLATEHANDLE = &H20000
        PD_HIDEPRINTTOFILE = &H100000
        PD_NONETWORKBUTTON = &H200000
        PD_NOPAGENUMS = &H8
        PD_NOSELECTION = &H4
        PD_NOWARNING = &H80
        PD_PAGENUMS = &H2
        PD_PRINTSETUP = &H40
        PD_PRINTTOFILE = &H20
        PD_RETURNDC = &H100
        PD_RETURNDEFAULT = &H400
        PD_RETURNIC = &H200
        PD_SELECTION = &H1
        PD_SHOWHELP = &H800
        PD_USEDEVMODECOPIES = &H40000
        PD_USEDEVMODECOPIESANDCOLLATE = &H40000
    End Enum

    Const FW_NORMAL = 400
    Const DEFAULT_CHARSET = 1
    Const OUT_DEFAULT_PRECIS = 0
    Const CLIP_DEFAULT_PRECIS = 0
    Const DEFAULT_QUALITY = 0
    Const DEFAULT_PITCH = 0
    Const FF_ROMAN = 16
    Const GMEM_MOVEABLE = &H2
    Const GMEM_ZEROINIT = &H40
    Const CF_PRINTERFONTS = &H2
    Const CF_SCREENFONTS = &H1
    Const CF_BOTH = (CF_SCREENFONTS Or CF_PRINTERFONTS)
    Const CF_EFFECTS = &H100&
    Const CF_FORCEFONTEXIST = &H10000
    Const CF_INITTOLOGFONTSTRUCT = &H40&
    Const CF_LIMITSIZE = &H2000&
    Const REGULAR_FONTTYPE = &H400

    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 PrintDialog Lib "comdlg32.dll" Alias "PrintDlgA" (pPrintdlg As PRINTDLG) As Long
    Private Declare Function ChooseColorDialog Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As CHOOSECOLOR) As Long
    Private Declare Function CHOOSEFONT Lib "comdlg32.dll" Alias "ChooseFontA" (pChoosefont As CHOOSEFONT) As Long
    Private Declare Function FindText Lib "comdlg32.dll" Alias "FindTextA " (pFindreplace As FINDREPLACE) As Long
    Private Declare Function PAGESETUPDLG Lib "comdlg32.dll" Alias "PageSetupDlgA" (pPagesetupdlg As PAGESETUPDLG) As Long
    Private Declare Function ReplaceText Lib "comdlg32.dll" Alias "ReplaceTextA" (pFindreplace As FINDREPLACE) 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)

    ’ FileOpen 类成员变量 =====================================================
    Private m_lngHwnd As Long
    Private m_lngInstance As Long
    Private m_strFileName As String
    Private m_strFileTitle As String
    Private m_strInitDir As String
    Private m_strDialogTitle As String
    Private m_strFilter As String
    Private m_lngFlags As Long

    ’ Print 类成员变量 =====================================================
    Private m_lngCopies As Long
    Private m_lngFromPage As Long
    Private m_lngToPage As Long
    Private m_lngMaxPage As Long
    Private m_lngMinPage As Long

    ’ Print 类成员变量 =====================================================
    Private m_lngColor As Long

    ’ Font 类成员变量 =====================================================
    Private m_strFontName As String
    Private m_lngFontColor As Long
    Private m_lngFontSize As Long
    Private m_lngCharSet As Long
    Private m_bolItalic As Boolean
    Private m_bolStrikeOut As Boolean
    Private m_bolUnderline As Boolean
    Private m_bolBlob As Boolean

    ’ PageSetup 类成员变量 =====================================================
    Private m_lngPaperWidth As Long
    Private m_lngPaperHeight As Long
    Private m_lngMarginLeft As Long
    Private m_lngMarginTop As Long
    Private m_lngMarginRight As Long
    Private m_lngMarginBottom As Long

    ’ FileOpen 类实现 =========================================================
    Public Function ShowOpen() As Boolean
        Dim fName As String, sName As String, OfName As OPENFILENAME
       
        OfName.lStructSize = Len(OfName)
        OfName.hwndOwner = m_lngHwnd
        OfName.hInstance = m_lngInstance
        OfName.lpstrInitialDir = m_strInitDir
        OfName.lpstrFilter = m_strFilter
        OfName.lpstrFile = Space(255) & Chr(0)
        OfName.nMaxFile = 256
        OfName.lpstrFileTitle = Space(255) & Chr(0)
        OfName.nMaxFileTitle = 256
        OfName.lpstrTitle = m_strDialogTitle
        OfName.Flags = m_lngFlags
       
        If GetOpenFileName(OfName) Then
            m_strFileName = OfName.lpstrFile
            m_strFileTitle = OfName.lpstrFileTitle

            ShowOpen = True
        Else
            ShowOpen = False
        End If
    End Function

    Public Property Get Filter() As String
        Filter = m_strFilter
    End Property

    Public Property Let Filter(ByVal vNewValue As String)
        m_strFilter = Replace(vNewValue, "|", Chr(0)) & Chr(0)
    End Property

    Public Property Get Flags() As FileFlags
        Flags = m_lngFlags
    End Property

    Public Property Let Flags(ByVal vNewValue As FileFlags)
        m_lngFlags = vNewValue
    End Property

    Public Property Get DialogTitle() As String
        DialogTitle = m_strDialogTitle
    End Property

    Public Property Let DialogTitle(ByVal vNewValue As String)
        m_strDialogTitle = vNewValue
    End Property

    Public Property Get InitDir() As String
        InitDir = m_strInitDir
    End Property

    Public Property Let InitDir(ByVal vNewValue As String)
        m_strInitDir = vNewValue
    End Property

    Public Property Get FileTitle() As String
        FileTitle = m_strFileTitle
    End Property

    Public Property Let FileTitle(ByVal vNewValue As String)
        m_strFileTitle = vNewValue
    End Property

    Public Property Get FileName() As String
        FileName = m_strFileName
    End Property

    Public Property Let FileName(ByVal vNewValue As String)
        m_strFileName = vNewValue
    End Property

    Public Property Get Hwnd() As Long
        Hwnd = m_lngHwnd
    End Property

    Public Property Let Hwnd(ByVal vNewValue As Long)
        m_lngHwnd = vNewValue
    End Property

    Public Property Get Instance() As Long
        Instance = m_lngInstance
    End Property

    Public Property Let Instance(ByVal vNewValue As Long)
        m_lngInstance = vNewValue
    End Property

    ’ FileSave 类实现 =========================================================
    Public Function ShowSave() As Boolean
        Dim fName As String, sName As String, OfName As OPENFILENAME
       
        OfName.lStructSize = Len(OfName)
        OfName.hwndOwner = m_lngHwnd
        OfName.hInstance = m_lngInstance
        OfName.lpstrInitialDir = m_strInitDir
        OfName.lpstrFilter = m_strFilter
        OfName.lpstrFile = Space(255) & Chr(0)
        OfName.nMaxFile = 256
        OfName.lpstrFileTitle = Space(255) & Chr(0)
        OfName.nMaxFileTitle = 256
        OfName.lpstrTitle = m_strDialogTitle
        OfName.Flags = m_lngFlags
       
        If GetSaveFileName(OfName) Then
            m_strFileName = OfName.lpstrFile
            m_strFileTitle = OfName.lpstrFileTitle

            ShowSave = True
        Else
            ShowSave = False
        End If
    End Function

    ’ Print 类实现 =========================================================
    Public Function ShowPrint() As Boolean
        Dim PrtDlg As PRINTDLG
       
        PrtDlg.lStructSize = Len(PrtDlg)
        PrtDlg.hwndOwner = m_lngHwnd
        PrtDlg.hInstance = m_lngInstance
        PrtDlg.nCopies = m_lngCopies
        PrtDlg.nFromPage = m_lngFromPage
        PrtDlg.nMaxPage = m_lngMaxPage
        PrtDlg.nMinPage = m_lngMinPage
        PrtDlg.nToPage = m_lngToPage
        PrtDlg.Flags = m_lngFlags
           
        If PrintDialog(PrtDlg) Then
            m_lngCopies = PrtDlg.nCopies
            m_lngFromPage = PrtDlg.nFromPage
            m_lngMaxPage = PrtDlg.nMaxPage
            m_lngMinPage = PrtDlg.nMinPage
            m_lngToPage = PrtDlg.nToPage

            ShowPrint = True
        Else
            ShowPrint = False
        End If
    End Function

    Public Property Get Copies() As Long
        Copies = m_lngCopies
    End Property

    Public Property Let Copies(ByVal vNewValue As Long)
        m_lngCopies = vNewValue
    End Property

    Public Property Get FromPage() As Long
        FromPage = m_lngFromPage
    End Property

    Public Property Let FromPage(ByVal vNewValue As Long)
        m_lngFromPage = vNewValue
    End Property

    Public Property Get ToPage() As Long
        ToPage = m_lngToPage
    End Property

    Public Property Let ToPage(ByVal vNewValue As Long)
        m_lngToPage = vNewValue
    End Property

    Public Property Get MaxPage() As Long
        MaxPage = m_lngMaxPage
    End Property

    Public Property Let MaxPage(ByVal vNewValue As Long)
        m_lngMaxPage = vNewValue
    End Property

    Public Property Get MinPage() As Long
        MinPage = m_lngMinPage
    End Property

    Public Property Let MinPage(ByVal vNewValue As Long)
        m_lngMinPage = vNewValue
    End Property

    ’ ChooseColorDialog 类实现 =========================================================
    Public Function ShowColor() As Boolean
        Dim i As Integer
        Dim ClrDlg As CHOOSECOLOR, CustomColors() As Byte

        ReDim CustomColors(0 To 63) As Byte
        For i = LBound(CustomColors) To UBound(CustomColors)
            CustomColors(i) = 0
        Next i

        ClrDlg.lStructSize = Len(ClrDlg)
        ClrDlg.hwndOwner = m_lngHwnd
        ClrDlg.hInstance = m_lngInstance
        ClrDlg.lpCustColors = StrConv(CustomColors, vbUnicode)
     
        If ChooseColorDialog(ClrDlg) Then
            m_lngColor = ClrDlg.rgbResult
            CustomColors = StrConv(ClrDlg.lpCustColors, vbFromUnicode)

            ShowColor = True
        Else
            ShowColor = False
        End If
    End Function

    Public Property Get Color() As Long
        Color = m_lngColor
    End Property

    Public Property Let Color(ByVal vNewValue As Long)
        m_lngColor = vNewValue
    End Property

    ’ Font 类实现 =========================================================
    Public Function ShowFont() As Boolean
        Dim cf As CHOOSEFONT, lfont As LOGFONT, hMem As Long, pMem As Long
        Dim FontName As String, retval As Long
       
        lfont.lfHeight = 0  ’ determine default height
        lfont.lfWidth = 0  ’ determine default width
        lfont.lfEscapement = 0  ’ angle between baseline and escapement vector
        lfont.lfOrientation = 0  ’ angle between baseline and orientation vector
        lfont.lfWeight = FW_NORMAL  ’ normal weight I.e. Not bold
        lfont.lfCharSet = DEFAULT_CHARSET  ’ use default character set
        lfont.lfOutPrecision = OUT_DEFAULT_PRECIS  ’ default precision mapping
        lfont.lfClipPrecision = CLIP_DEFAULT_PRECIS  ’ default clipping precision
        lfont.lfQuality = DEFAULT_QUALITY  ’ default quality setting
        lfont.lfPitchAndFamily = DEFAULT_PITCH Or FF_ROMAN  ’ default pitch, proportional with serifs
        lfont.lfFaceName = "Times New Roman" & vbNullChar  ’ string must be null-terminated
        ’ Create the memory block which will act as the LOGFONT structure buffer.
        hMem = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, Len(lfont))
        pMem = GlobalLock(hMem)  ’ lock and get pointer
        CopyMemory ByVal pMem, lfont, Len(lfont)  ’ copy structure’s contents into block
       
        ’ Initialize dialog box: Screen and printer fonts, point size between 10 and 72.
        cf.lStructSize = Len(cf)  ’ size of structure
        cf.hwndOwner = m_lngHwnd  ’ window Form1 is opening this dialog box
        cf.hdc = Printer.hdc  ’ device context of default printer (using VB’s mechanism)
        cf.lpLogFont = pMem   ’ pointer to LOGFONT memory block buffer
        cf.iPointSize = 120  ’ 12 point font (in units of 1/10 point)
        cf.Flags = CF_BOTH Or CF_EFFECTS Or CF_FORCEFONTEXIST Or CF_INITTOLOGFONTSTRUCT Or CF_LIMITSIZE
        cf.rgbColors = RGB(0, 0, 0)  ’ black
        cf.nFontType = REGULAR_FONTTYPE  ’ regular font type I.e. Not bold or anything
        cf.nSizeMin = 1  ’ minimum point size
        cf.nSizeMax = 72  ’ maximum point size
        ’ Now, call the function.  If successful, copy the LOGFONT structure back into the structure
        ’ and then print out the attributes we mentioned earlier that the user selected.
       
        If CHOOSEFONT(cf) Then  ’ success
            CopyMemory lfont, ByVal pMem, Len(lfont)  ’ copy memory back
            ’ Now make the fixed-length string holding the font name into a "normal" string.
            m_strFontName = Left(lfont.lfFaceName, InStr(lfont.lfFaceName, vbNullChar) - 1)
            m_lngFontColor = cf.rgbColors
            m_lngFontSize = cf.iPointSize / 10
            m_lngCharSet = lfont.lfCharSet
            m_bolItalic = lfont.lfItalic = 255
            m_bolStrikeOut = lfont.lfStrikeOut = 1
            m_bolUnderline = lfont.lfUnderline = 1
            m_bolBlob = lfont.lfWeight >= 700
            ShowFont = True
        Else
            ShowFont = False
        End If
        ’ Deallocate the memory block we created earlier.  Note that this must
        ’ be done whether the function succeeded or not.
        retval = GlobalUnlock(hMem)  ’ destroy pointer, unlock block
        retval = GlobalFree(hMem)  ’ free the allocated memory
    End Function

    Public Property Get FontName() As String
        FontName = m_strFontName
    End Property

    Public Property Let FontName(ByVal vNewValue As String)
        m_strFontName = vNewValue
    End Property

    Public Property Get FontColor() As Long
        FontColor = m_lngFontColor
    End Property

    Public Property Let FontColor(ByVal vNewValue As Long)
        m_lngFontColor = vNewValue
    End Property

    Public Property Get FontSize() As Long
        FontSize = m_lngFontSize
    End Property

    Public Property Let FontSize(ByVal vNewValue As Long)
        m_lngFontSize = vNewValue
    End Property

    Public Property Get CharSet() As Long
        CharSet = m_lngCharSet
    End Property

    Public Property Let CharSet(ByVal vNewValue As Long)
        m_lngCharSet = vNewValue
    End Property

    Public Property Get Italic() As Boolean
        Italic = m_bolItalic
    End Property

    Public Property Let Italic(ByVal vNewValue As Boolean)
        m_bolItalic = vNewValue
    End Property

    Public Property Get StrikeOut() As Boolean
        StrikeOut = m_bolStrikeOut
    End Property

    Public Property Let StrikeOut(ByVal vNewValue As Boolean)
        m_bolStrikeOut = vNewValue
    End Property

    Public Property Get Underline() As Boolean
        Underline = m_bolUnderline
    End Property

    Public Property Let Underline(ByVal vNewValue As Boolean)
        m_bolUnderline = vNewValue
    End Property

    Public Property Get FontBlob() As Boolean
        FontBlob = m_bolBlob
    End Property

    Public Property Let FontBlob(ByVal vNewValue As Boolean)
        m_bolBlob = vNewValue
    End Property

    ’ Find 类实现 =========================================================
    Public Function ShowFind() As Boolean
        Dim lFind As FINDREPLACE

        lFind.lStructSize = Len(lFind)
        lFind.hwndOwner = m_lngHwnd
        lFind.hInstance = m_lngInstance
        lFind.wFindWhatLen = 255
       
    ’    If FindText(lFind) Then
    ’        ShowFind = True
    ’    Else
    ’        ShowFind = False
    ’    End If
    End Function

    ’ Replace 类实现 =========================================================
    Public Function ShowReplace() As Boolean
        Dim lFind As FINDREPLACE

        lFind.lStructSize = Len(lFind)
        lFind.hwndOwner = m_lngHwnd
        lFind.hInstance = m_lngInstance
        lFind.wFindWhatLen = 255
       
        If ReplaceText(lFind) Then
            ShowReplace = True
        Else
            ShowReplace = False
        End If
    End Function

    ’ Replace 类实现 =========================================================
    Public Function ShowPageSetup() As Boolean
        Dim lPageSetup As PAGESETUPDLG

        lPageSetup.lStructSize = Len(lPageSetup)
        lPageSetup.hwndOwner = m_lngHwnd
        lPageSetup.hInstance = m_lngInstance

        If PAGESETUPDLG(lPageSetup) Then
            m_lngPaperWidth = lPageSetup.ptPaperSize.x
            m_lngPaperHeight = lPageSetup.ptPaperSize.y
            m_lngMarginLeft = lPageSetup.rtMargin.Left
            m_lngMarginTop = lPageSetup.rtMargin.Top
            m_lngMarginRight = lPageSetup.rtMargin.Right
            m_lngMarginBottom = lPageSetup.rtMargin.Bottom
           
            ShowPageSetup = True
        Else
            ShowPageSetup = False
        End If
    End Function

    Public Property Get PaperWidth() As Long
        PaperWidth = m_lngPaperWidth
    End Property

    Public Property Let PaperWidth(ByVal vNewValue As Long)
        m_lngPaperWidth = vNewValue
    End Property

    Public Property Get PaperHeight() As Long
        PaperHeight = m_lngPaperHeight
    End Property

    Public Property Let PaperHeight(ByVal vNewValue As Long)
        m_lngPaperHeight = vNewValue
    End Property

    Public Property Get MarginLeft() As Long
        MarginLeft = m_lngMarginLeft
    End Property

    Public Property Let MarginLeft(ByVal vNewValue As Long)
        m_lngMarginLeft = vNewValue
    End Property

    Public Property Get MarginTop() As Long
        MarginTop = m_lngMarginTop
    End Property

    Public Property Let MarginTop(ByVal vNewValue As Long)
        m_lngMarginTop = vNewValue
    End Property

    Public Property Get MarginRight() As Long
        MarginRight = m_lngMarginRight
    End Property

    Public Property Let MarginRight(ByVal vNewValue As Long)
        m_lngMarginRight = vNewValue
    End Property

    Public Property Get MarginBottom() As Long
        MarginBottom = m_lngMarginBottom
    End Property

    Public Property Let MarginBottom(ByVal vNewValue As Long)
        m_lngMarginBottom = vNewValue
    End Property

    在窗口中添加六个按钮,分别用来实现调用这几个通用对话框,代码如下:

    Option Explicit

    Dim dlg As CDialog

    Private Sub Command1_Click()
        dlg.Hwnd = Hwnd
        dlg.Filter = "WORD文档|*.doc;*.html"
        dlg.Flags = OFN_ALLOWMULTISELECT + OFN_EXPLORER + OFN_PATHMUSTEXIST
        dlg.InitDir = "D:\"
        dlg.DialogTitle = "(昱豪)打开文件..."
       
        If dlg.ShowOpen Then
            MsgBox dlg.FileName
            MsgBox dlg.FileTitle
        End If
    End Sub

    Private Sub Command2_Click()
        dlg.Hwnd = Hwnd
        dlg.Filter = "WORD文档|*.doc;*.html"
        dlg.Flags = OFN_ALLOWMULTISELECT + OFN_EXPLORER + OFN_PATHMUSTEXIST
        dlg.InitDir = "D:\"
        dlg.DialogTitle = "(昱豪)保存文件..."
       
        If dlg.ShowSave Then
            MsgBox dlg.FileName
            MsgBox dlg.FileTitle
        End If
    End Sub

    Private Sub Command3_Click()
        dlg.Hwnd = Hwnd
        dlg.Flags = PD_SELECTION + PD_USEDEVMODECOPIES
       
        If dlg.ShowPrint Then
            MsgBox "Copies:" & dlg.Copies & vbCrLf & _
                "FromPage:" & dlg.FromPage & vbCrLf & _
                "ToPage:" & dlg.ToPage & vbCrLf & _
                "MaxPage:" & dlg.MaxPage & vbCrLf & _
                "MinPage:" & dlg.MinPage
        End If
    End Sub

    Private Sub Command4_Click()
        dlg.Hwnd = Hwnd
       
        If dlg.ShowColor Then
            BackColor = dlg.Color
        End If
    End Sub

    Private Sub Command5_Click()
        dlg.Hwnd = Hwnd
       
        If dlg.ShowFont Then
            MsgBox "FontName:" & dlg.FontName & vbCrLf & _
                "FontColor:" & dlg.FontColor & vbCrLf & _
                "FontSize:" & dlg.FontSize & vbCrLf & _
                "CharSet:" & dlg.CharSet & vbCrLf & _
                "Italic:" & dlg.Italic & vbCrLf & _
                "StrikeOut:" & dlg.StrikeOut & vbCrLf & _
                "Underline:" & dlg.Underline & vbCrLf & _
                "Blob:" & dlg.FontBlob
        End If
    End Sub

    Private Sub Command6_Click()
        dlg.Hwnd = Hwnd
        If dlg.ShowFind Then
           
        End If
    End Sub

    Private Sub Command7_Click()
        dlg.Hwnd = Hwnd
       
        If dlg.ShowPageSetup Then
            MsgBox "PageWeight:" & dlg.PaperWidth & vbCrLf & _
                "PageHeight:" & dlg.PaperHeight & vbCrLf & _
                "MarginLeft:" & dlg.MarginLeft & vbCrLf & _
                "MarginTop:" & dlg.MarginTop & vbCrLf & _
                "MarginRight:" & dlg.MarginRight & vbCrLf & _
                "MarginBottom:" & dlg.MarginBottom
        End If
    End Sub

    Private Sub Command8_Click()
        dlg.Hwnd = Hwnd
       
        If dlg.ShowReplace Then
           
        End If
    End Sub

    Private Sub Form_Load()
        Set dlg = New CDialog
    End Sub

    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        Set dlg = Nothing
    End Sub

      只要在工程中把这前面介绍的类文件加进去就可以使用了,不用外部的控件,安装的时候也省了一些控件,结省了空间!!