Wouldn’t it be nice to have drive, dir and file-boxes, as in VisualBasic, in MFC.
This project give you just that possibility. To use these list-boxes in your project
include FileList.h and FileList.cpp in your project and add the following code:
class CLBFileDlg : public CDialog
{
…
public:
// Dialog Data//{{AFX_VIRTUAL(CLBFileDlg)
protected:
…
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
…
//}}AFX_VIRTUAL
private:
…
//the three boxes in this example
CFileList m_cflDrive;
CFileList m_cflDir;
CFileList m_cflFile;
//user-defined message for communication between the boxes
//and dialog (msg is trapped in WindowProc)
UINT m_nBoxMsg;
…
};BOOL CLBFileDlg::OnInitDialog()
{
…
// TODO: Add extra initialization here
//register a personal, user-defined msg so that our boxes can post msg’s for
//interaction
m_nBoxMsg=RegisterWindowMessage(“Tom’s little box”);//init the boxes
//the definition of:
//BOOL InitBox(UINT res_from_template,
// CWnd *parent,
// LPSTR lpszPath,
// LPSTR lpszFileMask,
// UINT flags,
// UINT msg);m_cflDrive.InitBox(IDC_LIST_DRIVE, this, “c:\\”, “*.*”, DRIVES, m_nBoxMsg);
m_cflDir.InitBox(IDC_LIST_DIR, this, “c:\\”, “*.*”, DIRECTORIES, m_nBoxMsg);
m_cflFile.InitBox(IDC_LIST_FILE, this, “c:\\”, “*.*”, FILES, m_nBoxMsg);//in this example we’ll just display the selected file in a CStatic
m_clsSelection.InitSelect(IDC_SELECT, this);
…
}LRESULT CLBFileDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
…
//process the user-defined msg
if(message==m_nBoxMsg)
{
CString temp_string;//update the dir-box and file-box if we change drive
if(wParam==DRIVES)
{
m_cflDir.RefreshBox(m_cflDrive.getPath());
m_cflFile.RefreshBox(m_cflDrive.getPath());
}//update the file-box if we change directory
else if(wParam==DIRECTORIES)
{
m_cflFile.RefreshBox(m_cflDir.getPath());
}//for simplicity we’ll just show the selected file
//in the CStatic
else if(wParam==FILES)
{
m_cflFile.GetText(m_cflFile.GetCurSel(), temp_string);
m_clsSelection.SetWindowText(temp_string);
}
}
…
return CDialog::WindowProc(message, wParam, lParam);
}
Minor update:
Changes since v. 1.0
- improving update in FillBox(): no update untill the box is filled
- much faster draw
- declaring CheckEntry as inline and changing the argument
- moving FillBox over to private-sector
- improving OnDblclk():
if you use the dir-box a lot then the path may look like this
c:\inn\pics\..\html\..\..\windows\system\..\..\det.log
this a right and proper path but of course this one can
be much slimmer, like this:
c:\det.log
As far as I can see, all the updates are internal to FileList and
does not invalidate usage of this class. However since the header has
had an update, a recompile of the project is required.