(二)一个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 studio\2017\community\vc\tools\msvc\14.14.26428\atlmfc\include\afx.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

 

posted @ 2019-05-01 19:26  狂奔~  阅读(545)  评论(0编辑  收藏  举报