⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainfrm.cpp

📁 《Visual C++ Bible》或者说是《Visual C++ 宝典》的对应的源码文件
💻 CPP
字号:
// mainfrm.cpp : implementation of the DMainFrame class
//

#include "stdafx.h"
#include "dialogs.h"

#include "extendlg.h"
#include "progress.h"
#include "mainfrm.h"

#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// DMainFrame

IMPLEMENT_DYNCREATE(DMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(DMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(DMainFrame)
	ON_WM_CREATE()
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
	ON_COMMAND(ID_FILE_TYPE, OnFileType)
	ON_COMMAND(ID_VIEW_SEARCHBAR, CmdViewSearchbar)
	ON_UPDATE_COMMAND_UI(ID_VIEW_SEARCHBAR, UpdViewSearchbar)
	ON_COMMAND(ID_VIEW_PROGRESS, CmdProgress)
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
    ON_COMMAND_EX(IDC_FORWARD, CmdSearchForward)
    ON_COMMAND_EX(IDC_BACK, CmdSearchBackward)
    ON_MESSAGE(PM_PROGRESS_CLOSING, MsgProgressClosing)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// arrays of IDs used to initialize control bars
	
// toolbar buttons - IDs are command buttons
static UINT BASED_CODE buttons[] =
{
	// same order as in the bitmap 'toolbar.bmp'
	ID_FILE_OPEN,
	ID_FILE_TYPE,
		ID_SEPARATOR,
	ID_VIEW_PROGRESS,
		ID_SEPARATOR,
	ID_APP_ABOUT,
};

static UINT BASED_CODE indicators[] =
{
	ID_SEPARATOR,           // status line indicator
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};

/////////////////////////////////////////////////////////////////////////////
// DMainFrame construction/destruction

DMainFrame::DMainFrame()
{
    d_pOpenFile  = 0;
    d_pExtDlg    = 0;
    d_pDialogBar = 0;
    d_bSearchBarVisible = TRUE;
    d_pdlgProgress = 0;
}

DMainFrame::~DMainFrame()
{
    // Delete file open object.
    if (d_pOpenFile)
        delete d_pOpenFile;

    // Delete file extensions object.
    if (d_pExtDlg)
        delete d_pExtDlg;

    // Delete dialog bar object.
    if (d_pDialogBar)
        delete d_pDialogBar;

    // Delete progress dialog box.
    if (d_pdlgProgress)
        delete d_pdlgProgress;
}

//-------------------------------------------------------------------
// WM_CREATE message handler.
int DMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
    // Create dialog bar object.
    d_pDialogBar = new CDialogBar();
    if (!d_pDialogBar)
        return -1;

    // Initialize dialog bar.
    d_pDialogBar->Create(this, IDD_SEARCHBAR, WS_CHILD | CBRS_TOP |
                         CBRS_TOOLTIPS | CBRS_FLYBY, ID_SEARCH_BAR);

    // Make dialog bar visible.
    d_pDialogBar->ShowWindow(SW_SHOWNORMAL);

    // Initialize tool bar.
	if (!m_wndToolBar.Create(this) ||
		!m_wndToolBar.LoadBitmap(IDR_MAINFRAME) ||
		!m_wndToolBar.SetButtons(buttons,
		  sizeof(buttons)/sizeof(UINT)))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}

    // Set bitmap button size.
    SIZE szButton = {42,38};
    SIZE szBitmap = {32,30};
    m_wndToolBar.SetSizes(szButton, szBitmap);

    // Initialize status bar.
	if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("Failed to create status bar\n");
		return -1;      // fail to create
	}

	// TODO: Delete these three lines if you don't 
	// want the toolbar to be dockable.
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndToolBar);

	// TODO: Remove this if you don't want tool tips
	m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
		CBRS_TOOLTIPS | CBRS_FLYBY);

    // Create File|Open... dialog object.
    d_pOpenFile = new CFileDialog (TRUE);
    if (!d_pOpenFile)
        return -1;

    // Create File|Type... dialog object.
    d_pExtDlg = new DExtensionDlg();
    if (!d_pExtDlg)
        return -1;

	return 0;
}

/////////////////////////////////////////////////////////////////////////////
// DMainFrame diagnostics

#ifdef _DEBUG
void DMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

void DMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// DMainFrame message handlers

