Microsoft & .NETVisual BasicAnything to declare?

Anything to declare?

Developer.com content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More.

Controls, controls, controls. Everybody makes controls for almost everything. Only one
problem, not everybody has these controls. This article will show you how to avoid adding
extra controls by calling them with API, especially the Common Dialog Control.

Let’s start at the beginning. The people who will most likely see your program are probably going to be VB programmers, or these users will at least have one piece of Microsoft software installed on their system. This means that they will have the Common Dialog Control (COMDLG32.ocx).

Adding this control to your setup program increases the already large file size, and,
this alone could put off potential users. Well, you DON’T need to add the Common Dialog
Control to your project. All you need to do is use some simple API calls to call the different procedures of the Common Dialog Control.

The first, and most used function is the Open File dialog. Just add the following
code to a form’s General Declarations procedure (making sure that you have a command
button on the form) and you should be able to call the open file dialog:

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 Declare Function_
  GetOpenFileName Lib_
  "comdlg32.dll"_
  Alias "GetOpenFileNameA"_
  (pOpenfilename As OPENFILENAME)_
  As Long 
 
Private Sub Command1_Click() 
Dim ofn As OPENFILENAME 
ofn.lStructSize = Len(ofn) 
ofn.hwndOwner = Form1.hWnd 
ofn.hInstance = App.hInstance 
ofn.lpstrFilter = "Text Files_
  (*.txt)" + Chr$(0) + "_
  *.txt" + Chr$(0) + "_
  Rich Text Files (*.rtf)"_
  + Chr$(0) + "*.rtf" + Chr$(0) 
ofn.lpstrFile = Space$(254) 
ofn.nMaxFile = 255 
ofn.lpstrFileTitle = Space$(254) 
ofn.nMaxFileTitle = 255 
ofn.lpstrInitialDir = CurDir 
ofn.lpstrTitle = "Dialog Title" 
ofn.flags = 0 
Dim a 
a = GetOpenFileName(ofn) 
 
If (a) Then 
  MsgBox "File to Open: "_
   + Trim$(ofn.lpstrFile) 
  'Do the file open stuff here 
Else 
  MsgBox "Cancel was pressed" 
End If 
End Sub

The print dialog is a useful function. The following code will give you access to this functionality:

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 Declare Function PrintDlg_
  Lib "comdlg32.dll"_
  Alias "PrintDlgA" _
(pPrintdlg As PrintDlg) As Long 
 
Private Sub Command1_Click() 
Dim tPrintDlg As PrintDlg 
tPrintDlg.lStructSize = Len(tPrintDlg) 
tPrintDlg.hwndOwner = Me.hWnd 
tPrintDlg.hdc = hdc 
tPrintDlg.flags = 0 
tPrintDlg.nFromPage = 0 
tPrintDlg.nToPage = 0 
tPrintDlg.nMinPage = 0 
tPrintDlg.nMaxPage = 0 
tPrintDlg.nCopies = 1 
tPrintDlg.hInstance = App.hInstance 
lpPrintTemplateName = "Print_
  Page" 
 
Dim a 
a = PrintDlg(tPrintDlg) 
 
If a Then 
lFromPage = tPrintDlg.nFromPage 
lToPage = tPrintDlg.nToPage 
lMin = tPrintDlg.nMinPage 
lMax = tPrintDlg.nMaxPage 
lCopies = tPrintDlg.nCopies 
'Printing stuff here 
End If 
End Sub

And finally, the following code will help you access the save as dialog:

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 Declare Function_
  GetSaveFileName Lib_
  "comdlg32.dll" _
Alias "GetSaveFileNameA"_
  (pOpenfilename As OPENFILENAME)_
  As Long 
 
Private Sub Command1_Click() 
Dim ofn As OPENFILENAME 
ofn.lStructSize = Len(ofn) 
ofn.hwndOwner = Form1.hWnd 
ofn.hInstance = App.hInstance 
ofn.lpstrFilter = "Text Files_
  (*.txt)" + Chr$(0) + _
  "*.txt" + Chr$(0)_
  + "Rich Text Files (*.rtf)_
  " + Chr$(0) _
  + "*.rtf" + Chr$(0) 
ofn.lpstrFile = Space$(254) 
ofn.nMaxFile = 255 
ofn.lpstrFileTitle = Space$(254) 
ofn.nMaxFileTitle = 255 
ofn.lpstrInitialDir = CurDir 
ofn.lpstrTitle = "Dialog_
  Title" 
ofn.flags = 0 
Dim a 
a = GetSaveFileName(ofn) 
 
If (a) Then 
MsgBox "File to Save: "_
  + Trim$(ofn.lpstrFile) 
'FileSave Stuff Here 
Else 
MsgBox "Cancel was pressed" 
End If 
 
End Sub  

That’s it! Easy eh. No need for large file sizes because of bulky .ocx
files, just use an API call!

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Latest Posts

Related Stories