home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 3_2004-2005.ISO / Data / Zips / AvalonSoft1750435262004.psc / cComDlg.cls < prev    next >
Text File  |  2003-10-06  |  35KB  |  1,051 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "cCommonDialog"
  10. Attribute VB_GlobalNameSpace = True
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. Option Explicit
  15.  
  16. ' ==========================================================================
  17. ' Class:    GCommonDialog
  18. ' Filename: GCommonDialog.cls
  19. ' Author:   Steve McMahon (steve@vbaccelerator.com)
  20. '           based on original code by Bruce McKinney
  21. ' Date:     24 May 1998
  22. '
  23. ' ---------------------------------------------------------------------------
  24. ' vbAccelerator - free, advanced source code for VB programmers.
  25. '     http://vbaccelerator.com
  26. '
  27. ' ==========================================================================
  28.  
  29.  
  30. ' ==========================================================================
  31. ' API declares:
  32. ' ==========================================================================
  33. Public Enum EErrorCommonDialog
  34.     eeBaseCommonDialog = 13450  ' CommonDialog
  35. End Enum
  36.  
  37. Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long
  38. Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
  39. Private Declare Function GlobalCompact Lib "kernel32" (ByVal dwMinFree As Long) As Long
  40. Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
  41. Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
  42. Private Declare Function GlobalReAlloc Lib "kernel32" (ByVal hMem As Long, ByVal dwBytes As Long, ByVal wFlags As Long) As Long
  43. Private Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
  44. Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
  45. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
  46.     lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
  47. Private Declare Sub CopyMemoryStr Lib "kernel32" Alias "RtlMoveMemory" ( _
  48.     lpvDest As Any, ByVal lpvSource As String, ByVal cbCopy As Long)
  49.  
  50. Private Const MAX_PATH = 260
  51. Private Const MAX_FILE = 260
  52.  
  53. Private Type OPENFILENAME
  54.     lStructSize As Long          ' Filled with UDT size
  55.     hWndOwner As Long            ' Tied to Owner
  56.     hInstance As Long            ' Ignored (used only by templates)
  57.     lpstrFilter As String        ' Tied to Filter
  58.     lpstrCustomFilter As String  ' Ignored (exercise for reader)
  59.     nMaxCustFilter As Long       ' Ignored (exercise for reader)
  60.     nFilterIndex As Long         ' Tied to FilterIndex
  61.     lpstrFile As String          ' Tied to FileName
  62.     nMaxFile As Long             ' Handled internally
  63.     lpstrFileTitle As String     ' Tied to FileTitle
  64.     nMaxFileTitle As Long        ' Handled internally
  65.     lpstrInitialDir As String    ' Tied to InitDir
  66.     lpstrTitle As String         ' Tied to DlgTitle
  67.     flags As Long                ' Tied to Flags
  68.     nFileOffset As Integer       ' Ignored (exercise for reader)
  69.     nFileExtension As Integer    ' Ignored (exercise for reader)
  70.     lpstrDefExt As String        ' Tied to DefaultExt
  71.     lCustData As Long            ' Ignored (needed for hooks)
  72.     lpfnHook As Long             ' Ignored (good luck with hooks)
  73.     lpTemplateName As Long       ' Ignored (good luck with templates)
  74. End Type
  75.  
  76. Private Declare Function GetOpenFileName Lib "COMDLG32" _
  77.     Alias "GetOpenFileNameA" (file As OPENFILENAME) As Long
  78. Private Declare Function GetSaveFileName Lib "COMDLG32" _
  79.     Alias "GetSaveFileNameA" (file As OPENFILENAME) As Long
  80. Private Declare Function GetFileTitle Lib "COMDLG32" _
  81.     Alias "GetFileTitleA" (ByVal szFile As String, _
  82.     ByVal szTitle As String, ByVal cbBuf As Long) As Long
  83.  
  84. Public Enum EOpenFile
  85.     OFN_READONLY = &H1
  86.     OFN_OVERWRITEPROMPT = &H2
  87.     OFN_HIDEREADONLY = &H4
  88.     OFN_NOCHANGEDIR = &H8
  89.     OFN_SHOWHELP = &H10
  90.     OFN_ENABLEHOOK = &H20
  91.     OFN_ENABLETEMPLATE = &H40
  92.     OFN_ENABLETEMPLATEHANDLE = &H80
  93.     OFN_NOVALIDATE = &H100
  94.     OFN_ALLOWMULTISELECT = &H200
  95.     OFN_EXTENSIONDIFFERENT = &H400
  96.     OFN_PATHMUSTEXIST = &H800
  97.     OFN_FILEMUSTEXIST = &H1000
  98.     OFN_CREATEPROMPT = &H2000
  99.     OFN_SHAREAWARE = &H4000
  100.     OFN_NOREADONLYRETURN = &H8000
  101.     OFN_NOTESTFILECREATE = &H10000
  102.     OFN_NONETWORKBUTTON = &H20000
  103.     OFN_NOLONGNAMES = &H40000
  104.     OFN_EXPLORER = &H80000
  105.     OFN_NODEREFERENCELINKS = &H100000
  106.     OFN_LONGNAMES = &H200000
  107. End Enum
  108.  
  109. Private Type TCHOOSECOLOR
  110.     lStructSize As Long
  111.     hWndOwner As Long
  112.     hInstance As Long
  113.     rgbResult As Long
  114.     lpCustColors As Long
  115.     flags As Long
  116.     lCustData As Long
  117.     lpfnHook As Long
  118.     lpTemplateName As Long
  119. End Type
  120.  
  121. Private Declare Function ChooseColor Lib "COMDLG32.DLL" _
  122.     Alias "ChooseColorA" (Color As TCHOOSECOLOR) As Long
  123.  
  124. Public Enum EChooseColor
  125.     CC_RGBInit = &H1
  126.     CC_FULLOPEN = &H2
  127.     CC_PreventFullOpen = &H4
  128.     CC_ColorShowHelp = &H8
  129. ' Win95 only
  130.     CC_SolidColor = &H80
  131.     CC_ANYCOLOR = &H100
  132. ' End Win95 only
  133.     CC_ENABLEHOOK = &H10
  134.     CC_ENABLETEMPLATE = &H20
  135.     CC_EnableTemplateHandle = &H40
  136. End Enum
  137. Private Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long
  138.  
  139. Private Type TCHOOSEFONT
  140.     lStructSize As Long         ' Filled with UDT size
  141.     hWndOwner As Long           ' Caller's window handle
  142.     hDC As Long                 ' Printer DC/IC or NULL
  143.     lpLogFont As Long           ' Pointer to LOGFONT
  144.     iPointSize As Long          ' 10 * size in points of font
  145.     flags As Long               ' Type flags
  146.     rgbColors As Long           ' Returned text color
  147.     lCustData As Long           ' Data passed to hook function
  148.     lpfnHook As Long            ' Pointer to hook function
  149.     lpTemplateName As Long      ' Custom template name
  150.     hInstance As Long           ' Instance handle for template
  151.     lpszStyle As String         ' Return style field
  152.     nFontType As Integer        ' Font type bits
  153.     iAlign As Integer           ' Filler
  154.     nSizeMin As Long            ' Minimum point size allowed
  155.     nSizeMax As Long            ' Maximum point size allowed
  156. End Type
  157. Private Declare Function ChooseFont Lib "COMDLG32" _
  158.     Alias "ChooseFontA" (chfont As TCHOOSEFONT) As Long
  159.  
  160. Private Const LF_FACESIZE = 32
  161. Private Type LOGFONT
  162.     lfHeight As Long
  163.     lfWidth As Long
  164.     lfEscapement As Long
  165.     lfOrientation As Long
  166.     lfWeight As Long
  167.     lfItalic As Byte
  168.     lfUnderline As Byte
  169.     lfStrikeOut As Byte
  170.     lfCharSet As Byte
  171.     lfOutPrecision As Byte
  172.     lfClipPrecision As Byte
  173.     lfQuality As Byte
  174.     lfPitchAndFamily As Byte
  175.     lfFaceName(LF_FACESIZE) As Byte
  176. End Type
  177.  
  178. Public Enum EChooseFont
  179.     CF_ScreenFonts = &H1
  180.     CF_PrinterFonts = &H2
  181.     CF_BOTH = &H3
  182.     CF_FontShowHelp = &H4
  183.     CF_UseStyle = &H80
  184.     CF_EFFECTS = &H100
  185.     CF_AnsiOnly = &H400
  186.     CF_NoVectorFonts = &H800
  187.     CF_NoOemFonts = CF_NoVectorFonts
  188.     CF_NoSimulations = &H1000
  189.     CF_LimitSize = &H2000
  190.     CF_FixedPitchOnly = &H4000
  191.     CF_WYSIWYG = &H8000  ' Must also have ScreenFonts And PrinterFonts
  192.     CF_ForceFontExist = &H10000
  193.     CF_ScalableOnly = &H20000
  194.     CF_TTOnly = &H40000
  195.     CF_NoFaceSel = &H80000
  196.     CF_NoStyleSel = &H100000
  197.     CF_NoSizeSel = &H200000
  198.     ' Win95 only
  199.     CF_SelectScript = &H400000
  200.     CF_NoScriptSel = &H800000
  201.     CF_NoVertFonts = &H1000000
  202.  
  203.     CF_InitToLogFontStruct = &H40
  204.     CF_Apply = &H200
  205.     CF_EnableHook = &H8
  206.     CF_EnableTemplate = &H10
  207.     CF_EnableTemplateHandle = &H20
  208.     CF_FontNotSupported = &H238
  209. End Enum
  210.  
  211. ' These are extra nFontType bits that are added to what is returned to the
  212. ' EnumFonts callback routine
  213.  
  214. Public Enum EFontType
  215.     Simulated_FontType = &H8000
  216.     Printer_FontType = &H4000
  217.     Screen_FontType = &H2000
  218.     Bold_FontType = &H100
  219.     Italic_FontType = &H200
  220.     Regular_FontType = &H400
  221. End Enum
  222.  
  223. '  DEVMODE collation selections
  224. Private Const DMCOLLATE_FALSE = 0
  225. Private Const DMCOLLATE_TRUE = 1
  226.  
  227. Public Enum EPrintDialog
  228.     PD_ALLPAGES = &H0
  229.     PD_SELECTION = &H1
  230.     PD_PAGENUMS = &H2
  231.     PD_NOSELECTION = &H4
  232.     PD_NOPAGENUMS = &H8
  233.     PD_COLLATE = &H10
  234.     PD_PRINTTOFILE = &H20
  235.     PD_PRINTSETUP = &H40
  236.     PD_NOWARNING = &H80
  237.     PD_RETURNDC = &H100
  238.     PD_RETURNIC = &H200
  239.     PD_RETURNDEFAULT = &H400
  240.     PD_SHOWHELP = &H800
  241.     PD_ENABLEPRINTHOOK = &H1000
  242.     PD_ENABLESETUPHOOK = &H2000
  243.     PD_ENABLEPRINTTEMPLATE = &H4000
  244.     PD_ENABLESETUPTEMPLATE = &H8000
  245.     PD_ENABLEPRINTTEMPLATEHANDLE = &H10000
  246.     PD_ENABLESETUPTEMPLATEHANDLE = &H20000
  247.     PD_USEDEVMODECOPIES = &H40000
  248.     PD_USEDEVMODECOPIESANDCOLLATE = &H40000
  249.     PD_DISABLEPRINTTOFILE = &H80000
  250.     PD_HIDEPRINTTOFILE = &H100000
  251.     PD_NONETWORKBUTTON = &H200000
  252. End Enum
  253.  
  254. Private Type DEVNAMES
  255.     wDriverOffset As Integer
  256.     wDeviceOffset As Integer
  257.     wOutputOffset As Integer
  258.     wDefault As Integer
  259. End Type
  260.  
  261. Private Const CCHDEVICENAME = 32
  262. Private Const CCHFORMNAME = 32
  263. Private Type DevMode
  264.     dmDeviceName As String * CCHDEVICENAME
  265.     dmSpecVersion As Integer
  266.     dmDriverVersion As Integer
  267.     dmSize As Integer
  268.     dmDriverExtra As Integer
  269.     dmFields As Long
  270.     dmOrientation As Integer
  271.     dmPaperSize As Integer
  272.     dmPaperLength As Integer
  273.     dmPaperWidth As Integer
  274.     dmScale As Integer
  275.     dmCopies As Integer
  276.     dmDefaultSource As Integer
  277.     dmPrintQuality As Integer
  278.     dmColor As Integer
  279.     dmDuplex As Integer
  280.     dmYResolution As Integer
  281.     dmTTOption As Integer
  282.     dmCollate As Integer
  283.     dmFormName As String * CCHFORMNAME
  284.     dmUnusedPadding As Integer
  285.     dmBitsPerPel As Integer
  286.     dmPelsWidth As Long
  287.     dmPelsHeight As Long
  288.     dmDisplayFlags As Long
  289.     dmDisplayFrequency As Long
  290. End Type
  291.  
  292. ' New Win95 Page Setup dialogs are up to you
  293. Private Type POINTL
  294.     x As Long
  295.     y As Long
  296. End Type
  297. Private Type RECT
  298.     Left As Long
  299.     Top As Long
  300.     Right As Long
  301.     Bottom As Long
  302. End Type
  303.  
  304.  
  305. Private Type TPAGESETUPDLG
  306.     lStructSize                 As Long
  307.     hWndOwner                   As Long
  308.     hDevMode                    As Long
  309.     hDevNames                   As Long
  310.     flags                       As Long
  311.     ptPaperSize                 As POINTL
  312.     rtMinMargin                 As RECT
  313.     rtMargin                    As RECT
  314.     hInstance                   As Long
  315.     lCustData                   As Long
  316.     lpfnPageSetupHook           As Long
  317.     lpfnPagePaintHook           As Long
  318.     lpPageSetupTemplateName     As Long
  319.     hPageSetupTemplate          As Long
  320. End Type
  321.  
  322. ' EPaperSize constants same as vbPRPS constants
  323. Public Enum EPaperSize
  324.     epsLetter = 1          ' Letter, 8 1/2 x 11 in.
  325.     epsLetterSmall         ' Letter Small, 8 1/2 x 11 in.
  326.     epsTabloid             ' Tabloid, 11 x 17 in.
  327.     epsLedger              ' Ledger, 17 x 11 in.
  328.     epsLegal               ' Legal, 8 1/2 x 14 in.
  329.     epsStatement           ' Statement, 5 1/2 x 8 1/2 in.
  330.     epsExecutive           ' Executive, 7 1/2 x 10 1/2 in.
  331.     epsA3                  ' A3, 297 x 420 mm
  332.     epsA4                  ' A4, 210 x 297 mm
  333.     epsA4Small             ' A4 Small, 210 x 297 mm
  334.     epsA5                  ' A5, 148 x 210 mm
  335.     epsB4                  ' B4, 250 x 354 mm
  336.     epsB5                  ' B5, 182 x 257 mm
  337.     epsFolio               ' Folio, 8 1/2 x 13 in.
  338.     epsQuarto              ' Quarto, 215 x 275 mm
  339.     eps10x14               ' 10 x 14 in.
  340.     eps11x17               ' 11 x 17 in.
  341.     epsNote                ' Note, 8 1/2 x 11 in.
  342.     epsEnv9                ' Envelope #9, 3 7/8 x 8 7/8 in.
  343.     epsEnv10               ' Envelope #10, 4 1/8 x 9 1/2 in.
  344.     epsEnv11               ' Envelope #11, 4 1/2 x 10 3/8 in.
  345.     epsEnv12               ' Envelope #12, 4 1/2 x 11 in.
  346.     epsEnv14               ' Envelope #14, 5 x 11 1/2 in.
  347.     epsCSheet              ' C size sheet
  348.     epsDSheet              ' D size sheet
  349.     epsESheet              ' E size sheet
  350.     epsEnvDL               ' Envelope DL, 110 x 220 mm
  351.     epsEnvC3               ' Envelope C3, 324 x 458 mm
  352.     epsEnvC4               ' Envelope C4, 229 x 324 mm
  353.     epsEnvC5               ' Envelope C5, 162 x 229 mm
  354.     epsEnvC6               ' Envelope C6, 114 x 162 mm
  355.     epsEnvC65              ' Envelope C65, 114 x 229 mm
  356.     epsEnvB4               ' Envelope B4, 250 x 353 mm
  357.     epsEnvB5               ' Envelope B5, 176 x 250 mm
  358.     epsEnvB6               ' Envelope B6, 176 x 125 mm
  359.     epsEnvItaly            ' Envelope, 110 x 230 mm
  360.     epsenvmonarch          ' Envelope Monarch, 3 7/8 x 7 1/2 in.
  361.     epsEnvPersonal         ' Envelope, 3 5/8 x 6 1/2 in.
  362.     epsFanfoldUS           ' U.S. Standard Fanfold, 14 7/8 x 11 in.
  363.     epsFanfoldStdGerman    ' German Standard Fanfold, 8 1/2 x 12 in.
  364.     epsFanfoldLglGerman    ' German Legal Fanfold, 8 1/2 x 13 in.
  365.     epsUser = 256          ' User-defined
  366. End Enum
  367.  
  368. ' EPrintQuality constants same as vbPRPQ constants
  369. Public Enum EPrintQuality
  370.     epqDraft = -1
  371.     epqLow = -2
  372.     epqMedium = -3
  373.     epqHigh = -4
  374. End Enum
  375.  
  376. Public Enum EOrientation
  377.     eoPortrait = 1
  378.     eoLandscape
  379. End Enum
  380.  
  381. Private Declare Function PageSetupDlg Lib "COMDLG32" _
  382.     Alias "PageSetupDlgA" (lppage As TPAGESETUPDLG) As Boolean
  383.  
  384. Public Enum EPageSetup
  385.     PSD_Defaultminmargins = &H0 ' Default (printer's)
  386.     PSD_InWinIniIntlMeasure = &H0
  387.     PSD_MINMARGINS = &H1
  388.     PSD_MARGINS = &H2
  389.     PSD_INTHOUSANDTHSOFINCHES = &H4
  390.     PSD_INHUNDREDTHSOFMILLIMETERS = &H8
  391.     PSD_DISABLEMARGINS = &H10
  392.     PSD_DISABLEPRINTER = &H20
  393.     PSD_NoWarning = &H80
  394.     PSD_DISABLEORIENTATION = &H100
  395.     PSD_ReturnDefault = &H400
  396.     PSD_DISABLEPAPER = &H200
  397.     PSD_ShowHelp = &H800
  398.     PSD_EnablePageSetupHook = &H2000
  399.     PSD_EnablePageSetupTemplate = &H8000
  400.     PSD_EnablePageSetupTemplateHandle = &H20000
  401.     PSD_EnablePagePaintHook = &H40000
  402.     PSD_DisablePagePainting = &H80000
  403. End Enum
  404.  
  405. Public Enum EPageSetupUnits
  406.     epsuInches
  407.     epsuMillimeters
  408. End Enum
  409.  
  410. ' Common dialog errors
  411.  
  412. Private Declare Function CommDlgExtendedError Lib "COMDLG32" () As Long
  413.  
  414. Public Enum EDialogError
  415.     CDERR_DIALOGFAILURE = &HFFFF
  416.  
  417.     CDERR_GENERALCODES = &H0
  418.     CDERR_STRUCTSIZE = &H1
  419.     CDERR_INITIALIZATION = &H2
  420.     CDERR_NOTEMPLATE = &H3
  421.     CDERR_NOHINSTANCE = &H4
  422.     CDERR_LOADSTRFAILURE = &H5
  423.     CDERR_FINDRESFAILURE = &H6
  424.     CDERR_LOADRESFAILURE = &H7
  425.     CDERR_LOCKRESFAILURE = &H8
  426.     CDERR_MEMALLOCFAILURE = &H9
  427.     CDERR_MEMLOCKFAILURE = &HA
  428.     CDERR_NOHOOK = &HB
  429.     CDERR_REGISTERMSGFAIL = &HC
  430.  
  431.     PDERR_PRINTERCODES = &H1000
  432.     PDERR_SETUPFAILURE = &H1001
  433.     PDERR_PARSEFAILURE = &H1002
  434.     PDERR_RETDEFFAILURE = &H1003
  435.     PDERR_LOADDRVFAILURE = &H1004
  436.     PDERR_GETDEVMODEFAIL = &H1005
  437.     PDERR_INITFAILURE = &H1006
  438.     PDERR_NODEVICES = &H1007
  439.     PDERR_NODEFAULTPRN = &H1008
  440.     PDERR_DNDMMISMATCH = &H1009
  441.     PDERR_CREATEICFAILURE = &H100A
  442.     PDERR_PRINTERNOTFOUND = &H100B
  443.     PDERR_DEFAULTDIFFERENT = &H100C
  444.  
  445.     CFERR_CHOOSEFONTCODES = &H2000
  446.     CFERR_NOFONTS = &H2001
  447.     CFERR_MAXLESSTHANMIN = &H2002
  448.  
  449.     FNERR_FILENAMECODES = &H3000
  450.     FNERR_SUBCLASSFAILURE = &H3001
  451.     FNERR_INVALIDFILENAME = &H3002
  452.     FNERR_BUFFERTOOSMALL = &H3003
  453.  
  454.     CCERR_CHOOSECOLORCODES = &H5000
  455. End Enum
  456.  
  457. ' Hook and notification support:
  458. Private Type NMHDR
  459.     hwndFrom As Long
  460.     idfrom As Long
  461.     code As Long
  462. End Type
  463. '// Structure used for all file based OpenFileName notifications
  464. Private Type OFNOTIFY
  465.     hdr As NMHDR
  466.     lpOFN As Long           ' Long pointer to OFN structure
  467.     pszFile As String ';        // May be NULL
  468. End Type
  469.  
  470. '// Structure used for all object based OpenFileName notifications
  471. Private Type OFNOTIFYEX
  472.     hdr As NMHDR
  473.     lpOFN As Long       ' Long pointer to OFN structure
  474.     psf As Long
  475.     LPVOID As Long          '// May be NULL
  476. End Type
  477.  
  478. Private Type OFNOTIFYshort
  479.     hdr As NMHDR
  480.     lpOFN As Long
  481. End Type
  482.  
  483. ' Messages:
  484. Private Const WM_INITDIALOG = &H110
  485. Private Const WM_NOTIFY = &H4E
  486. Private Const WM_USER = &H400
  487. Private Const WM_GETDLGCODE = &H87
  488. Private Const WM_NCDESTROY = &H82
  489.  
  490.  
  491. ' Notification codes:
  492. Private Const H_MAX As Long = &HFFFF + 1
  493. Private Const CDN_FIRST = (H_MAX - 601)
  494. Private Const CDN_LAST = (H_MAX - 699)
  495.  
  496. '// Notifications when Open or Save dialog status changes
  497. Private Const CDN_INITDONE = (CDN_FIRST - &H0)
  498. Private Const CDN_SELCHANGE = (CDN_FIRST - &H1)
  499. Private Const CDN_FOLDERCHANGE = (CDN_FIRST - &H2)
  500. Private Const CDN_SHAREVIOLATION = (CDN_FIRST - &H3)
  501. Private Const CDN_HELP = (CDN_FIRST - &H4)
  502. Private Const CDN_FILEOK = (CDN_FIRST - &H5)
  503. Private Const CDN_TYPECHANGE = (CDN_FIRST - &H6)
  504. Private Const CDN_INCLUDEITEM = (CDN_FIRST - &H7)
  505.  
  506. Private Const CDM_FIRST = (WM_USER + 100)
  507. Private Const CDM_LAST = (WM_USER + 200)
  508.  
  509. Private Const DWL_MSGRESULT = 0
  510. Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  511.  
  512. ' ==========================================================================
  513. ' Implementation:
  514. ' ==========================================================================
  515.  
  516. ' Array of custom colors lasts for life of app
  517. Private alCustom(0 To 15) As Long, fNotFirst As Boolean
  518.  
  519. Public Enum EPrintRange
  520.     eprAll
  521.     eprPageNumbers
  522.     eprSelection
  523. End Enum
  524. Private m_lApiReturn As Long
  525. Private m_lExtendedError As Long
  526. Private m_dvmode As DevMode
  527. Private m_oEventSink As Object
  528.  
  529. Public Function DialogHook( _
  530.         ByVal hDlg As Long, _
  531.         ByVal msg As Long, _
  532.         ByVal wParam As Long, _
  533.         ByVal lParam As Long _
  534.     )
  535. Dim tNMH As NMHDR
  536. Dim tOFNs As OFNOTIFYshort
  537. Dim tOF As OPENFILENAME
  538.  
  539.     If Not (m_oEventSink Is Nothing) Then
  540.         Select Case msg
  541.         Case WM_INITDIALOG
  542.             DialogHook = m_oEventSink.InitDialog(hDlg)
  543.         Case WM_NOTIFY
  544.             CopyMemory tNMH, ByVal lParam, Len(tNMH)
  545.             Select Case tNMH.code
  546.             Case CDN_SELCHANGE
  547.                 ' Changed selected file:
  548.                 DialogHook = m_oEventSink.FileChange(hDlg)
  549.             Case CDN_FOLDERCHANGE
  550.                 ' Changed folder:
  551.                 DialogHook = m_oEventSink.FolderChange(hDlg)
  552.             Case CDN_FILEOK
  553.                 ' Clicked OK:
  554.                 If Not m_oEventSink.ConfirmOK() Then
  555.                     SetWindowLong hDlg, DWL_MSGRESULT, 1
  556.                     DialogHook = 1
  557.                 Else
  558.                     SetWindowLong hDlg, DWL_MSGRESULT, 0
  559.                 End If
  560.             Case CDN_HELP
  561.                 ' Help clicked
  562.             Case CDN_TYPECHANGE
  563.                 DialogHook = m_oEventSink.TypeChange(hDlg)
  564.             Case CDN_INCLUDEITEM
  565.                 ' Hmmm
  566.             End Select
  567.         Case WM_NCDESTROY
  568.             m_oEventSink.DialogClose
  569.         End Select
  570.     End If
  571. End Function
  572.  
  573. Public Property Get APIReturn() As Long
  574.     'return object's APIReturn property
  575.     APIReturn = m_lApiReturn
  576. End Property
  577.  
  578. Public Property Get ExtendedError() As Long
  579.     'return object's ExtendedError property
  580.     ExtendedError = m_lExtendedError
  581. End Property
  582.  
  583. #If fComponent Then
  584. Private Sub Class_Initialize()
  585.     InitColors
  586. End Sub
  587. #End If
  588.  
  589. Function VBGetOpenFileName(Filename As String, _
  590.                            Optional FileTitle As String, _
  591.                            Optional FileMustExist As Boolean = True, _
  592.                            Optional MultiSelect As Boolean = False, _
  593.                            Optional ReadOnly As Boolean = False, _
  594.                            Optional HideReadOnly As Boolean = False, _
  595.                            Optional Filter As String = "All (*.*)| *.*", _
  596.                            Optional FilterIndex As Long = 1, _
  597.                            Optional InitDir As String, _
  598.                            Optional DlgTitle As String, _
  599.                            Optional DefaultExt As String, _
  600.                            Optional Owner As Long = -1, _
  601.                            Optional flags As Long = 0 _
  602.                         ) As Boolean
  603.  
  604.     Dim opfile As OPENFILENAME, s As String, afFlags As Long
  605.     
  606.     m_lApiReturn = 0
  607.     m_lExtendedError = 0
  608.  
  609. With opfile
  610.     .lStructSize = Len(opfile)
  611.     
  612.     ' Add in specific flags and strip out non-VB flags
  613.     
  614.     .flags = (-FileMustExist * OFN_FILEMUSTEXIST) Or _
  615.             (-MultiSelect * OFN_ALLOWMULTISELECT) Or _
  616.              (-ReadOnly * OFN_READONLY) Or _
  617.              (-HideReadOnly * OFN_HIDEREADONLY) Or _
  618.              (flags And CLng(Not (OFN_ENABLEHOOK Or _
  619.                                   OFN_ENABLETEMPLATE)))
  620.     ' Owner can take handle of owning window
  621.     If Owner <> -1 Then .hWndOwner = Owner
  622.     ' InitDir can take initial directory string
  623.     .lpstrInitialDir = InitDir
  624.     ' DefaultExt can take default extension
  625.     .lpstrDefExt = DefaultExt
  626.     ' DlgTitle can take dialog box title
  627.     .lpstrTitle = DlgTitle
  628.         
  629.     ' To make Windows-style filter, replace | and : with nulls
  630.     Dim ch As String, i As Integer
  631.     For i = 1 To Len(Filter)
  632.         ch = Mid$(Filter, i, 1)
  633.         If ch = "|" Or ch = ":" Then
  634.             s = s & vbNullChar
  635.         Else
  636.             s = s & ch
  637.         End If
  638.     Next
  639.     ' Put double null at end
  640.     s = s & vbNullChar & vbNullChar
  641.     .lpstrFilter = s
  642.     .nFilterIndex = FilterIndex
  643.  
  644.     ' Pad file and file title buffers to maximum path
  645.     s = Filename & String$(MAX_PATH - Len(Filename), 0)
  646.     .lpstrFile = s
  647.     .nMaxFile = MAX_PATH
  648.     s = FileTitle & String$(MAX_FILE - Len(FileTitle), 0)
  649.     .lpstrFileTitle = s
  650.     .nMaxFileTitle = MAX_FILE
  651.     ' All other fields set to zero
  652.     
  653.     
  654.     m_lApiReturn = GetOpenFileName(opfile)
  655.     Set m_oEventSink = Nothing
  656.     Select Case m_lApiReturn
  657.     Case 1
  658.         ' Success
  659.         VBGetOpenFileName = True
  660.         Filename = StrZToStr(.lpstrFile)
  661.         FileTitle = StrZToStr(.lpstrFileTitle)
  662.         flags = .flags
  663.         ' Return the filter index
  664.         FilterIndex = .nFilterIndex
  665.         ' Look up the filter the user selected and return that
  666.         Filter = FilterLookup(.lpstrFilter, FilterIndex)
  667.         If (.flags And OFN_READONLY) Then ReadOnly = True
  668.     Case 0
  669.         ' Cancelled
  670.         VBGetOpenFileName = False
  671.         Filename = ""
  672.         FileTitle = ""
  673.         flags = 0
  674.         FilterIndex = -1
  675.         Filter = ""
  676.     Case Else
  677.         ' Extended error
  678.         m_lExtendedError = CommDlgExtendedError()
  679.         VBGetOpenFileName = False
  680.         Filename = ""
  681.         FileTitle = ""
  682.         flags = 0
  683.         FilterIndex = -1
  684.         Filter = ""
  685.     End Select
  686.     Set m_oEventSink = Nothing
  687. End With
  688. End Function
  689. Private Function lHookAddress(lPtr As Long) As Long
  690.     'Debug.Print lPtr
  691.     lHookAddress = lPtr
  692. End Function
  693. Private Function StrZToStr(s As String) As String
  694.     StrZToStr = Left$(s, lstrlen(s))
  695. End Function
  696.  
  697. Function VBGetSaveFileName(Filename As String, _
  698.                            Optional FileTitle As String, _
  699.                            Optional OverWritePrompt As Boolean = True, _
  700.                            Optional Filter As String = "All (*.*)| *.*", _
  701.                            Optional FilterIndex As Long = 1, _
  702.                            Optional InitDir As String, _
  703.                            Optional DlgTitle As String, _
  704.                            Optional DefaultExt As String, _
  705.                            Optional Owner As Long = -1, _
  706.                            Optional flags As Long _
  707.                         ) As Boolean
  708.             
  709.     Dim opfile As OPENFILENAME, s As String
  710.  
  711.     m_lApiReturn = 0
  712.     m_lExtendedError = 0
  713.  
  714. With opfile
  715.     .lStructSize = Len(opfile)
  716.     
  717.     ' Add in specific flags and strip out non-VB flags
  718.     .flags = (-OverWritePrompt * OFN_OVERWRITEPROMPT) Or _
  719.              OFN_HIDEREADONLY Or _
  720.              (flags And CLng(Not (OFN_ENABLEHOOK Or _
  721.                                   OFN_ENABLETEMPLATE)))
  722.     .flags = .flags Or OFN_EXPLORER Or OFN_LONGNAMES
  723.     ' Owner can take handle of owning window
  724.     If Owner <> -1 Then .hWndOwner = Owner
  725.     ' InitDir can take initial directory string
  726.     .lpstrInitialDir = InitDir
  727.     ' DefaultExt can take default extension
  728.     .lpstrDefExt = DefaultExt
  729.     ' DlgTitle can take dialog box title
  730.     .lpstrTitle = DlgTitle
  731.     
  732.     ' Make new filter with bars (|) replacing nulls and double null at end
  733.     Dim ch As String, i As Integer
  734.     For i = 1 To Len(Filter)
  735.         ch = Mid$(Filter, i, 1)
  736.         If ch = "|" Or ch = ":" Then
  737.             s = s & vbNullChar
  738.         Else
  739.             s = s & ch
  740.         End If
  741.     Next
  742.     ' Put double null at end
  743.     s = s & vbNullChar & vbNullChar
  744.     .lpstrFilter = s
  745.     .nFilterIndex = FilterIndex
  746.  
  747.     ' Pad file and file title buffers to maximum path
  748.     s = Filename & String$(MAX_PATH - Len(Filename), 0)
  749.     .lpstrFile = s
  750.     .nMaxFile = MAX_PATH
  751.     s = FileTitle & String$(MAX_FILE - Len(FileTitle), 0)
  752.     .lpstrFileTitle = s
  753.     .nMaxFileTitle = MAX_FILE
  754.     ' All other fields zero
  755.     
  756.     m_lApiReturn = GetSaveFileName(opfile)
  757.     Set m_oEventSink = Nothing
  758.     Select Case m_lApiReturn
  759.     Case 1
  760.         VBGetSaveFileName = True
  761.         Filename = StrZToStr(.lpstrFile)
  762.         FileTitle = StrZToStr(.lpstrFileTitle)
  763.         flags = .flags
  764.         ' Return the filter index
  765.         FilterIndex = .nFilterIndex
  766.         ' Look up the filter the user selected and return that
  767.         Filter = FilterLookup(.lpstrFilter, FilterIndex)
  768.     Case 0
  769.         ' Cancelled:
  770.         VBGetSaveFileName = False
  771.         Filename = ""
  772.         FileTitle = ""
  773.         flags = 0
  774.         FilterIndex = 0
  775.         Filter = ""
  776.     Case Else
  777.         ' Extended error:
  778.         VBGetSaveFileName = False
  779.         m_lExtendedError = CommDlgExtendedError()
  780.         Filename = ""
  781.         FileTitle = ""
  782.         flags = 0
  783.         FilterIndex = 0
  784.         Filter = ""
  785.     End Select
  786. End With
  787. End Function
  788.  
  789. Private Function FilterLookup(ByVal sFilters As String, ByVal iCur As Long) As String
  790.     Dim iStart As Long, iEnd As Long, s As String
  791.     iStart = 1
  792.     If sFilters = "" Then Exit Function
  793.     Do
  794.         ' Cut out both parts marked by null character
  795.         iEnd = InStr(iStart, sFilters, vbNullChar)
  796.         If iEnd = 0 Then Exit Function
  797.         iEnd = InStr(iEnd + 1, sFilters, vbNullChar)
  798.         If iEnd Then
  799.             s = Mid$(sFilters, iStart, iEnd - iStart)
  800.         Else
  801.             s = Mid$(sFilters, iStart)
  802.         End If
  803.         iStart = iEnd + 1
  804.         If iCur = 1 Then
  805.             FilterLookup = s
  806.             Exit Function
  807.         End If
  808.         iCur = iCur - 1
  809.     Loop While iCur
  810. End Function
  811.  
  812. Function VBGetFileTitle(sFile As String) As String
  813.     Dim sFileTitle As String, cFileTitle As Integer
  814.  
  815.     cFileTitle = MAX_PATH
  816.     sFileTitle = String$(MAX_PATH, 0)
  817.     cFileTitle = GetFileTitle(sFile, sFileTitle, MAX_PATH)
  818.     If cFileTitle Then
  819.         VBGetFileTitle = ""
  820.     Else
  821.         VBGetFileTitle = Left$(sFileTitle, InStr(sFileTitle, vbNullChar) - 1)
  822.     End If
  823.  
  824. End Function
  825.  
  826. ' ChooseColor wrapper
  827. Function VBChooseColor(Color As Long, _
  828.                        Optional AnyColor As Boolean = True, _
  829.                        Optional FullOpen As Boolean = False, _
  830.                        Optional DisableFullOpen As Boolean = False, _
  831.                        Optional Owner As Long = -1, _
  832.                        Optional flags As Long _
  833.                     ) As Boolean
  834.  
  835.     Dim chclr As TCHOOSECOLOR
  836.     chclr.lStructSize = Len(chclr)
  837.     
  838.     ' Color must get reference variable to receive result
  839.     ' Flags can get reference variable or constant with bit flags
  840.     ' Owner can take handle of owning window
  841.     If Owner <> -1 Then chclr.hWndOwner = Owner
  842.  
  843.     ' Assign color (default uninitialized value of zero is good default)
  844.     chclr.rgbResult = Color
  845.  
  846.     ' Mask out unwanted bits
  847.     Dim afMask As Long
  848.     afMask = CLng(Not (CC_ENABLEHOOK Or _
  849.                        CC_ENABLETEMPLATE))
  850.     ' Pass in flags
  851.     chclr.flags = afMask And (CC_RGBInit Or _
  852.                   IIf(AnyColor, CC_ANYCOLOR, CC_SolidColor) Or _
  853.                   (-FullOpen * CC_FULLOPEN) Or _
  854.                   (-DisableFullOpen * CC_PreventFullOpen))
  855.     
  856.     ' If first time, initialize to white
  857.     If fNotFirst = False Then InitColors
  858.  
  859.     chclr.lpCustColors = VarPtr(alCustom(0))
  860.     ' All other fields zero
  861.     
  862.     m_lApiReturn = ChooseColor(chclr)
  863.     Set m_oEventSink = Nothing
  864.     
  865.     Select Case m_lApiReturn
  866.     Case 1
  867.         ' Success
  868.         VBChooseColor = True
  869.         Color = chclr.rgbResult
  870.     Case 0
  871.         ' Cancelled
  872.         VBChooseColor = False
  873.         Color = -1
  874.     Case Else
  875.         ' Extended error
  876.         m_lExtendedError = CommDlgExtendedError()
  877.         VBChooseColor = False
  878.         Color = -1
  879.     End Select
  880.  
  881. End Function
  882.  
  883. Friend Sub InitColors()
  884.     Dim i As Integer
  885.     ' Initialize with first 16 system interface colors
  886.     For i = 0 To 15
  887.         alCustom(i) = GetSysColor(i)
  888.     Next
  889.     fNotFirst = True
  890. End Sub
  891.  
  892. ' Property to read or modify custom colors (use to save colors in registry)
  893. Public Property Get CustomColor(i As Integer) As Long
  894.     ' If first time, initialize to white
  895.     If fNotFirst = False Then InitColors
  896.     If i >= 0 And i <= 15 Then
  897.         CustomColor = alCustom(i)
  898.     Else
  899.         CustomColor = -1
  900.     End If
  901. End Property
  902.  
  903. Public Property Let CustomColor(i As Integer, iValue As Long)
  904.     ' If first time, initialize to system colors
  905.     If fNotFirst = False Then InitColors
  906.     If i >= 0 And i <= 15 Then
  907.         alCustom(i) = iValue
  908.     End If
  909. End Property
  910.  
  911. ' ChooseFont wrapper
  912. Function VBChooseFont(CurFont As Font, _
  913.                       Optional PrinterDC As Long = -1, _
  914.                       Optional Owner As Long = -1, _
  915.                       Optional Color As Long = vbBlack, _
  916.                       Optional MinSize As Long = 0, _
  917.                       Optional MaxSize As Long = 0, _
  918.                       Optional flags As Long = 0 _
  919.                     ) As Boolean
  920.  
  921.     m_lApiReturn = 0
  922.     m_lExtendedError = 0
  923.  
  924.     ' Unwanted Flags bits
  925.     Const CF_FontNotSupported = CF_Apply Or CF_EnableHook Or CF_EnableTemplate
  926.     
  927.     ' Flags can get reference variable or constant with bit flags
  928.     ' PrinterDC can take printer DC
  929.     If PrinterDC = -1 Then
  930.         PrinterDC = 0
  931.         If flags And CF_PrinterFonts Then PrinterDC = Printer.hDC
  932.     Else
  933.         flags = flags Or CF_PrinterFonts
  934.     End If
  935.     ' Must have some fonts
  936.     If (flags And CF_PrinterFonts) = 0 Then flags = flags Or CF_ScreenFonts
  937.     ' Color can take initial color, receive chosen color
  938.     If Color <> vbBlack Then flags = flags Or CF_EFFECTS
  939.     ' MinSize can be minimum size accepted
  940.     If MinSize Then flags = flags Or CF_LimitSize
  941.     ' MaxSize can be maximum size accepted
  942.     If MaxSize Then flags = flags Or CF_LimitSize
  943.  
  944.     ' Put in required internal flags and remove unsupported
  945.     flags = (flags Or CF_InitToLogFontStruct) And Not CF_FontNotSupported
  946.     
  947.     ' Initialize LOGFONT variable
  948.     Dim fnt As LOGFONT
  949.     Const PointsPerTwip = 1440 / 72
  950.     fnt.lfHeight = -(CurFont.Size * (PointsPerTwip / Screen.TwipsPerPixelY))
  951.     fnt.lfWeight = CurFont.Weight
  952.     fnt.lfItalic = CurFont.Italic
  953.     fnt.lfUnderline = CurFont.Underline
  954.     fnt.lfStrikeOut = CurFont.Strikethrough
  955.     ' Other fields zero
  956.     StrToBytes fnt.lfFaceName, CurFont.Name
  957.  
  958.     ' Initialize TCHOOSEFONT variable
  959.     Dim cf As TCHOOSEFONT
  960.     cf.lStructSize = Len(cf)
  961.     If Owner <> -1 Then cf.hWndOwner = Owner
  962.     cf.hDC = PrinterDC
  963.     cf.lpLogFont = VarPtr(fnt)
  964.     cf.iPointSize = CurFont.Size * 10
  965.     cf.flags = flags
  966.     cf.rgbColors = Color
  967.     cf.nSizeMin = MinSize
  968.     cf.nSizeMax = MaxSize
  969.     
  970.     ' All other fields zero
  971.     m_lApiReturn = ChooseFont(cf)
  972.     Set m_oEventSink = Nothing
  973.     Select Case m_lApiReturn
  974.     Case 1
  975.         ' Success
  976.         VBChooseFont = True
  977.         flags = cf.flags
  978.         Color = cf.rgbColors
  979.         CurFont.Bold = cf.nFontType And Bold_FontType
  980.         'CurFont.Italic = cf.nFontType And Italic_FontType
  981.         CurFont.Italic = fnt.lfItalic
  982.         CurFont.Strikethrough = fnt.lfStrikeOut
  983.         CurFont.Underline = fnt.lfUnderline
  984.         CurFont.Weight = fnt.lfWeight
  985.         CurFont.Size = cf.iPointSize / 10
  986.         CurFont.Name = BytesToStr(fnt.lfFaceName)
  987.     Case 0
  988.         ' Cancelled
  989.         VBChooseFont = False
  990.     Case Else
  991.         ' Extended error
  992.         m_lExtendedError = CommDlgExtendedError()
  993.         VBChooseFont = False
  994.     End Select
  995.         
  996. End Function
  997.  
  998. Friend Property Get DevMode() As DevMode
  999.     DevMode = m_dvmode
  1000. End Property
  1001.  
  1002. #If fComponent = 0 Then
  1003. Private Sub ErrRaise(e As Long)
  1004.     Dim sText As String, sSource As String
  1005.     If e > 1000 Then
  1006.         sSource = App.EXEName & ".CommonDialog"
  1007.         Err.Raise COMError(e), sSource, sText
  1008.     Else
  1009.         ' Raise standard Visual Basic error
  1010.         sSource = App.EXEName & ".VBError"
  1011.         Err.Raise e, sSource
  1012.     End If
  1013. End Sub
  1014. #End If
  1015.  
  1016. Private Sub StrToBytes(ab() As Byte, s As String)
  1017.     If IsArrayEmpty(ab) Then
  1018.         ' Assign to empty array
  1019.         ab = StrConv(s, vbFromUnicode)
  1020.     Else
  1021.         Dim cab As Long
  1022.         ' Copy to existing array, padding or truncating if necessary
  1023.         cab = UBound(ab) - LBound(ab) + 1
  1024.         If Len(s) < cab Then s = s & String$(cab - Len(s), 0)
  1025.         'If UnicodeTypeLib Then
  1026.         '    Dim st As String
  1027.         '    st = StrConv(s, vbFromUnicode)
  1028.         '    CopyMemoryStr ab(LBound(ab)), st, cab
  1029.         'Else
  1030.             CopyMemoryStr ab(LBound(ab)), s, cab
  1031.         'End If
  1032.     End If
  1033. End Sub
  1034.  
  1035.  
  1036. Private Function BytesToStr(ab() As Byte) As String
  1037.     BytesToStr = StrConv(ab, vbUnicode)
  1038. End Function
  1039.  
  1040. Private Function COMError(e As Long) As Long
  1041.     COMError = e Or vbObjectError
  1042. End Function
  1043. '
  1044. Private Function IsArrayEmpty(va As Variant) As Boolean
  1045.     Dim v As Variant
  1046.     On Error Resume Next
  1047.     v = va(LBound(va))
  1048.     IsArrayEmpty = (Err <> 0)
  1049. End Function
  1050.  
  1051.