MFC:微软基础类库(Microsoft Foundation Classes) 在Windows平台做GUI(图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。)开发,MFC很好的选择 不仅要学习MFC还得学习它的框架设计思想。底层调用WinApi
- SDK:软件开发工具包(缩写:SDK、外语全称:Software Development Kit)一般都是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合。
- JDK:JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。
- IDE:集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。VS,QT
- API :应用程序接口
- WINAPI:windows平台下的系统调用。包含头文件windows.h,调用系统提供的特殊接口,得到系统资源
- 窗口:父窗口,子窗口。 客户区(里面的内容),非客户区(外边的框架)
- 句柄:结构体类型HANDLE,窗口句柄HWND,图标句柄HICON。和文件控制符那些差不多
- 消息队列:程序运行的时候,操作系统会同时创建消息队列,你点击鼠标或者键盘,操作系统捕获,会把消息放入到消息队列,死循环取出来给操作系统,操作系统调用处理函数处理(处理函数叫做窗口处理函数)
- WinMain函数:WINAPI的入口地址
消息处理
Windows编程模型
WinAPI窗口程序
- 定义一个入口函数WinMain()
- 创建一个窗口
a.设计窗口类WNDCLASS(给成员变量赋值)
b.注册窗口类
c.创建窗口类
d.显示更新窗口 - 消息循环
- 窗口过程函数
#include<windows.h>
//窗口过程函数
LRESULT CALLBACK DealMessage(HWND hWnd,//窗口句柄,消息所属的窗口
UINT uMsg, //消息标志
WPARAM wParam, //附加信息
LPARAM lParam)
{
switch (uMsg) {
case WM_LBUTTONDOWN://鼠标左键按下
MessageBox(hWnd, TEXT("ABC"), TEXT("鼠标左键按下"), MB_OK);
break;
case WM_PAINT:
{
PAINTSTRUCT ps;//绘图结构体
HDC dc = BeginPaint(hWnd, &ps);//开始
TCHAR *p = L"我爱你也";//转化宽字节
TextOut(dc, 1, 1, p, wcslen(p));
EndPaint(hWnd, &ps);//结束
break;
}
case WM_DESTROY:
PostQuitMessage(2); //WM_QUIT, 2给主函数return msg.wParam
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}
//WINAPI:修饰函数:规定函数参数入栈从右往左,函数调用完毕,自动清理
//CALLBACK
//int main(int argc,char *argv[])第一个参数代表传参个数,第二个把它放到指针数组
int WINAPI WinMain(HINSTANCE hInstance, //应用程序实例
HINSTANCE hPrevInstacne, //上一个应用程序实例,不用
LPSTR lpCmdLine, //long point string char* 命令行参数
int nCmdShow) //窗口显示的样式,最大化,最小化
{
/* 1. 定义一个入口函数WinMain()
2. 创建一个窗口
a.设计窗口类WNDCLASS(给成员变量赋值)
b.注册窗口类
c.创建窗口类
d.显示更新窗口
3. 消息循环
4. 窗口过程函数 */
//a.设计窗口类WNDCLASS(给成员变量赋值)
WNDCLASS wc;
wc.cbClsExtra = 0; // 类的附加信息
wc.cbWndExtra = 0; // 窗口附加信息
//获取系统默认的白色画刷
wc.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH) ;//背景色,必须写
//wc.hCursor = NULL;//光标 默认的写NULL
wc.hCursor = LoadCursor(NULL, IDC_HELP); //加载系统默认光标
//wc.hIcon = NULL;//默认图标
wc.hIcon = LoadIcon(NULL, IDI_WARNING);//加载默认图标
wc.hInstance = hInstance;//应用程序实例
wc.lpfnWndProc = DealMessage; //窗口过程函数名字,消息处理函数
wc.lpszClassName = TEXT("abc");//类的名字
wc.lpszMenuName = NULL;//菜单名字 不用为空
wc.style = nCmdShow;//显示风格
//b.注册窗口类,告诉系统窗口过程函数的入口地址
RegisterClass(&wc);
//c.创建窗口类
HWND hWnd=CreateWindow(TEXT("abc"), TEXT("hello,windows"), WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
//d.显示和更新窗口
ShowWindow(hWnd, nCmdShow);//也有参数,可以查阅MSDN LIBRARY
UpdateWindow(hWnd);
//消息循环
MSG msg;
//如果接受到WM_QUIT,返回0,退出
//如果出错,返回-1,不退出
while (GetMessage(&msg, NULL, 0, 0))
{
//翻译工作
//虚拟按键(键盘)转为标准字符WM_CHAR
TranslateMessage(&msg);
//给操作系统分发消息
DispatchMessage(&msg);
}
return msg.wParam;
}
MFC程序(纯代码)
- 应用程序类 CWinAPP
- 框架类 CFrameWnd
消息映射
1 所操作类中,声明消息映射宏 DECLARE_MESSAGE_MAP()
2. 对应.cpp 定义宏
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)//派生类 基类 BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)//派生类 基类
//消息映射入口标志
END_MESSAGE_MAP()
3.对应类中,消息处理函数的声明
4.对应.cpp消息处理函数的定义
mfc.h
#pragma once //防止头文件重复
#include<afxwin.h>
// 1. 应用程序类 CWinAPP
class MyApp :public CWinApp {
public:
//基类的虚函数
//派生类只是重写
//MFC程序的入口地址
virtual BOOL InitInstance();
};
// 2. 框架类 CFrameWnd,派生类
class MyFrame :public CFrameWnd {
public:
MyFrame();
//声明消息映射宏
DECLARE_MESSAGE_MAP()
afx_msg void OnLButtonDown(UINT, CPoint); //鼠标左键点击
afx_msg void OnPaint();//画画 cdc
};
mfc.cpp
#include"mfc.h"
//有且只有一个全局应用程序类对象
MyApp myApp;
//程序的入口地址,虚函数必须创建对象才调用
BOOL MyApp::InitInstance()
{
/*
1.创建框架类对象
2.显示窗口
3.更新窗口
4.保存框架类对象指针
*/
//1.创建框架类对象
MyFrame *frame = new MyFrame; //构造函数
//2.显示窗口
frame->ShowWindow(SW_SHOWNORMAL);
//3.更新窗口
frame->UpdateData();
//4.保存框架类对象指针
//修改属性MFC的使用为共享DDL
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"));
}
void MyFrame::OnLButtonDown(UINT, CPoint)
{
//CWnd:MessageBox
MessageBox(TEXT("点击鼠标左键"));
}
void MyFrame::OnPaint()
{
CPaintDC cdc(this);
cdc.TextOutW(100, 100, TEXT("画画啊啊"));
}
利用向导来创建
文档视图结构
- 文档:它是一个类,存储数据
- 视图:它是一个类,显示和修改数据
- 框架类:一个容器,这个容器装了视图
几个比较重要的函数几个比较重要的函数 几个比较重要的函数几个比较重要的函数
- 应用程序类CwinApp:
a. InitIstance(),程序的入口地址InitIstance(),程序的入口地址
- 框架类CFrameWnd:
a.PreCreateWindow()创建窗口之前的调用
b.OnCreate()创建窗口后,触发WM_CREATE,它是WM_CREATE消息的处理函数
- 视图类CView():
a.OnDraw():绘图 b.WM_PAINT消息处理函数OnPaint()内部调用OnDraw()
c.OnPaint()和OnDraw()同时存在,只有OnPaint()有效
事件的添加和删除
a.框架和视图的区别 选择所需类->右击->属性->消息- >WM_LBUTTONDOW->ADD 框架就相当于容器,容器放视图
视图相当于壁纸
字符集
ANSI 多字节,单字节 char p[]=“adasdas”; //一个字符一个字节
unicode 宽字节,一个字符两个字节 TCHAR *p=L"abc"; // 一个字符两个字节 wcslen ( p) ;//长度
MFC: TCHAR:自动适应字节(条件编译) TEXT();
扩展
afx_xxxxx:全局函数,不属于某个类特有的 xxxEx, xxxW, 扩展函数
类名函数名首字母大写
形参第二个英文单词首字母大写
成员对象m_大写英文单词首字母