Introduction
The introduction of this article was: "Once developing a wizard application, I needed a dialog to select an icon from executables, but did not find anything about icon selection in MSDN. So I have searched CodeProject and found two articles on icon selection. The first solution, by PJ Naughter (article CIconDialog - Icon Selection Dialog), uses CDialog
derived class with template dialog resource to display icon selection dialog and handle its behavior, and the second, by Henk Devos (article How to display the Pick Icon Dialog), uses undocumented Windows API functions to show the system built-in icon selection dialog. I prefer to use the Windows API even if undocumented to dragging resources around, and so wrote a small class that wraps the APIs published by Henk Devos.".
But this is the 21st century now and even undocumented functions become documented. So finally, Microsoft included the function name we imported by ordinal 62 in the shell32.dll 5.0 exports. Its name is PickIconDlg
and only UNICODE version is available starting with Windows 2000. But for compatibility, we should import it by ordinal to use under Windows NT4.0, Windows 95/98 and Me and for using the ANSI version under Windows 2000 or later.
Sample Usage
The CIconDialog
is derived from CCommonDialog
and acts like any common dialog. See sample usage:
#ifndef __ICONDLG_H__
#include "IconDialog.h"
#endif
void CSomeDialog::OnSomeBtnClicked( void )
{
CIconDialog dlg( _T( "%SystemRoot%\\system32\\SHELL32.dll" ),
148, this );
if( dlg.DoModal() == IDOK )
{
HICON hIcon = dlg.GetIconHandle();
SetIcon( hIcon, FALSE );
}
}
See demo project source for more.
Class Members
Base Class
Data Members
m_szIconFile
- Specifies the icon file name m_dwIconIndex
- Specifies icon index m_hIconHandle
- Contains icon handle (last open) m_uIconCount
- Icon count in a file
Construction
Constructs a CIconDialog
object.
CIconDialog(LPCTSTR lpszIconFile = NULL, DWORD dwIconIndex = 0, CWnd* pParentWnd = NULL)
lpszIconFile
- The initial icon library whose icons should be open in the dialog dwIconIndex
- The icon index initially selected when the dialog opens pParentWnd
- A pointer to the file dialog-box object's parent or owner window
Operations
DoModal( void )
- Displays the dialog box and allows the user to make a selection GetIconHandle( void ) const
- Returns the handle of the last selected icon GetIconCount( void ) const
- Returns the icon count of the selected icon file GetIconIndex( void ) const
- Returns the index of the selected icon GetIconFile( void ) const
- Returns the full path of the selected icon file
Notes
This class compiles without any warning at level 4, and fully supports both ANSI and UNICODE.
Version Requirements
Finally, Microsoft included support for the API function this class uses in the shell32.dll 5.0 or later. So we have no problem of missing ordinal using this class under:
- Windows 2000 Pro/Server - NT 5.0.2195 with/out SP1/SP2/SP3/SP4
- Windows XP Professional - NT 5.1.2600 with/out SP1
- Windows 2003 Server - NT 5.2 - Standard/Enterprise/Datacenter/Web Edition
While importing by ordinal, this class was tested and ran properly under:
- Windows 95 OSR2 - 4.00.950B
- Windows 98 - 4.10.1998
- Windows 98 SE - 4.10.2222A ( Second Edition )
- Windows Me - 4.90.3000
- Windows NT 4.0 Workstation - NT 4.0.1381 with SP 6i
It was not tested (though expected to run properly) under:
- Windows 95 - 4.00.950
- Windows 95 SP1 - 4.00.950A
- Windows 95 OSR 2.5 - 4.00.950C
- Windows NT 4.0 Workstation - NT 4.0.1381 with SP1-SP5
- Windows NT 4.0 Server -NT 4.0.1381 with SP1-SP6i
If anyone tested it on the above mentioned versions of Windows, please post a reply.
Version History
- 27th March, 2002
- 4th November, 2002
- Added support for both MFC 6.0 and 7.0, some code changes
- 24th May, 2003
- Some code changes
- Added more detailed version support
- 29th March, 2004
- Added new
PickIconDlg
function information