C++ MFC学习 (三)
视窗口覆盖在框架窗口之上
如果有了 OnDraw 不要再用OnPaint OnPaint会覆盖掉OnDraw所画内容
1 // MFC_Demo1View.cpp : CMFC_Demo1View 类的实现 2 // 3 4 #include "stdafx.h" 5 // SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的 6 // ATL 项目中进行定义,并允许与该项目共享文档代码。 7 #ifndef SHARED_HANDLERS 8 #include "MFC_Demo1.h" 9 #endif 10 11 #include "MFC_Demo1Doc.h" 12 #include "MFC_Demo1View.h" 13 14 #ifdef _DEBUG 15 #define new DEBUG_NEW 16 #endif 17 18 19 // CMFC_Demo1View 20 21 IMPLEMENT_DYNCREATE(CMFC_Demo1View, CView) 22 23 BEGIN_MESSAGE_MAP(CMFC_Demo1View, CView) 24 // 标准打印命令 25 ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint) 26 ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint) 27 ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview) 28 ON_WM_LBUTTONDOWN() 29 ON_WM_PAINT() 30 END_MESSAGE_MAP() 31 32 // CMFC_Demo1View 构造/析构 33 34 CMFC_Demo1View::CMFC_Demo1View() 35 { 36 // TODO: 在此处添加构造代码 37 38 } 39 40 CMFC_Demo1View::~CMFC_Demo1View() 41 { 42 } 43 44 BOOL CMFC_Demo1View::PreCreateWindow(CREATESTRUCT& cs) 45 { 46 // TODO: 在此处通过修改 47 // CREATESTRUCT cs 来修改窗口类或样式 48 49 return CView::PreCreateWindow(cs); 50 } 51 52 // CMFC_Demo1View 绘制 53 54 void CMFC_Demo1View::OnDraw(CDC* pDC) 55 { 56 CMFC_Demo1Doc* pDoc = GetDocument(); 57 ASSERT_VALID(pDoc); 58 if (!pDoc) 59 return; 60 61 // TODO: 在此处为本机数据添加绘制代码 62 pDC->TextOutW(100, 100, TEXT("HELLO")); 63 } 64 65 66 // CMFC_Demo1View 打印 67 68 BOOL CMFC_Demo1View::OnPreparePrinting(CPrintInfo* pInfo) 69 { 70 // 默认准备 71 return DoPreparePrinting(pInfo); 72 } 73 74 void CMFC_Demo1View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 75 { 76 // TODO: 添加额外的打印前进行的初始化过程 77 } 78 79 void CMFC_Demo1View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 80 { 81 // TODO: 添加打印后进行的清理过程 82 } 83 84 85 // CMFC_Demo1View 诊断 86 87 #ifdef _DEBUG 88 void CMFC_Demo1View::AssertValid() const 89 { 90 CView::AssertValid(); 91 } 92 93 void CMFC_Demo1View::Dump(CDumpContext& dc) const 94 { 95 CView::Dump(dc); 96 } 97 98 CMFC_Demo1Doc* CMFC_Demo1View::GetDocument() const // 非调试版本是内联的 99 { 100 ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFC_Demo1Doc))); 101 return (CMFC_Demo1Doc*)m_pDocument; 102 } 103 #endif //_DEBUG 104 105 106 // CMFC_Demo1View 消息处理程序 107 108 109 void CMFC_Demo1View::OnLButtonDown(UINT nFlags, CPoint point) 110 { 111 // TODO: 在此添加消息处理程序代码和/或调用默认值 112 113 CView::OnLButtonDown(nFlags, point); 114 CString str; 115 str.Format(TEXT("x = %d,y = %d"), point.x, point.y); 116 MessageBox(str); 117 } 118 119 //如果有了 OnDraw 不要再用OnPaint OnPaint会覆盖掉OnDraw所画内容 120 void CMFC_Demo1View::OnPaint() 121 { 122 CPaintDC dc(this); // device context for painting 123 // TODO: 在此处添加消息处理程序代码 124 // 不为绘图消息调用 CView::OnPaint() 125 dc.TextOutW(100, 100, TEXT("WORLD")); 126 127 }
可通过 类视图模式,在类属性中添加相应的消息响应
当框架调用CreateEx函数创建窗口时,会首先调用PreCreateWindow函数。
可通过修改传递给PreCreateWindow的结构体类型参数CREATESTRUCT,应用程序可以更改用于创建窗口的属性,在产生窗口之前有机会修改窗口的外观。
最后再调用CreateWindoweEx函数完成窗口的创建。
OnCreate是一个消息响应函数,是响应WM_CREATE 消息的一个函数,而WM_CREATE消息是由Create函数调用的,一个窗口创建(Create)之后,会向操作系统发送WM_CREATE消息,OnCreate函数主要是用响应此消息的。
OnCreate 与 Create 的区别
- Create 负责注册并产生窗口,像动态创建控件中的Create 一样,窗口创建之后会向操作系统发送WM_CREATE消息
- OnCreate 不产生窗口,只是在窗口显示前设置窗口的属性 如风格、位置等
- OnCreate 是消息WM_CREATE 的消息响应函数
拓展:
MFC中后缀为 Ex 的函数都市扩展函数
在MFC中,以 Afx 为前缀的函数都是全局函数,可以在程序的任何地方调用他们。