MFC Quick Start Guide (Part 7): File Browser


  1. Add an edit box to your dialog


    (Fig. 7.1: Edit Box)
  2. Rename its ID to "IDC_PATHNAME"


    (Fig. 7.2: Edit Box ID)
  3. Add an button next to the edit box


    (Fig. 7.3: Button)
  4. Change the caption to "Edit"

    (Fig. 7.4: Edit Button Caption)
  5. Double click the button, this function  should be generated in MFC101Dlg.cpp

    (Fig. 7.5: Function "OnBnClickedEdit()")
  6. Add the following code:

    char caInput[256];
        ((CEdit*)GetDlgItem(IDC_PATHNAME))->GetWindowText(LPTSTR(caInput), 256);
        ShellExecute(NULL, _T("open"), _T("C:\\WINDOWS\\system32\\notepad.exe"), _T(caInput), _T(""), SW_SHOWNORMAL);
    


    (Fig. 7.6: Code)
  7. Let's try it out for a bit, compile the program and build it.
    • I had created a text file called "mail.txt" in my C drive
    • So I entered "C:\mail.txt" inside the edit box

      (Fig. 7.7: Text File Path)
    • Then click the the "Edit" button
    • Here's the result

      (Fig. 7.8: Result)
  8. Create another button and rename the caption of which to "Load"

    (Fig. 7.9: Load Button)
  9. Change the ID of the button to "IDC_LOAD"

    (Fig. 7.10: Load Button ID)
  10. Double click the button  and this function should be generated in MDC101Dlg.cpp

    (Fig. 7.11; Function "OnBnClickedLoad()")
  11. Add the following segment of code:

        TCHAR szFilters[] = _T("Text Document (*.txt)|*.txt|All Files (*.*)|*.*||");
    
        // Create an Open dialog; the default file name extension is ".my". (it's also changed to ".txt")
        CFileDialog fileDlg(TRUE, _T("txt"), _T("*.txt"),
            OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilters);
    
        // Display the file dialog. When user clicks OK, fileDlg.DoModal()  
        // returns IDOK. 
        if (fileDlg.DoModal() == IDOK)
        {
            std::string sPathName = fileDlg.GetPathName();
    
            // Implement opening and reading file in here. 
    
            //Change the window's title to the opened file's title.
            std::string sFileName = fileDlg.GetFileTitle();
    
            //SetWindowText(sFileName.c_str());
    
            ((CEdit*)GetDlgItem(IDC_PATHNAME))->SetWindowText(sPathName.c_str());
        }
    


    (Fig. 7.12; Code)
  12. Let's try it our again.
    • Compile the program and run it
    • Click the "Load" button and the file browser should appear

      (Fig. 7.13; File Browser)
    • I chose the ReadMe.txt in Fig. 7.13 and the path of the file was shown in the edit box

      (Fig. 7.14: Path)
    • Click the "Edit" button, the text file should be opened

      (Fig. 7.15: Result)

For your reference, here is the code of MFC101Dlg.h and MFC101Dlg.cpp

MFC101Dlg.h

// MFC101Dlg.h : header file
//

#pragma once
#include "afxcmn.h"


// CMFC101Dlg dialog
class CMFC101Dlg : public CDialogEx
{
// Construction
public:
    CMFC101Dlg(CWnd* pParent = NULL);   // standard constructor

// Dialog Data
    enum { IDD = IDD_MFC101_DIALOG };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support


// Implementation
protected:
    HICON m_hIcon;
    CToolTipCtrl m_ToolTip;

    // Generated message map functions
    virtual BOOL OnInitDialog();
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()
private:
    int     m_nNumberCount;
    CString m_sNumberCount;
    int     m_nRedVal;
    int     m_nGreenVal;
    int     m_nBlueVal;
public:
    afx_msg void OnBnClickedButton1();
    afx_msg void OnBnClickedButton2();
    afx_msg void OnBnClickedButton3();
    afx_msg void OnEnChangeRedEdit();
    afx_msg void OnEnChangeGreenEdit();
    afx_msg void OnEnChangeBlueEdit();
    afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
    afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
    virtual BOOL PreTranslateMessage(MSG* pMsg);
private:
    CString m_RedSliderEcho;
    CString m_GreenSliderEcho;
    CString m_BlueSliderEcho;
    CSliderCtrl m_RedSliderCtrl;
    CSliderCtrl m_GreenSliderCtrl;
    CSliderCtrl m_BlueSliderCtrl;
    CBrush      m_TextBoxBrush;

public:
    
