Click here to Skip to main content
15,896,153 members
Articles / Programming Languages / C#

Extend OpenFileDialog and SaveFileDialog the Easy Way

Rate me:
Please Sign up or sign in to vote.
4.82/5 (81 votes)
19 Jun 2015CPOL10 min read 1.5M   13.3K   287  
Customize OpenFileDialog and SaveFileDialog using a User Control
'  Copyright (c) 2006, Gustavo Franco
'  Copyright � Decebal Mihailescu 2007-2010

'  Email:  gustavo_franco@hotmail.com
'  All rights reserved.

'  Redistribution and use in source and binary forms, with or without modification, 
'  are permitted provided that the following conditions are met:

'  Redistributions of source code must retain the above copyright notice, 
'  this list of conditions and the following disclaimer. 
'  Redistributions in binary form must reproduce the above copyright notice, 
'  this list of conditions and the following disclaimer in the documentation 
'  and/or other materials provided with the distribution. 

'  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
'  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
'  IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
'  PURPOSE. IT CAN BE DISTRIBUTED FREE OF CHARGE AS LONG AS THIS HEADER 
'  REMAINS UNCHANGED.


Imports Microsoft.VisualBasic
Imports System
Imports System.Text
Imports System.Collections.Generic
Imports System.Runtime.InteropServices
Imports FileDialogExtenders