//-------------------------------------------------------------------
// WM_COMMAND handler for File|Open... menu item.
void DMainFrame::OnFileOpen() 
{
    // Build list of file extensions.
    CStringList * psl = &d_pExtDlg->d_cslFileType;
    int nCount = psl->GetCount();
    ASSERT(((nCount/2)*2) == nCount);  // Must be even.
    CString csFilter;
    POSITION pos = psl->GetHeadPosition();
    while (pos != NULL)
    {
        csFilter += psl->GetNext(pos);
        csFilter += (TCHAR)'\0';
        csFilter += psl->GetNext(pos);
        csFilter += (TCHAR)'\0';
    }

    // Add all files selection.
    csFilter += _T("All Files (*.*)");
    csFilter += (TCHAR)'\0';
    csFilter += _T("*.*");
    csFilter += (TCHAR)'\0';

    // Assign string to OPENFILENAME member.
    d_pOpenFile->m_ofn.lpstrFilter = csFilter;

    // Display File.Open... dialog box.
    int iRet = d_pOpenFile->DoModal();

    // Ignore when user clicks [Cancel] button.    
    if (iRet != IDOK)
        return;

    // Fetch fully-qualified file name.
    CString csFile = d_pOpenFile->GetPathName();
    AfxMessageBox(csFile);
}

//-------------------------------------------------------------------
// WM_COMMAND handler for File|Type... menu item.
void DMainFrame::OnFileType() 
{
    d_pExtDlg->DoModal();
}

//-------------------------------------------------------------------
// WM_COMMAND handler for View|Search Bar menu item.
void DMainFrame::CmdViewSearchbar() 
{
    // Toggle visibility flag.
    d_bSearchBarVisible = (d_pDialogBar->GetStyle() & WS_VISIBLE);
    d_bSearchBarVisible = !d_bSearchBarVisible;

    // Show or hide dialog bar window.
    int nShow = (d_bSearchBarVisible) ? SW_SHOWNORMAL : SW_HIDE;
    d_pDialogBar->ShowWindow(nShow);

    // Reorganize all toolbars.
    RecalcLayout();
}

//-------------------------------------------------------------------
// CN_UPDATE_COMMAND_UI handler for View|Search Bar menu item.
void DMainFrame::UpdViewSearchbar(CCmdUI* pCmdUI) 
{
    int nCheck = (d_bSearchBarVisible) ? 1 : 0;
    pCmdUI->SetCheck(nCheck);
}

//-------------------------------------------------------------------
// WM_COMMAND handler for Clicking >> button on button bar.
BOOL DMainFrame::CmdSearchForward(UINT nID)
{
    // Fetch string from edit control.
    CEdit * pedSearch = 
            (CEdit *)d_pDialogBar->GetDlgItem(IDC_SEARCHTEXT);
    TCHAR   ach[MAX_LEN];
    pedSearch->GetWindowText(ach, MAX_LEN);

    // Format string and display in a message box.
    CString cs;
    cs.Format(_T("Searching forward for [%s]..."), ach);
    AfxMessageBox(cs);

    return TRUE;
}

//-------------------------------------------------------------------
// WM_COMMAND handler for Clicking << button on button bar.
BOOL DMainFrame::CmdSearchBackward(UINT nID)
{
    // Fetch string from edit control.
    CEdit * pedSearch =
            (CEdit *)d_pDialogBar->GetDlgItem(IDC_SEARCHTEXT);
    TCHAR   ach[MAX_LEN];
    pedSearch->GetWindowText(ach, MAX_LEN);

    // Format string and display in a message box.
    CString cs;
    cs.Format(_T("Searching backward for [%s]..."), ach);
    AfxMessageBox(cs);

    return TRUE;
}

//-------------------------------------------------------------------
// Handle WM_COMMAND message for View|Test Progress Bar...
void DMainFrame::CmdProgress() 
{
    // Start progress bar demo.
    if (!d_pdlgProgress)
    {
        d_pdlgProgress = new DProgress();
        d_pdlgProgress->Create(IDD_PROGRESS, this);
        SetTimer(1, 100, 0);
    }
    else
    {
        // Complain if user tries to start another demo.
        MessageBeep(MB_OK);
    }
}

//-------------------------------------------------------------------
// Handle WM_TIMER message for advancing progress bar.
void DMainFrame::OnTimer(UINT nIDEvent) 
{
    // Check for a valid object & valid window.
    if (d_pdlgProgress && ::IsWindow(d_pdlgProgress->m_hWnd))
    {
        // Increment by 5 percent each time.
        int nCount = d_pdlgProgress->GetPercent();
        nCount+=2;
        d_pdlgProgress->SetPercent(nCount);

        // When at or over 100%, we're done.
        if (nCount >= 100)
        {
            d_pdlgProgress->PostMessage(WM_KEYDOWN, VK_ESCAPE);
        }
    }
    else  // Destroy timer when valid object is gone.
    {
        KillTimer(1);
    }
}

//-------------------------------------------------------------------
// Handle PM_PROGRESS_CLOSING message.
LRESULT DMainFrame::MsgProgressClosing(WPARAM wParam, LPARAM lParam)
{
    // Clear our pointer to progress bar.
    if (d_pdlgProgress)
    {
        delete d_pdlgProgress;
        d_pdlgProgress = 0;
    }

    return (LRESULT)0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -