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

  • 相关阅读:
    如何垂直居中一个浮动元素?
    微信小程序vant-search获取不到输入的搜索内容踩坑
    关于微信小程序无法使用css3过度属性transition以及微信小程序如何利用api进行画面过度的展示
    Spring Shedule Task之注解实现 (两次启动Schedule Task 的解决方案)
    学习站点记录
    Spring 通过配置文件注入 properties文件
    Liunx下安装jdk
    Mybatis使用generator自动生成映射配置文件信息
    Tomcat容器虚拟路径设置
    Spring init-method和destroy-method 的使用
  • 原文地址:https://www.cnblogs.com/lg804721251/p/14314096.html
Copyright © 2020-2023  润新知