📄 mainfrm.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 + -