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

📄 mainfrm.cpp

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

#include "stdafx.h"
#include "BaseMenu.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_WM_PAINT()
    ON_WM_RBUTTONDOWN()
    ON_COMMAND(ID_CONTEXT_MENU, OnContextMenu)
    ON_COMMAND(ID_FRAME_MINIMIZE, OnFrameMinimize)
    ON_COMMAND(ID_FRAME_TOP, OnFrameTop)
    ON_COMMAND(ID_MENU_APPEND, OnMenuAppend)
    ON_COMMAND(ID_MENU_CHECK, OnMenuCheck)
    ON_COMMAND(ID_MENU_ENABLE, OnMenuEnable)
    ON_COMMAND(ID_MENU_THIS, OnMenuThis)
    ON_UPDATE_COMMAND_UI(ID_MENU_THIS, OnUpdateMenuThis)
    ON_COMMAND(ID_TITLE_BYE, OnTitleBye)
    ON_COMMAND(ID_TITLE_HELLO, OnTitleHello)
    ON_COMMAND(ID_TITLE_QUERY, OnTitleQuery)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////
// arrays of IDs used to initialize control bars
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_bCheckState  = FALSE;  // Start menu item unchecked.
    d_bEnableState = TRUE;   // Start menu item enabled.
}

DMainFrame::~DMainFrame()
{
    // Delete CMenu context menu object.
    if (d_pmenuContext)
        delete d_pmenuContext;
}

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

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

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

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////
// DMainFrame helper functions

//-------------------------------------------------------------------
// Display context menu at indicated client area location.
void DMainFrame::ShowContextMenu(CPoint& point)
{
    // Convert client coordinate to screen coordinates.
    ClientToScreen(&point);

    // Display context menu at mouse location.
    CMenu * psubmenu = d_pmenuContext->GetSubMenu(0);
    psubmenu->TrackPopupMenu(TPM_LEFTALIGN  |  // Flags.
                             TPM_RIGHTBUTTON,
                             point.x,          // x-coord.
                             point.y,          // y-coord.
                             this);            // "this" window.
}

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

//-------------------------------------------------------------------
// WM_CREATE handler.
int DMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
    
    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
    }

    // Allocate CMenu for context menu.
    d_pmenuContext = new CMenu();
    if (!d_pmenuContext) return -1;

    // Initialize CMenu (connect WinAPI menu to CMenu).
    BOOL bSuccess = d_pmenuContext->LoadMenu(IDR_TITLE);
    if (!bSuccess) return -1;

    return 0;
}

//-------------------------------------------------------------------
// WM_PAINT handler.
void DMainFrame::OnPaint() 
{
    CPaintDC dc(this); // device context for painting
    
    // Calculate client area center point.
    int  x, y;
    RECT rClient;
    GetClientRect(&rClient);
    x = rClient.right  / 2;
    y = rClient.bottom / 2;

    // Calculate offset for centering text.
    CString cs = _T("<Right Mouse> or Shift+F10 for Context Menu");
    CSize cb = dc.GetTextExtent(cs, cs.GetLength());
    x -= cb.cx / 2;
    y -= cb.cy / 2;

    // Draw text.
    dc.TextOut(x, y, cs);

    
    // Do not call CFrameWnd::OnPaint() for painting messages
}

//-------------------------------------------------------------------
// WM_RBUTTONDOWN handler.
void DMainFrame::OnRButtonDown(UINT nFlags, CPoint point) 
{
    ShowContextMenu(point);
    
    CFrameWnd::OnRButtonDown(nFlags, point);
}

//-------------------------------------------------------------------
// WM_COMMAND handler for Shift+F10 --or-- Applications key.
void DMainFrame::OnContextMenu() 
{
    // Display context menu at top right corner of window.
    CPoint point(10,10);
    ShowContextMenu(point);
}

//-------------------------------------------------------------------
// WM_COMMAND handler for Frame|Minimize.
void DMainFrame::OnFrameMinimize() 
{
    // Send ourselves a system message to minimize.
    PostMessage(WM_SYSCOMMAND, SC_MINIMIZE);
}

//-------------------------------------------------------------------
// WM_COMMAND handler for Frame|Top Half Move.
void DMainFrame::OnFrameTop() 
{
    // Ask system for dimensions of screen.
    UINT cxWidth  = GetSystemMetrics(SM_CXSCREEN);
    UINT cyHeight = GetSystemMetrics(SM_CYSCREEN);

    // Calculate top half of screen.
    cyHeight /= 2;

    // Move window.
    MoveWindow(0, 0, cxWidth, cyHeight, TRUE);
}

//-------------------------------------------------------------------
// WM_COMMAND handler for Menu Item|Append Item.
void DMainFrame::OnMenuAppend() 
{
    // Fetch menu bar object.
    CMenu * pmMain = GetMenu();

    // Fetch submenu object using relative menu position.
    //    0      1       2        3
    // [Frame][Title][Menu Item][Help]
    CMenu * pmSub = pmMain->GetSubMenu(2);

    // Append new menu item.
    pmSub->AppendMenu (MF_STRING, ID_MENU_THIS, _T("&This Item"));
}

//-------------------------------------------------------------------
// WM_COMMAND handler for Menu Item|Check/Uncheck.
void DMainFrame::OnMenuCheck() 
{
    // Toggle menu check state.
    d_bCheckState = (!d_bCheckState);
}

//-------------------------------------------------------------------
// WM_COMMAND handler for Menu Item|Enable/Disable.
void DMainFrame::OnMenuEnable() 
{
    // Toggle menu enable state.
    d_bEnableState = (!d_bEnableState);
}

//-------------------------------------------------------------------
// WM_COMMAND handler for Menu Item|This Item.
void DMainFrame::OnMenuThis() 
{
    AfxMessageBox (_T("This menu item merely waits for other\n"
                      "menu items to change its check state\n"
                      "and its enable state."));
}

//-------------------------------------------------------------------
// CN_UPDATE_COMMAND_UI handler for Menu Item|This Item.
void DMainFrame::OnUpdateMenuThis(CCmdUI* pCmdUI) 
{
    pCmdUI->SetCheck(d_bCheckState);
    pCmdUI->Enable(d_bEnableState);
}

//-------------------------------------------------------------------
// WM_COMMAND handler for Title|Say Goodbye.
void DMainFrame::OnTitleBye() 
{
    SetWindowText(_T("BaseMenu - Goodbye from BaseMenu"));
}

//-------------------------------------------------------------------
// WM_COMMAND handler for Title|Say Hello.
void DMainFrame::OnTitleHello() 
{
    SetWindowText(_T("BaseMenu - Hello from BaseMenu"));
}

//-------------------------------------------------------------------
// WM_COMMAND handler for Title|Query Text.
void DMainFrame::OnTitleQuery() 
{
    TCHAR achTitle[100];
    GetWindowText (achTitle, 100);

    AfxMessageBox(achTitle);
}

⌨️ 快捷键说明

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