MFC implements a convenient feature called a most recently used list, or MRU.
In SDI and MDI apps generated by AppWizard, the MRU list appears on the
File menu. However, another handy place where MRUs are used is in comboboxes.
For example, the Start/Run dialog lists the last few programs that you’ve run
in its combobox.
While MFC does not directly support placing an MRU in a combobox, the
class CRecentFileList (which implements the File menu MRU list) provides
several member functions for maintining, saving, and loading an MRU list.
My CMRUComboBox class encapsulates this functionality, and adds the logic
necessary to put the MRU in a combobox.
CMRUComboBox was written with MSVC 5.0 and MFC 4.2 Although I have not
personally tested it in a Unicode app, it should compile and run with no
problems, since the code uses CStrings and LPCTSTRs.
Using an MRU combobox
To use CMRUComboBox, create a combobox control with the CBS_DROPDOWN style.
Including CBS_AUTOHSCROLL also is not a bad idea. Use ClassWizard to add a
member variable of type CComboBox that is hooked to a combobox control. Then,
go to the source and change the type of the variable to CMRUComboBox.
CMRUComboBox derives from CComboBox so all the operations you normally do with
CComboBoxes will still work the same; CMRUComboBox just adds new methods for
managing the MRU list.
In your OnInitDialog() (or other initialization code), you will need
to set up a few parameters and flags for the MRU list. At minimum, set
the maximum size for the MRU list, and the location in the registry (or INI
file) where the list will be saved. There are also a few flags you can
optionally set, which are described in the HTML documentation that is in
the ZIP file that contains the source code.
Once all that initialization is done, call LoadMRU() to read in the
saved contents of the MRU list. When you want to add a string to the list,
call AddToMRU(). Duplicate strings are automatically brought to the top
of the list, just as in File menu MRU lists. When you want to save the
contents of the MRU, call SaveMRU().
This is a list of all the new methods available for maintaining an MRU.
The full docs are included in the ZIP file that contains the source code
BOOL AddToMRU ( LPCTSTR szNewItem ) void EmptyMRU() int SetMaxMRUSize ( int nMaxSize ) int GetMaxMRUSize() void SetMRURegKey ( LPCTSTR szRegKey ) const CString& GetMRURegKey() BOOL SetMRUValueFormat ( LPCTSTR szValueFormat ) const CString& GetMRUValueFormat() BOOL LoadMRU() BOOL SaveMRU() void RefreshCtrl() BOOL SetAutoRefreshAfterAdd ( BOOL bAutoSave ) BOOL SetAutoSaveAfterAdd ( BOOL bAutoSave ) BOOL SetAutoSaveOnDestroy ( BOOL bAutoSave )
Here is a sample usage of CMRUComboBox. Suppose you have a Find dialog
and you want to list the last few search strings (similar to how MSVC does
it). Once you’ve created a CMRUComboBox member variable in your dialog
class as described above, you would do the following in your OnInitDialog()
m_combo.SetMRURegKey ( _T("Find Dlg MRU") ); m_combo.SetMRUValueFormat ( _T("String%d") ); m_combo.SetMaxMRUSize ( 12 ); VERIFY ( m_combo.LoadMRU() );
Then, whenever you want to add a string to the MRU, call
m_combo.AddToMRU ( szSearchString );