MFC/QT 学习笔记(二)——MFC入门

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

//实践

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

程序执行流程:

    • 实例化应用程序对象(有且只有一个)
    • 执行程序入口函数 InitInstance
    • 给框架类MyFrame对象动态分配空间(自动调用他的构造函数),在其构造函数内部,通过CWnd::Create 创建窗口
    • 框架类对象显示窗口 CWnd::ShowWindow
    • 框架类对象更新窗口 CWnd::UpdateWindow
    • 保存框架类对象指针 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();

猜你喜欢

转载自www.cnblogs.com/CowryGao/p/12339979.html
MFC