Here's a quick article that shows how you can add
the handy auto-completion effect that you see in the
Win2K file-open dialog for your own edits and combo
boxes - without having to download the entire Platform
SDK (9 hours on a 56K modem!). If you already have the
Platform SDK, this article is probably useless to you.
I'm not providing any demo project here, the code is
small enough that you can just copy and paste (one function!).
These would be defined in the Platform SDK, but since
we're not using that, I'll include these here.
You'll have to copy these to your app.
#define SHACF_DEFAULT 0x00000000
#define SHACF_FILESYSTEM 0x00000001
#define SHACF_URLALL (SHACF_URLHISTORY | SHACF_URLMRU)
#define SHACF_URLHISTORY 0x00000002
#define SHACF_URLMRU 0x00000004
#define SHACF_USETAB 0x00000008
#define SHACF_FILESYS_ONLY 0x00000010
#define SHACF_AUTOSUGGEST_FORCE_ON 0x10000000
#define SHACF_AUTOSUGGEST_FORCE_OFF 0x20000000
#define SHACF_AUTOAPPEND_FORCE_ON 0x40000000
#define SHACF_AUTOAPPEND_FORCE_OFF 0x80000000
The simple wrapper function
typedef HRESULT (WINAPI *SHAUTOCOMPLETEFN)
(HWND hTarget, DWORD dwFlags);
static HINSTANCE hSHLWAPIDLL = NULL;
bool SetupForAutoComplete(HWND hTarget, DWORD dwFlags)
if (hTarget == NULL)
bool ok = false;
if (hSHLWAPIDLL == NULL)
if (hSHLWAPIDLL== NULL)
SHAUTOCOMPLETEFN pSHAC =
if (pSHAC != NULL)
ok = SUCCEEDED(pSHAC(hTarget, dwFlags));
First, make sure you've called
InitInstance. Without this, the call to
SHAutoComplete will fail. You also need to call
CoUninitialize(); in your
This initializes COM for your app.
I'd also recommend that you call
CWinApp::ExitInstance(), just to be nice to the OS.
Now the good stuff
If you have an an edit control in your dialog class
that's hooked up to a member variable, all you have to do is:
And that's it. Now, when you start typing a path,
the edit control will drop down a list box with paths that
match what you've typed so far - just like the file open dialog.
If you want to do this to a combo box,
it's slightly more complicated:
CEdit * pMyEdit = (CEdit *)m_myCombo.GetDlgItem(1001);
And that's that.
The heart of this whole thing is
This is a function that lives in Shlwapi.DLL and is
only available on Win2K or on machines with IE 5.0
or higher installed. But, you can safely call my
SetupForAutoComplete function on machines that don't
meet those requirements because the function checks for
the DLL and then for the particular function. If neither
are there, the function leaves gracefully.
SHAutoComplete can do more than file system auto-complete.
It can also do URL auto-complete (like the navigation
bar in IE), and it can do it all with various other fun
options. See the MSDN for
SHAutoComplete for a full
description of what these options are.
And that's that. Enjoy responsibly. Oh yeah,
thanks Michael Dunn,
for your invaluable input :)