Namespace Win32Types
	#Region "SWP_Flags"
	<Flags> _
	Friend Enum SWP_Flags
		SWP_NOSIZE = &H0001
		SWP_NOMOVE = &H0002
		SWP_NOZORDER = &H0004
		SWP_NOACTIVATE = &H0010
		SWP_FRAMECHANGED = &H0020 ' The frame changed: send WM_NCCALCSIZE 
		SWP_SHOWWINDOW = &H0040
		SWP_HIDEWINDOW = &H0080
		SWP_NOOWNERZORDER = &H0200 ' Don't do owner Z ordering 

		SWP_DRAWFRAME = SWP_FRAMECHANGED
		SWP_NOREPOSITION = SWP_NOOWNERZORDER
	End Enum
	#End Region

	#Region "DialogChangeStatus"
	Friend Enum DialogChangeStatus As UInteger
		CDN_FIRST = &HFFFFFDA7L
		CDN_INITDONE = (CDN_FIRST - &H0000)
		CDN_SELCHANGE = (CDN_FIRST - &H0001)
		CDN_FOLDERCHANGE = (CDN_FIRST - &H0002)
		CDN_SHAREVIOLATION = (CDN_FIRST - &H0003)
		CDN_HELP = (CDN_FIRST - &H0004)
		CDN_FILEOK = (CDN_FIRST - &H0005)
		CDN_TYPECHANGE = (CDN_FIRST - &H0006)
		CDN_INCLUDEITEM = (CDN_FIRST - &H0007)
	End Enum
	#End Region


	#Region "DialogChangeProperties"
	Friend Enum DialogChangeProperties As UInteger
		CDM_FIRST = (CUInt(Msg.WM_USER) + 100)
		CDM_GETSPEC = (CDM_FIRST + &H0000)
		CDM_GETFILEPATH = (CDM_FIRST + &H0001)
		CDM_GETFOLDERPATH = (CDM_FIRST + &H0002)
		CDM_GETFOLDERIDLIST = (CDM_FIRST + &H0003)
		CDM_SETCONTROLTEXT = (CDM_FIRST + &H0004)
		CDM_HIDECONTROL = (CDM_FIRST + &H0005)
		CDM_SETDEFEXT = (CDM_FIRST + &H0006)
	End Enum
	#End Region
	#Region "ListView"

	Friend Enum ListViewMsg As UInteger
		LVM_FIRST = &H1000
		LVM_GETHEADER = LVM_FIRST + 31
		LVM_SETITEM = LVM_FIRST + 76
		LVM_INSERTITEM = LVM_FIRST + 77
	End Enum
	#End Region
	#Region "ImeNotify"

	Friend Enum ImeNotify
		IMN_CLOSESTATUSWINDOW = &H0001
		IMN_OPENSTATUSWINDOW = &H0002
		IMN_CHANGECANDIDATE = &H0003
		IMN_CLOSECANDIDATE = &H0004
		IMN_OPENCANDIDATE = &H0005
		IMN_SETCONVERSIONMODE = &H0006
		IMN_SETSENTENCEMODE = &H0007
		IMN_SETOPENSTATUS = &H0008
		IMN_SETCANDIDATEPOS = &H0009
		IMN_SETCOMPOSITIONFONT = &H000A
		IMN_SETCOMPOSITIONWINDOW = &H000B
		IMN_SETSTATUSWINDOWPOS = &H000C
		IMN_GUIDELINE = &H000D
		IMN_PRIVATE = &H000E
	End Enum
	#End Region

	#Region "FileDialogType"
	Public Enum FileDialogType
		OpenFileDlg
		SaveFileDlg
	End Enum
	#End Region

	#Region "FolderViewMode"

    Public Enum FolderViewMode
        Defaultm = &H7028
        Icon = Defaultm + 1
        SmallIcon = Defaultm + 2
        List = Defaultm + 3
        Details = Defaultm + 4
        Thumbnails = Defaultm + 5
        Title = Defaultm + 6
        Thumbstrip = Defaultm + 7
    End Enum
	#End Region

	#Region "Enum DialogViewProperty"

	Friend Enum DefaultViewType
		Icons = &H7029
		List = &H702b
		Details = &H702c
		Thumbnails = &H702d
		Tiles = &H702e
	End Enum
	#End Region

	#Region "ButtonStyle"

	Friend Enum ButtonStyle As UInteger
		BS_PUSHBUTTON = &H00000000
		BS_DEFPUSHBUTTON = &H00000001
		BS_CHECKBOX = &H00000002
		BS_AUTOCHECKBOX = &H00000003
		BS_RADIOBUTTON = &H00000004
		BS_3STATE = &H00000005
		BS_AUTO3STATE = &H00000006
		BS_GROUPBOX = &H00000007
		BS_USERBUTTON = &H00000008
		BS_AUTORADIOBUTTON= &H00000009
		BS_PUSHBOX = &H0000000A
		BS_OWNERDRAW = &H0000000B
		BS_TYPEMASK = &H0000000F
		BS_LEFTTEXT = &H00000020
		BS_TEXT = &H00000000
		BS_ICON = &H00000040
		BS_BITMAP = &H00000080
		BS_LEFT = &H00000100
		BS_RIGHT = &H00000200
		BS_CENTER = &H00000300
		BS_TOP = &H00000400
		BS_BOTTOM = &H00000800
		BS_VCENTER = &H00000C00
		BS_PUSHLIKE = &H00001000
		BS_MULTILINE = &H00002000
		BS_NOTIFY = &H00004000
		BS_FLAT = &H00008000
		BS_RIGHTBUTTON = BS_LEFTTEXT
	End Enum
	#End Region

	#Region "ZOrderPos"

	Friend Enum ZOrderPos
		HWND_TOP = 0
		HWND_BOTTOM = 1
		HWND_TOPMOST = -1
		HWND_NOTOPMOST = -2
	End Enum
	#End Region

	#Region "Static Control Styles"

	Friend Enum StaticControlStyles As UInteger
		SS_LEFT = &H00000000
		SS_CENTER = &H00000001
		SS_RIGHT = &H00000002
		SS_ICON = &H00000003
		SS_BLACKRECT = &H00000004
		SS_GRAYRECT = &H00000005
		SS_WHITERECT = &H00000006
		SS_BLACKFRAME = &H00000007
		SS_GRAYFRAME = &H00000008
		SS_WHITEFRAME = &H00000009
		SS_USERITEM = &H0000000A
		SS_SIMPLE = &H0000000B
		SS_LEFTNOWORDWRAP = &H0000000C
		SS_OWNERDRAW = &H0000000D
		SS_BITMAP = &H0000000E
		SS_ENHMETAFILE = &H0000000F
		SS_ETCHEDHORZ = &H00000010
		SS_ETCHEDVERT = &H00000011
		SS_ETCHEDFRAME = &H00000012
		SS_TYPEMASK = &H0000001F
		SS_REALSIZECONTROL = &H00000040
		SS_NOPREFIX = &H00000080 ' Don't do "&" character translation 
		SS_NOTIFY = &H00000100
		SS_CENTERIMAGE = &H00000200
		SS_RIGHTJUST = &H00000400
		SS_REALSIZEIMAGE = &H00000800
		SS_SUNKEN = &H00001000
		SS_EDITCONTROL = &H00002000
		SS_ENDELLIPSIS = &H00004000
		SS_PATHELLIPSIS = &H00008000
		SS_WORDELLIPSIS = &H0000C000
		SS_ELLIPSISMASK = &H0000C000
	End Enum
	#End Region

	#Region "Combo Box styles"

	Friend Enum ComboBoxStyles As UInteger
		None = 0
		CBS_SIMPLE = &H0001
		CBS_DROPDOWN = &H0002
		CBS_DROPDOWNLIST = &H0003
		CBS_OWNERDRAWFIXED = &H0010
		CBS_OWNERDRAWVARIABLE = &H0020
		CBS_AUTOHSCROLL = &H0040
		CBS_OEMCONVERT = &H0080
		CBS_SORT = &H0100
		CBS_HASSTRINGS = &H0200
		CBS_NOINTEGRALHEIGHT = &H0400
		CBS_DISABLENOSCROLL = &H0800
		CBS_UPPERCASE = &H2000
		CBS_LOWERCASE = &H4000
	End Enum
	#End Region

	#Region "Window Styles"

	<Flags> _
	Friend Enum WindowStyles As UInteger
		WS_OVERLAPPED = &H00000000
		WS_POPUP = &H80000000L
		WS_CHILD = &H40000000
		WS_MINIMIZE = &H20000000
		WS_VISIBLE = &H10000000
		WS_DISABLED = &H08000000
		WS_CLIPSIBLINGS = &H04000000
		WS_CLIPCHILDREN = &H02000000
		WS_MAXIMIZE = &H01000000
		WS_CAPTION = &H00C00000
		WS_BORDER = &H00800000
		WS_DLGFRAME = &H00400000
		WS_VSCROLL = &H00200000
		WS_HSCROLL = &H00100000
		WS_SYSMENU = &H00080000
		WS_THICKFRAME = &H00040000
		WS_GROUP = &H00020000
		WS_TABSTOP = &H00010000
		WS_MINIMIZEBOX = &H00020000
		WS_MAXIMIZEBOX = &H00010000
		WS_TILED = &H00000000
		WS_ICONIC = &H20000000
		WS_SIZEBOX = &H00040000
		WS_POPUPWINDOW = &H80880000L
		WS_OVERLAPPEDWINDOW = &H00CF0000
		WS_TILEDWINDOW = &H00CF0000
		WS_CHILDWINDOW = &H40000000
	End Enum
	#End Region

	#Region "Window Extended Styles"

	<Flags> _
	Friend Enum WindowExtendedStyles
		WS_EX_DLGMODALFRAME = &H00000001
		WS_EX_NOPARENTNOTIFY = &H00000004
		WS_EX_TOPMOST = &H00000008
		WS_EX_ACCEPTFILES = &H00000010
		WS_EX_TRANSPARENT = &H00000020
		WS_EX_MDICHILD = &H00000040
		WS_EX_TOOLWINDOW = &H00000080
		WS_EX_WINDOWEDGE = &H00000100
		WS_EX_CLIENTEDGE = &H00000200
		WS_EX_CONTEXTHELP = &H00000400
		WS_EX_RIGHT = &H00001000
		WS_EX_LEFT = &H00000000
		WS_EX_RTLREADING = &H00002000
		WS_EX_LTRREADING = &H00000000
		WS_EX_LEFTSCROLLBAR = &H00004000
		WS_EX_RIGHTSCROLLBAR = &H00000000
		WS_EX_CONTROLPARENT = &H00010000
		WS_EX_STATICEDGE = &H00020000
		WS_EX_APPWINDOW = &H00040000
		WS_EX_OVERLAPPEDWINDOW = &H00000300
		WS_EX_PALETTEWINDOW = &H00000188
		WS_EX_LAYERED = &H00080000
	End Enum
	#End Region

	#Region "ChildFromPointFlags"

	<Flags> _
	Friend Enum ChildFromPointFlags
		None = &H0000
		CWP_SKIPINVISIBLE = &H0001
		CWP_SKIPDISABLED = &H0002
		CWP_SKIPTRANSPARENT = &H0004
	End Enum
	#End Region

	#Region "HitTest"

	Friend Enum HitTest
		HTERROR = (-2)
		HTTRANSPARENT = (-1)
		HTNOWHERE = 0
		HTCLIENT = 1
		HTCAPTION = 2
		HTSYSMENU = 3
		HTGROWBOX = 4
		HTSIZE = HTGROWBOX
		HTMENU = 5
		HTHSCROLL = 6
		HTVSCROLL = 7
		HTMINBUTTON = 8
		HTMAXBUTTON = 9
		HTLEFT = 10
		HTRIGHT = 11
		HTTOP = 12
		HTTOPLEFT = 13
		HTTOPRIGHT = 14
		HTBOTTOM = 15
		HTBOTTOMLEFT = 16
		HTBOTTOMRIGHT = 17
		HTBORDER = 18
		HTREDUCE = HTMINBUTTON
		HTZOOM = HTMAXBUTTON
		HTSIZEFIRST = HTLEFT
		HTSIZELAST = HTBOTTOMRIGHT
		HTOBJECT = 19
		HTCLOSE = 20
		HTHELP = 21
	End Enum
	#End Region

	#Region "Windows Messages"

	Friend Enum Msg
		WM_NULL = &H0000
		WM_CREATE = &H0001
		WM_DESTROY = &H0002
		WM_MOVE = &H0003
		WM_SIZE = &H0005
		WM_ACTIVATE = &H0006
		WM_SETFOCUS = &H0007
		WM_KILLFOCUS = &H0008
		WM_ENABLE = &H000A
		WM_SETREDRAW = &H000B
		WM_SETTEXT = &H000C
		WM_GETTEXT = &H000D
		WM_GETTEXTLENGTH = &H000E
		WM_PAINT = &H000F
		WM_CLOSE = &H0010
		WM_QUERYENDSESSION = &H0011
		WM_QUIT = &H0012
		WM_QUERYOPEN = &H0013
		WM_ERASEBKGND = &H0014
		WM_SYSCOLORCHANGE = &H0015
		WM_ENDSESSION = &H0016
		WM_SHOWWINDOW = &H0018
		WM_CTLCOLOR = &H0019
		WM_WININICHANGE = &H001A
		WM_SETTINGCHANGE = &H001A
		WM_DEVMODECHANGE = &H001B
		WM_ACTIVATEAPP = &H001C
		WM_FONTCHANGE = &H001D
		WM_TIMECHANGE = &H001E
		WM_CANCELMODE = &H001F
		WM_SETCURSOR = &H0020
		WM_MOUSEACTIVATE = &H0021
		WM_CHILDACTIVATE = &H0022
		WM_QUEUESYNC = &H0023
		WM_GETMINMAXINFO = &H0024
		WM_PAINTICON = &H0026
		WM_ICONERASEBKGND = &H0027
		WM_NEXTDLGCTL = &H0028
		WM_SPOOLERSTATUS = &H002A
		WM_DRAWITEM = &H002B
		WM_MEASUREITEM = &H002C
		WM_DELETEITEM = &H002D
		WM_VKEYTOITEM = &H002E
		WM_CHARTOITEM = &H002F
		WM_SETFONT = &H0030
		WM_GETFONT = &H0031
		WM_SETHOTKEY = &H0032
		WM_GETHOTKEY = &H0033
		WM_QUERYDRAGICON = &H0037
		WM_COMPAREITEM = &H0039
		WM_GETOBJECT = &H003D
		WM_COMPACTING = &H0041
		WM_COMMNOTIFY = &H0044
		WM_WINDOWPOSCHANGING = &H0046
		WM_WINDOWPOSCHANGED = &H0047
		WM_POWER = &H0048
		WM_COPYDATA = &H004A
		WM_CANCELJOURNAL = &H004B
		WM_NOTIFY = &H004E
		WM_INPUTLANGCHANGEREQUEST = &H0050
		WM_INPUTLANGCHANGE = &H0051
		WM_TCARD = &H0052
		WM_HELP = &H0053
		WM_USERCHANGED = &H0054
		WM_NOTIFYFORMAT = &H0055
		WM_CONTEXTMENU = &H007B
		WM_STYLECHANGING = &H007C
		WM_STYLECHANGED = &H007D
		WM_DISPLAYCHANGE = &H007E
		WM_GETICON = &H007F
		WM_SETICON = &H0080
		WM_NCCREATE = &H0081
		WM_NCDESTROY = &H0082
		WM_NCCALCSIZE = &H0083
		WM_NCHITTEST = &H0084
		WM_NCPAINT = &H0085
		WM_NCACTIVATE = &H0086
		WM_GETDLGCODE = &H0087
		WM_SYNCPAINT = &H0088
		WM_NCMOUSEMOVE = &H00A0
		WM_NCLBUTTONDOWN = &H00A1
		WM_NCLBUTTONUP = &H00A2
		WM_NCLBUTTONDBLCLK = &H00A3
		WM_NCRBUTTONDOWN = &H00A4
		WM_NCRBUTTONUP = &H00A5
		WM_NCRBUTTONDBLCLK = &H00A6
		WM_NCMBUTTONDOWN = &H00A7
		WM_NCMBUTTONUP = &H00A8
		WM_NCMBUTTONDBLCLK = &H00A9
		WM_NCXBUTTONDOWN = &H00AB
		WM_NCXBUTTONUP = &H00AC
		WM_NCXBUTTONDBLCLK = &H00AD
		WM_KEYDOWN = &H0100
		WM_KEYUP = &H0101
		WM_CHAR = &H0102
		WM_DEADCHAR = &H0103
		WM_SYSKEYDOWN = &H0104
		WM_SYSKEYUP = &H0105
		WM_SYSCHAR = &H0106
		WM_SYSDEADCHAR = &H0107
		WM_KEYLAST = &H0108
		WM_IME_STARTCOMPOSITION = &H010D
		WM_IME_ENDCOMPOSITION = &H010E
		WM_IME_COMPOSITION = &H010F
		WM_IME_KEYLAST = &H010F
		WM_INITDIALOG = &H0110
		WM_COMMAND = &H0111
		WM_SYSCOMMAND = &H0112
		WM_TIMER = &H0113
		WM_HSCROLL = &H0114
		WM_VSCROLL = &H0115
		WM_INITMENU = &H0116
		WM_INITMENUPOPUP = &H0117
		WM_MENUSELECT = &H011F
		WM_MENUCHAR = &H0120
		WM_ENTERIDLE = &H0121
		WM_MENURBUTTONUP = &H0122
		WM_MENUDRAG = &H0123
		WM_MENUGETOBJECT = &H0124
		WM_UNINITMENUPOPUP = &H0125
		WM_MENUCOMMAND = &H0126
		WM_CTLCOLORMSGBOX = &H0132
		WM_CTLCOLOREDIT = &H0133
		WM_CTLCOLORLISTBOX = &H0134
		WM_CTLCOLORBTN = &H0135
		WM_CTLCOLORDLG = &H0136
		WM_CTLCOLORSCROLLBAR = &H0137
		WM_CTLCOLORSTATIC = &H0138
		WM_MOUSEMOVE = &H0200
		WM_LBUTTONDOWN = &H0201
		WM_LBUTTONUP = &H0202
		WM_LBUTTONDBLCLK = &H0203
		WM_RBUTTONDOWN = &H0204
		WM_RBUTTONUP = &H0205
		WM_RBUTTONDBLCLK = &H0206
		WM_MBUTTONDOWN = &H0207
		WM_MBUTTONUP = &H0208
		WM_MBUTTONDBLCLK = &H0209
		WM_MOUSEWHEEL = &H020A
		WM_XBUTTONDOWN = &H020B
		WM_XBUTTONUP = &H020C
		WM_XBUTTONDBLCLK = &H020D
		WM_PARENTNOTIFY = &H0210
		WM_ENTERMENULOOP = &H0211
		WM_EXITMENULOOP = &H0212
		WM_NEXTMENU = &H0213
		WM_SIZING = &H0214
		WM_CAPTURECHANGED = &H0215
		WM_MOVING = &H0216
		WM_DEVICECHANGE = &H0219
		WM_MDICREATE = &H0220
		WM_MDIDESTROY = &H0221
		WM_MDIACTIVATE = &H0222
		WM_MDIRESTORE = &H0223
		WM_MDINEXT = &H0224
		WM_MDIMAXIMIZE = &H0225
		WM_MDITILE = &H0226
		WM_MDICASCADE = &H0227
		WM_MDIICONARRANGE = &H0228
		WM_MDIGETACTIVE = &H0229
		WM_MDISETMENU = &H0230
		WM_ENTERSIZEMOVE = &H0231
		WM_EXITSIZEMOVE = &H0232
		WM_DROPFILES = &H0233
		WM_MDIREFRESHMENU = &H0234
		WM_IME_SETCONTEXT = &H0281
		WM_IME_NOTIFY = &H0282
		WM_IME_CONTROL = &H0283
		WM_IME_COMPOSITIONFULL = &H0284
		WM_IME_SELECT = &H0285
		WM_IME_CHAR = &H0286
		WM_IME_REQUEST = &H0288
		WM_IME_KEYDOWN = &H0290
		WM_IME_KEYUP = &H0291
		WM_MOUSEHOVER = &H02A1
		WM_MOUSELEAVE = &H02A3
		WM_CUT = &H0300
		WM_COPY = &H0301
		WM_PASTE = &H0302
		WM_CLEAR = &H0303
		WM_UNDO = &H0304
		WM_RENDERFORMAT = &H0305
		WM_RENDERALLFORMATS = &H0306
		WM_DESTROYCLIPBOARD = &H0307
		WM_DRAWCLIPBOARD = &H0308
		WM_PAINTCLIPBOARD = &H0309
		WM_VSCROLLCLIPBOARD = &H030A
		WM_SIZECLIPBOARD = &H030B
		WM_ASKCBFORMATNAME = &H030C
		WM_CHANGECBCHAIN = &H030D
		WM_HSCROLLCLIPBOARD = &H030E
		WM_QUERYNEWPALETTE = &H030F
		WM_PALETTEISCHANGING = &H0310
		WM_PALETTECHANGED = &H0311
		WM_HOTKEY = &H0312
		WM_PRINT = &H0317
		WM_PRINTCLIENT = &H0318
		WM_THEME_CHANGED = &H031A
		WM_HANDHELDFIRST = &H0358
		WM_HANDHELDLAST = &H035F
		WM_AFXFIRST = &H0360
		WM_AFXLAST = &H037F
		WM_PENWINFIRST = &H0380
		WM_PENWINLAST = &H038F
		WM_APP = &H8000
		WM_USER = &H0400
		WM_REFLECT = WM_USER + &H1c00
	End Enum
	#End Region

	#Region "SetWindowPosFlags"

	<Flags> _
	Friend Enum SetWindowPosFlags
		SWP_NOSIZE = &H0001
		SWP_NOMOVE = &H0002
		SWP_NOZORDER = &H0004
		SWP_NOREDRAW = &H0008
		SWP_NOACTIVATE = &H0010
		SWP_FRAMECHANGED = &H0020
		SWP_SHOWWINDOW = &H0040
		SWP_HIDEWINDOW = &H0080
		SWP_NOCOPYBITS = &H0100
		SWP_NOOWNERZORDER = &H0200
		SWP_NOSENDCHANGING = &H0400
		SWP_DRAWFRAME = &H0020
		SWP_NOREPOSITION = &H0200
		SWP_DEFERERASE = &H2000
		SWP_ASYNCWINDOWPOS = &H4000
	End Enum
	#End Region
End Namespace

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior)
United States United States
Decebal Mihailescu is a software engineer with interest in .Net, C# and C++.

Comments and Discussions