    afx_msg void OnBnClickedEdit();
    afx_msg void OnBnClickedLoad();
};


MFC101Dlg.cpp

// MFC101Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "MFC101.h"
#include "MFC101Dlg.h"
#include "afxdialogex.h"
#include <string>

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CMFC101Dlg dialog



CMFC101Dlg::CMFC101Dlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CMFC101Dlg::IDD, pParent)
    , m_sNumberCount(_T(""))
    , m_RedSliderEcho(_T(""))
    , m_GreenSliderEcho(_T(""))
    , m_BlueSliderEcho(_T(""))
    , m_nRedVal(0)
    , m_nGreenVal(0)
    , m_nBlueVal(0)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMFC101Dlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_TEXT_AREA, m_sNumberCount);
    DDX_Text(pDX, IDC_RED_EDIT, m_RedSliderEcho);
    DDX_Text(pDX, IDC_GREEN_EDIT, m_GreenSliderEcho);
    DDX_Text(pDX, IDC_BLUE_EDIT, m_BlueSliderEcho);
    DDX_Control(pDX, IDC_RED_SLIDER, m_RedSliderCtrl);
    DDX_Control(pDX, IDC_GREEN_SLIDER, m_GreenSliderCtrl);
    DDX_Control(pDX, IDC_BLUE_SLIDER, m_BlueSliderCtrl);
}

BEGIN_MESSAGE_MAP(CMFC101Dlg, CDialogEx)
    ON_WM_HSCROLL()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_BUTTON1, &CMFC101Dlg::OnBnClickedButton1)
    ON_BN_CLICKED(IDC_BUTTON2, &CMFC101Dlg::OnBnClickedButton2)
    ON_BN_CLICKED(IDC_BUTTON3, &CMFC101Dlg::OnBnClickedButton3)
    ON_EN_CHANGE(IDC_RED_EDIT, &CMFC101Dlg::OnEnChangeRedEdit)
    ON_EN_CHANGE(IDC_GREEN_EDIT, &CMFC101Dlg::OnEnChangeGreenEdit)
    ON_EN_CHANGE(IDC_BLUE_EDIT, &CMFC101Dlg::OnEnChangeBlueEdit)
    ON_WM_CTLCOLOR()
    ON_BN_CLICKED(IDC_EDIT, &CMFC101Dlg::OnBnClickedEdit)
    ON_BN_CLICKED(IDC_LOAD, &CMFC101Dlg::OnBnClickedLoad)
END_MESSAGE_MAP()


// CMFC101Dlg message handlers

BOOL CMFC101Dlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);         // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon

    // TODO: Add extra initialization here
    m_nNumberCount = 0;
    //m_nRedVal = 0;
    //m_nGreenVal = 0;
    //m_nBlueVal = 0;

    CSpinButtonCtrl* pSpinColorCtrl = (CSpinButtonCtrl*)GetDlgItem(IDC_RED_SPIN);
    pSpinColorCtrl->SetRange(0, 255);
    pSpinColorCtrl->SetBuddy((CEdit *)GetDlgItem(IDC_RED_EDIT));
    pSpinColorCtrl->SetPos(m_nRedVal);

    UDACCEL AccellValue;
    AccellValue.nInc = 1;   // Set how many the value would increase/decrease when a button is clicked
    pSpinColorCtrl->SetAccel(1, &AccellValue);

    pSpinColorCtrl = (CSpinButtonCtrl*)GetDlgItem(IDC_GREEN_SPIN);
    pSpinColorCtrl->SetRange(0, 255);
    pSpinColorCtrl->SetBuddy((CEdit *)GetDlgItem(IDC_GREEN_EDIT));
    pSpinColorCtrl->SetPos(m_nGreenVal);

    AccellValue.nInc = 1;
    pSpinColorCtrl->SetAccel(1, &AccellValue);

    pSpinColorCtrl = (CSpinButtonCtrl*)GetDlgItem(IDC_BLUE_SPIN);
    pSpinColorCtrl->SetRange(0, 255);
    pSpinColorCtrl->SetBuddy((CEdit *)GetDlgItem(IDC_BLUE_EDIT));
    pSpinColorCtrl->SetPos(m_nBlueVal);

    AccellValue.nInc = 1;
    pSpinColorCtrl->SetAccel(1, &AccellValue);

    m_RedSliderCtrl.SetRange(0, 255, TRUE);
    m_RedSliderCtrl.SetPos(0);

    m_RedSliderEcho.Format(_T("%d"), 0);

    m_GreenSliderCtrl.SetRange(0, 255, TRUE);
    m_GreenSliderCtrl.SetPos(0);

    m_GreenSliderEcho.Format(_T("%d"), 0);

    m_BlueSliderCtrl.SetRange(0, 255, TRUE);
    m_BlueSliderCtrl.SetPos(0);

    m_BlueSliderEcho.Format(_T("%d"), 0);

    m_TextBoxBrush.CreateSolidBrush(RGB(m_nRedVal, m_nGreenVal, m_nBlueVal));

    if (!m_ToolTip.Create(this))
    {
        TRACE0("Unable to create the ToolTip!");
    }
    else
    {
        m_ToolTip.AddTool((CButton *) GetDlgItem (IDC_BUTTON1), 
            _T("Adjust the three bars to control the text background color."));

        m_ToolTip.Activate(TRUE);
    }


    return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CMFC101Dlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // device context for painting

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // Center icon in client rectangle
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // Draw the icon
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialogEx::OnPaint();
    }
}

