一,文档视图结构
文档:它是一个类,这个类专门用来存储数据
视图:它是一个类,这个类专门用来显示和修改数据
框架类:一个容器,这个容器装了视图
健完工程之后,类视图:
运行一下:
几个比较重要的函数
1,视图类 CView
OnDraw(),绘图。
WM_PAINT,消息处理函数OnPaint()内部调用 OnDraw(),若两个函数同时存在只有 OnPaint 有效
// CMFCApplication1View 绘图 void CMFCApplication1View::OnDraw(CDC* pDC) { CMFCApplication1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: 在此处为本机数据添加绘制代码 pDC->TextOutW(100, 100, TEXT("hello")); }
2,应用程序类 CWinApp
InitInstance(),程序的入口地址
3,框架类 CFrameWnd
PreCreateWindow,创建窗口之前调用
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; // TODO: 在此处通过修改 // CREATESTRUCT cs 来修改窗口类或样式 cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU; return TRUE; }
OnCreate,创建窗口之后,触发 WM_CREATE,它是WM_CREATE的消息处理函数
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("未能创建工具栏 "); return -1; // 未能创建 } if (!m_wndStatusBar.Create(this)) { TRACE0("未能创建状态栏 "); return -1; // 未能创建 } m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)); // TODO: 如果不需要可停靠工具栏,则删除这三行 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); return 0; }
事件的添加和删除
1,验证框架和视图的区别
框架就相当于容器,容器放视图
视图相当于壁纸
如下在框架中添加鼠标左键消息处理,没有反应。
.c文件自动生成:
void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CFrameWnd::OnLButtonDown(nFlags, point); }
.h文件自动生成函数的声明
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_CREATE()
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()
// CMainFrame 消息处理程序 void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 MessageBox(_T("frame")); CFrameWnd::OnLButtonDown(nFlags, point); }
程序运行起来之后,左键没有反应。
同样在视图类中添加消息
// CMFCApplication1View 消息处理程序 void CMFCApplication1View::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 MessageBox(_T("View")); CView::OnLButtonDown(nFlags, point); }
添加WM_PAINT 消息处理,会屏蔽掉OnDraw()
BEGIN_MESSAGE_MAP(CMFCApplication1View, CView) // 标准打印命令 ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview) ON_WM_LBUTTONDOWN() ON_WM_PAINT() END_MESSAGE_MAP()
void CMFCApplication1View::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CView::OnPaint()
dc.TextOutW(100,100,_T("WM_PAINT"));
}
void CMFCApplication1View::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 //TCHAR buf[128] = { 0 }; //wsprintf(buf, TEXT("x = %d,y = %d"), point.x, point.y); CString buf; buf.Format(TEXT("x = %d,y = %d"), point.x, point.y); MessageBox(buf); CView::OnLButtonDown(nFlags, point); }
键盘事件
void CMFCApplication1View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: 在此添加消息处理程序代码和/或调用默认值 TCHAR ch = (TCHAR)nChar; CString str; str.Format(TEXT("%c"),ch); MessageBox(str); CView::OnChar(nChar, nRepCnt, nFlags); }