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 为前缀的函数都是全局函数,可以在程序的任何地方调用他们。

posted @ 2021-01-22 16:38  Trying_only  阅读(203)  评论(0编辑  收藏  举报