// The system calls this function to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CMFC101Dlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}



void CMFC101Dlg::OnBnClickedButton1()
{
    // TODO: Add your control notification handler code here
    m_nNumberCount++;
    m_sNumberCount.Format(_T("%d"), m_nNumberCount);
    UpdateData(FALSE);
}


void CMFC101Dlg::OnBnClickedButton2()
{
    // TODO: Add your control notification handler code here
    m_nNumberCount = m_nNumberCount + 2;
    m_sNumberCount.Format(_T("%d"), m_nNumberCount);
    UpdateData(FALSE);
}


void CMFC101Dlg::OnBnClickedButton3()
{
    // TODO: Add your control notification handler code here
    m_nNumberCount = m_nNumberCount + 3;
    m_sNumberCount.Format(_T("%d"), m_nNumberCount);
    UpdateData(FALSE);
}


void CMFC101Dlg::OnEnChangeRedEdit()
{
    // TODO:  If this is a RICHEDIT control, the control will not
    // send this notification unless you override the CDialogEx::OnInitDialog()
    // function and call CRichEditCtrl().SetEventMask()
    // with the ENM_CHANGE flag ORed into the mask.

    // TODO:  Add your control notification handler code here
    char acStr[5] = "";
    CEdit* pRedBox = (CEdit *)GetDlgItem(IDC_RED_EDIT);
    pRedBox->GetWindowText(LPTSTR(acStr), 256);
    if (!(atoi((const char *)acStr)))
        pRedBox->SetWindowText(_T(""));
    else
    {
        if ((atoi((const char *)acStr)) > 255)
        {
            pRedBox->SetWindowText(_T("255"));
        }
        else if ((atoi((const char *)acStr)) < 0)
        {
            pRedBox->SetWindowText(_T("0"));
        }
        m_nRedVal = atoi((const char *)acStr);
    }
    m_RedSliderCtrl.SetPos(m_nRedVal);
    Invalidate();
}

void CMFC101Dlg::OnEnChangeGreenEdit()
{
    // TODO:  If this is a RICHEDIT control, the control will not
    // send this notification unless you override the CDialogEx::OnInitDialog()
    // function and call CRichEditCtrl().SetEventMask()
    // with the ENM_CHANGE flag ORed into the mask.

    // TODO:  Add your control notification handler code here
    char acStr[5] = "";
    CEdit* pGreenBox = (CEdit *)GetDlgItem(IDC_GREEN_EDIT);
    pGreenBox->GetWindowText(LPTSTR(acStr), 256);
    if (!(atoi((const char *)acStr)))
        pGreenBox->SetWindowText(_T(""));
    else
    {
        if ((atoi((const char *)acStr)) > 255)
        {
            pGreenBox->SetWindowText(_T("255"));
        }
        else if ((atoi((const char *)acStr)) < 0)
        {
            pGreenBox->SetWindowText(_T("0"));
        }
        m_nGreenVal = atoi((const char *)acStr);
    }
    m_GreenSliderCtrl.SetPos(m_nGreenVal);
    Invalidate();
}


