• (二)一个MFC程序,消息映射,纯代码


    1.应用程序类 CWinApp

    https://docs.microsoft.com/zh-cn/cpp/mfc/reference/cwinapp-class?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev15.query%3FappId%3DDev15IDEF1%26l%3DZH-CN%26k%3Dk(AFXWIN%2FCWinApp);k(CWinApp);k(DevLang-C%2B%2B);k(TargetOS-Windows)%26rd%3Dtrue&view=vs-2019

    CWinApp 类
    ‎     
    派生出 Windows 应用程序对象的基类

    2.框架类 CFrameWnd

    提供 Windows 单文档界面 (SDI) 重叠式或弹出框架窗口功能,并提供管理窗口的成员。

    class CFrameWnd : public CWnd

    错误

    1>------ 已启动生成: 项目: mfc, 配置: Debug Win32 ------
    1>mfc.cpp
    1>c:program files (x86)microsoft visual studio2017communityvc	oolsmsvc14.14.26428atlmfcincludeafx.h(24): fatal error C1189: #error:  Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]
    1>已完成生成项目“mfc.vcxproj”的操作 - 失败。
    ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

    解决:

    fatal error LNK1561: 必须定义入口点”解决方法 
    建立了一个空项目。
    添加了一个 Hello.cpp 和 Hello.h
    然后,编译的时候,报错:“fatal error LNK1561: 必须定义入口点”
    
    网上找了许久,发现一个解决方法。
    解决方案上,右键->属性->链接器->高级->入口点,设置成:WinMainCRTStartup  
    
    另一方法是:
    解决方案上,右键->属性->链接器->系统->子系统,下拉框选择:窗口 (/SUBSYSTEM:WINDOWS)

    1,有且只有一个全局应用程序类对象

    2,在程序入口函数实现功能 InitInstance()

      A,给框架类MyFrame 对象动态分配空间(自动调用它的构造函数)

        a,框架类MyFrame 对象构造函数里创建窗口 CWnd::Create

      B,框架类对象显示窗口 CWnd::ShowWindow

      C,框架类对象更新窗口 CWnd::UpdateWindow

      D,保存框架类对象指针 CWinThread::m_pMainWnd

    PostMessage 与 SendMessage

    https://blog.csdn.net/xiaodan007/article/details/7681031

    消息映射

    https://docs.microsoft.com/zh-cn/cpp/mfc/reference/message-map-macros-mfc?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev15.query%3FappId%3DDev15IDEF1%26l%3DZH-CN%26k%3Dk(AFXWIN%2FDECLARE_MESSAGE_MAP);k(DECLARE_MESSAGE_MAP);k(DevLang-C%2B%2B);k(TargetOS-Windows)%26rd%3Dtrue&view=vs-2019

    #include "mfc.h"
    
    // 有且只有一个全局的应用程序类对象
    MyApp myApp;
    
    BOOL MyApp::InitInstance()
    {
        /*
        1,创建框架类对象
        2,显示窗口
        3,更新窗口
        4,保存框架类对象指针
        */
        MyFrame *frame = new MyFrame;
    
        frame->ShowWindow(SW_SHOWNORMAL);// 显示窗口
        frame->UpdateWindow();// 更新窗口
        m_pMainWnd = frame; // 保存框架类对象指针
    
        return true;
    }
    
    // 定义消息宏
    BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
        ON_WM_LBUTTONDOWN()
    END_MESSAGE_MAP()
    
    MyFrame::MyFrame()
    {
        // CWnd 类的成员函数 CWnd::create
        // CFrameWnd 继承于 CWnd
        Create(NULL, TEXT("MFC")); // 调用以创建并初始化与关联的 Windows 框架窗口CFrameWnd对象。
    }
    
    void MyFrame::OnlButtonDown(UINT, CPoint)
    {
        // CWnd::MessageBox
        MessageBox(TEXT("鼠标左键"));
    }
    #pragma once
    
    #include <afxwin.h>
    
    //1.应用程序类 CWinApp,派生类(子类)
    class MyApp : public CWinApp
    {
    public:
        // 基类的虚函数
        // 派生类只是重写
        // MFC 程序入口地址
        virtual BOOL InitInstance();
    private:
    };
    
    //2.框架类 CFrameWnd, 派生类(子类)
    class MyFrame : public CFrameWnd
    {
    public:
        MyFrame();
        // 声明消息映射宏
        DECLARE_MESSAGE_MAP();
    
        afx_msg void OnlButtonDown(UINT,CPoint);
    private:
    };

    增加画图消息处理

    #include "mfc.h"
    
    // 有且只有一个全局的应用程序类对象
    MyApp myApp;
    
    BOOL MyApp::InitInstance()
    {
        /*
        1,创建框架类对象
        2,显示窗口
        3,更新窗口
        4,保存框架类对象指针
        */
        MyFrame *frame = new MyFrame;
    
        frame->ShowWindow(SW_SHOWNORMAL);// 显示窗口
        frame->UpdateWindow();// 更新窗口
        m_pMainWnd = frame; // 保存框架类对象指针
    
        return true;
    }
    
    // 定义消息宏
    BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
        ON_WM_LBUTTONDOWN()
        ON_WM_PAINT()
    END_MESSAGE_MAP()
    
    MyFrame::MyFrame()
    {
        // CWnd 类的成员函数 CWnd::create
        // CFrameWnd 继承于 CWnd
        Create(NULL, TEXT("MFC")); // 调用以创建并初始化与关联的 Windows 框架窗口CFrameWnd对象。
    }
    
    void MyFrame::OnlButtonDown(UINT, CPoint)
    {
        // CWnd::MessageBox
        MessageBox(TEXT("鼠标左键"));
    }
    
    void MyFrame::OnPaint()
    {
        CPaintDC cdc(this);
        cdc.TextOutA(100,100,TEXT("hello world"));
    }
    mfc.cpp
    #pragma once
    
    #include <afxwin.h>
    
    //1.应用程序类 CWinApp,派生类(子类)
    class MyApp : public CWinApp
    {
    public:
        // 基类的虚函数
        // 派生类只是重写
        // MFC 程序入口地址
        virtual BOOL InitInstance();
    private:
    };
    
    //2.框架类 CFrameWnd, 派生类(子类)
    class MyFrame : public CFrameWnd
    {
    public:
        MyFrame();
        // 声明消息映射宏
        DECLARE_MESSAGE_MAP()
    
        afx_msg void OnlButtonDown(UINT,CPoint);
        afx_msg void OnPaint();
    private:
    };
    mfc.h
  • 相关阅读:
    听闻 kubernetes,快速了解一番
    处理器 趣事 CPU/GPU/TPU/DPU/BPU
    记录
    硬盘
    图 总结 AI
    C# 加密、解密PDF文档(基于Spire.Cloud.SDK for .NET)
    Spire.Cloud 私有化部署教程(二)- Ubuntu 18.04 系统
    Spire.Cloud 私有化部署教程(一)
    C# 将PDF转为Word、Html、XPS、SVG、PCL、PS——基于Spire.Cloud.SDK for .NET
    C# 设置、删除、读取Word文档背景——基于Spire.Cloud.Word
  • 原文地址:https://www.cnblogs.com/xiangtingshen/p/10800501.html
Copyright © 2020-2023  润新知