MFC以C++形式封装了Windows API

 

//实践

编写MFC需要的头文件#include <afxwin.h>

 

程序执行流程:

1.实例化应用程序对象(有且只有一个)

2.执行程序入口函数 InitInstance

3.给框架类MyFrame对象动态分配空间(自动调用他的构造函数),在其构造函数内部,通过CWnd::Create 创建窗口

4.框架类对象显示窗口 CWnd::ShowWindow

5.框架类对象更新窗口 CWnd::UpdateWindow

6.保存框架类对象指针 CWinThread::m_pMainWnd

 

文件名:mfc.h

#include <afxwin.h>//mfc头文件

//应用程序类CWinApp,派生类
Class MyApp: public CWinApp{
    public:
        virtual BOOL InitInstance(); //基类的虚函数,派生类只是重写,MFC程序的入口地址
};

//框架类CFrameWnd ,派生类MyFrame
Class MyFrame: public CFrameWnd{
    public:
        MyFrame();//构造函数
        DECLARE_MESSAGE_MAP()//消息映射宏,声明必须用在类声明中,即 .h 文件中
        afx_msg void OnLButtonDown(UINT,CPoint)//鼠标声明,value
        afx_msg void OnChar(UINT,UINT,UINT)//键盘声明
        afx_msg void OnPaint()//绘画
};

 

文件名:mfc.cpp

#include "mfc.h"//对应类声明的头文件

MyApp app;//有且仅有一个全局的应用程序类对象

BOOL MyApp::InitInstance(){//程序入口地址
    MyFrame *frame=new MyFrame;//1.创建框架类对象

    frame->ShowWindow(SW_SHOWNORMAL);//2.显示窗口
    frame->UpdateWindow();//3.更新窗口

    m_pMainWnd=frame;//4.保存指向应用程序主窗口的指针,实现自动管理
    return TRUE;//初始化正常则返回true
}

//分界宏
BEGIN_MESSAGE_MAP(MyFrame,CFrameWnd)
    ON_WM_LBUTTONDOWN()//鼠标左键按下 key
    ON_WM_CHAR()//键盘按下
END_MESSAGE_MAP()

MyFrame::MyFrame(){
    Create(NULL,TEXT("mfc"));//创建窗口
}

void MyFrame::OnLButtonDwon(UNIT,CPoint point){//鼠标按下
/*
    TCHAR buf[1024];//TCHAR 是MFC中的字符数组
    wsprintf(buf,TEXT("x=%d,y=%d"),point.x,point.y);//转译
    MessageBox(buf);//区别于底层的MessageBox,MFC中实则是MessageBox method 在MSDN中可查
*/
    //mfc中的字符串 CString
    CString str;
    str.Format(TEXT("x=%d,,,y=%d"),point.x,point.y);//格式化
    MessageBox(str);
}

void MyFrame::OnChar(UNIT key,UNIT,UNIT){//键盘按下
    CString str;
    str.Format(TEXT("按下了 %c 键"),key);
    MessageBox(str);
}

void MyFrame::OnPaint(){//绘画
    CPaintDC dc(this);//this指定绘图设备
    //帮助文档,在CDC里找其他能画的图形
    dc.TextOutW(100,100,TEXT("为了部落"));
    dc.Ellipse(10,10,100,100);//画椭圆,两点锁定矩形内切圆
}

 

帮助文档:《VC++之MFC类库中文手册》。最上面是层次结构;最下面是消息映射宏。

查找Create要搜索 :CFrameWnd::Create

 

ps:右键项目->属性->常规->MFC的使用->在共享DLL中使用MFC

 

//理论

  • 消息映射机制

即将消息和成员函数互相关联的表,MFC中没有事件和信号桥的概念,只有每个消息映射一个函数

 ps:消息映射宏查找,在中文手册最下面。

 

声明宏:

DECLARE_MESSAGE_MAP()

分界宏:

BEGIN_MESSAGE_MAP(MyFrame,CFrameWnd)

END_MESSAGE_MAP()

 

程序执行流程:

    • 声明宏 写到 .h 中
    • 分界宏 写到 .cpp 中
    • 找消息宏 写到 分界宏 中
    • 把函数原型声明 写到 .h 中
    • 函数实现 写到 .cpp 中

 

  • windows 字符集 

MessageBox(TEXT(“aaa”));

 

TEXT 自适应编码转换(即,定义里可定制多字节和宽字节):

右键项目->属性->常规->字符集->使用多字节字符集/使用Unicode字符集

Ps:TCHAR 也有自适应编码转换

  

“aaa”   多字节:一个字符对应一个字节

L“aaa” 宽字节:一个字符对应多个字节 Unicode:UTF-8 3个;GBK 2个;

 

多字节转为宽字节:MessageBox(L “aaa”);

 

//统计字符串长度

int num=0;

char *p="aaa";
num=strlen(p);

wchar_t *p2="bbbb";
num=wcslen(p2);

 

//char* 与 CString 之间的转换

C++ string 与 MFC CString 不可直接转换,要通过 char * .c_str();

//char*->CString
char *p3="ccc";
CString str=CString(p3);

//CString->char*
CStringA tmp=str;
char *pp=tmp.GetBuffer();

 

posted on 2020-02-21 01:21  CowryGao  阅读(735)  评论(0编辑  收藏  举报