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

📄 mainfrm.cpp

📁 MFC Windows 程序设计源代码,有实用价值
💻 CPP
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "Colors.h"

#include "MainFrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_SETFOCUS()
	ON_WM_CREATE()
	//}}AFX_MSG_MAP
	ON_WM_MEASUREITEM ()
	ON_WM_DRAWITEM ()
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
}

CMainFrame::~CMainFrame()
{
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
	cs.lpszClass = AfxRegisterWndClass(0);
	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

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

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

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
void CMainFrame::OnSetFocus(CWnd* pOldWnd)
{
	// forward focus to the view window
	m_wndView.SetFocus();
}

BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
	// let the view have first crack at the command
	if (m_wndView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
		return TRUE;

	// otherwise, do default handling
	return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}


int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
		CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
	{
		TRACE0("Failed to create view window\n");
		return -1;
	}
	return 0;
}

//因为框架窗口使菜单的所有者,因此它接收自制菜单项产生的消息WM_MEASUREITEM和WM_DRAWITEM,于是消息处理程序在框架窗口类中

void CMainFrame::OnMeasureItem (int nIDCtl, LPMEASUREITEMSTRUCT lpmis)
{
    lpmis->itemWidth = ::GetSystemMetrics (SM_CYMENU) * 4;	//菜单项的宽度
    lpmis->itemHeight = ::GetSystemMetrics (SM_CYMENU);		//菜单项的高度
}

void CMainFrame::OnDrawItem (int nIDCtl, LPDRAWITEMSTRUCT lpdis)
{
	//创建一个空的CBitmap对象
    BITMAP bm;
    CBitmap bitmap;
    bitmap.LoadOEMBitmap (OBM_CHECK);		//把它初始化设置为Windows用来画菜单复选标记的位图
    bitmap.GetObject (sizeof (bm), &bm);	//把位图信息宽和高复制到BITMAP结构
											//在调用BitBlt时要用到存储在结构中bmWidth和bmHeight字段的宽度和高度

    CDC dc;									//构造一个空的CDC对象
    dc.Attach (lpdis->hDC);					//把DRAWITEMSTRUCT结构中提供的设备描述表句柄挂接到dc对象上
											//此时dc为一个有效的设备描述表对象

	//创建一个画刷
	//根据itemState字段中是否设置了ODS_SELECTED位,画刷的颜色或是COLOR_MENU,或是COLOR_HIGHLIGHT
	//而后通过指向画刷的指针调用CDC::FrameRect,画一个矩形作为菜单项的轮廓
    CBrush* pBrush = new CBrush (::GetSysColor ((lpdis->itemState &
        ODS_SELECTED) ? COLOR_HIGHLIGHT : COLOR_MENU));
    dc.FrameRect (&(lpdis->rcItem), pBrush);	//CDC::FrameRect用指定的画刷画一个线宽为一个像素的矩形
    delete pBrush;

	//如果ODS_SELECTED位被设定,则在菜单项旁边画一个复选标记
    if (lpdis->itemState & ODS_CHECKED) {
	//创建一个描述复选标记的位图并调用CDC::BitBlt把复选标记“位块传送”到屏幕上
        CDC dcMem;
        dcMem.CreateCompatibleDC (&dc);
        CBitmap* pOldBitmap = dcMem.SelectObject (&bitmap);
	//BitBlt将内存DC中的位图复制到屏幕DC中,由lpdis->rcItem描述的矩形的左端
    //当BitBlt返回时,在内存DC中清除位图,以便在dcMem失效时清除内存DC
        dc.BitBlt (lpdis->rcItem.left + 4, lpdis->rcItem.top +
            (((lpdis->rcItem.bottom - lpdis->rcItem.top) -
            bm.bmHeight) / 2), bm.bmWidth, bm.bmHeight, &dcMem,
            0, 0, SRCCOPY);

        dcMem.SelectObject (pOldBitmap);
    }

	//传递给FillRect的画刷颜色是由lpdis->itemID中的菜单项ID减去ID_COLOR_RED并把结果作为视图对象的m_clrColors数组中的索引
	UINT itemID = lpdis->itemID & 0xFFFF; // Fix for Win95/98 bug
    pBrush = new CBrush (m_wndView.m_clrColors[itemID - ID_COLOR_RED]);
    CRect rect = lpdis->rcItem;
    rect.DeflateRect (6, 4);
    rect.left += bm.bmWidth;
    dc.FillRect (rect, pBrush);
    delete pBrush;

    dc.Detach ();							//在OnDrawItem结束之前必须清除选入设备描述表的对象,并消除对
											//设备描述表状态的改变
}

⌨️ 快捷键说明

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