void CMFC101Dlg::OnEnChangeBlueEdit()
{
    // TODO:  If this is a RICHEDIT control, the control will not
    // send this notification unless you override the CDialogEx::OnInitDialog()
    // function and call CRichEditCtrl().SetEventMask()
    // with the ENM_CHANGE flag ORed into the mask.

    // TODO:  Add your control notification handler code here
    char acStr[5] = "";
    CEdit* pBlueBox = (CEdit *)GetDlgItem(IDC_BLUE_EDIT);
    pBlueBox->GetWindowText(LPTSTR(acStr), 256);
    if (!(atoi((const char *)acStr)))
        pBlueBox->SetWindowText(_T(""));
    else
    {
        if ((atoi((const char *)acStr)) > 255)
        {
            pBlueBox->SetWindowText(_T("255"));
        }
        else if ((atoi((const char *)acStr)) < 0)
        {
            pBlueBox->SetWindowText(_T("0"));
        }
        m_nBlueVal = atoi((const char *)acStr);
    }
    m_BlueSliderCtrl.SetPos(m_nBlueVal);
    Invalidate();
}

void CMFC101Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    // TODO: Add your message handler code here and/or call default
    if ((pScrollBar == (CScrollBar *)&m_RedSliderCtrl) ||
        (pScrollBar == (CScrollBar *)&m_GreenSliderCtrl) ||
        (pScrollBar == (CScrollBar *)&m_BlueSliderCtrl))
    {
        int nIndex;
        nIndex = m_RedSliderCtrl.GetPos();
        m_RedSliderEcho.Format(_T("%d"), nIndex);

        m_nRedVal = nIndex;

        nIndex = m_GreenSliderCtrl.GetPos();
        m_GreenSliderEcho.Format(_T("%d"), nIndex);

        m_nGreenVal = nIndex;

        nIndex = m_BlueSliderCtrl.GetPos();
        m_BlueSliderEcho.Format(_T("%d"), nIndex);

        m_nBlueVal = nIndex;

        UpdateData(FALSE);
    }
    else
    {
        CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
    }
    Invalidate();
}

HBRUSH CMFC101Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    //// TODO:  Change any attributes of the DC here

    //// TODO:  Return a different brush if the default is not desired
    //return hbr;


    if (pWnd->GetDlgCtrlID() == IDC_TEXT_AREA)
    {
        pDC->SetTextColor(RGB(107, 78, 255));
        pDC->SetBkColor(RGB(m_nRedVal, m_nGreenVal, m_nBlueVal));
        hbr = m_TextBoxBrush;
    }
    return hbr;
}

BOOL CMFC101Dlg::PreTranslateMessage(MSG* pMsg)
{
    m_ToolTip.RelayEvent(pMsg);

    return CDialog::PreTranslateMessage(pMsg);
}

void CMFC101Dlg::OnBnClickedEdit()
{
    // TODO: Add your control notification handler code here
    char caInput[256];
    ((CEdit*)GetDlgItem(IDC_PATHNAME))->GetWindowText(LPTSTR(caInput), 256);
    ShellExecute(NULL, _T("open"), _T("C:\\WINDOWS\\system32\\notepad.exe"), _T(caInput), _T(""), SW_SHOWNORMAL);
}


void CMFC101Dlg::OnBnClickedLoad()
{
    // TODO: Add your control notification handler code here
    // szFilters is a text string that includes two file name filters: 
    // "*.my" for "MyType Files" (here they are changed to "*.txt")and "*.*' for "All Files."
    TCHAR szFilters[] = _T("Text Document (*.txt)|*.txt|All Files (*.*)|*.*||");

    // Create an Open dialog; the default file name extension is ".my". (it's also changed to ".txt")
    CFileDialog fileDlg(TRUE, _T("txt"), _T("*.txt"),
        OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilters);

    // Display the file dialog. When user clicks OK, fileDlg.DoModal()  
    // returns IDOK. 
    if (fileDlg.DoModal() == IDOK)
    {
        std::string sPathName = fileDlg.GetPathName();

        // Implement opening and reading file in here. 

        //Change the window's title to the opened file's title.
        std::string sFileName = fileDlg.GetFileTitle();

        //SetWindowText(sFileName.c_str());

        ((CEdit*)GetDlgItem(IDC_PATHNAME))->SetWindowText(sPathName.c_str());
    }
}


MFC Quick Start Guide (Part 7): File Browser MFC Quick Start Guide (Part 7): File Browser Reviewed by Kevin Lai on 10:33:00 AM Rating: 5

1 comment:

  1. The MFC Quick Start Guide (Part 7): File Browser offers a detailed look at integrating file browsing capabilities into your applications. This functionality can greatly enhance user interaction and navigation. Similarly, using BetterJoy can optimize your gaming experience by allowing you to connect your controllers seamlessly, making your setup even more enjoyable.

    ReplyDelete

Powered by Blogger.