1.名词解析 SDK 句柄
2.底层窗口实现
2.1头文件 windows .h
2.2 int WINAPI WinMain()
2.36个步骤
2.3.11 设计窗口 : WNDCLASS wc
2.3.22 注册窗口类
2.3.33 创建窗口
2.3.44 显示和更新
2.3.55 通过循环取消息
2.3.66 处理窗口过程
2.3.6.1处理关闭消息 WM_CLOSE destroyWindow
2.3.6.2WM_DESTROY postquitMessage
2.3.6.3鼠标左键
2.3.6.4键盘按下
2.3.6.5绘图
windows.c
#include <windows.h> //底层实现窗口头文件
// 6、处理消息(窗口过程)
// CALLBACK 代表 __stdcall 参数传递顺序 从右往左 依次入栈 ,并且在函数返回前自动清空 堆栈内容
LRESULT CALLBACK WindowProc(
HWND hwnd, //消息所属窗口句柄
UINT uMsg, // 具体消息名称 WM_XXX
WPARAM wParam, // 键盘附加消息
LPARAM lParam //鼠标附加消息
)
{
switch (uMsg)
{
case WM_CLOSE:
DestroyWindow(hwnd); //触发 WM_DESTROY 约定俗成一个事情: 函数名 xxxWindow消息,不会放到消息队列中,而是直接执行
break;
case WM_DESTROY:
PostQuitMessage(0); //发送退出消息
break;
case WM_LBUTTONDOWN: //鼠标左键按下消息
{
int xPos;
int yPos;
xPos = LOWORD(lParam);
yPos = HIWORD(lParam);
//打印操作 通常同MessageBox
TCHAR buf[1024];
wsprintf(buf, TEXT(" x = %d,y = %d"), xPos, yPos);
// 所属窗口 显示内容 标题内容 关联按键类型
MessageBox(hwnd, buf, TEXT("鼠标按下"), MB_OK);
}
break;
case WM_KEYDOWN: //键盘消息
MessageBox(hwnd, TEXT("键盘按下"), TEXT("键盘消息"), MB_OK);
break;
case WM_PAINT: //绘图消息
{
PAINTSTRUCT ps; //绘图结构体
HDC hdc = BeginPaint(hwnd, &ps);
//绘制文字
TextOut(hdc, 100, 100, TEXT("helloworld"), strlen("helloworld"));
EndPaint(hwnd, &ps);
}
break;
default:
break;
}
//默认方式处理
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
// WINAPI 代表 __stdcall 参数传递顺序 从右往左 依次入栈 ,并且在函数返回前自动清空 堆栈内容
// WinMain函数入口
int WINAPI WinMain(
HINSTANCE hInstance, // 应用程序实例句柄
HINSTANCE hPrevInstance, // 前一个应用程序实例句柄,在win32环境下,基本值NULL,不起作用
LPSTR lpCmdLine, // char * argv[] 命令行参数数组
int nShowCmd) // 窗口显示命令 最大化最小化..
{
//实现底层窗口 6步骤
// 1、设计窗口类
// 2、注册窗口类
// 3、创建窗口类
// 4、显示和更新窗口
// 5、通过循环取消息
// 6、处理消息(窗口过程)
//1、 设计窗口
WNDCLASS wc;
wc.cbClsExtra = 0; //类额外的内存 通常为0
wc.cbWndExtra = 0; //窗口额外的内存,通常为0
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //设置背景
wc.hCursor = LoadCursor(NULL, IDC_HAND);//设置光标 如果第一个参数为NULL,代表使用系统提供的默认光标
wc.hIcon = LoadIcon(NULL, IDI_WARNING); //设置图标 如果第一个参数为NULL,代表使用系统提供的默认图标
wc.hInstance = hInstance;//当前实例句柄,WinMain函数中形参即可
wc.lpfnWndProc = WindowProc; //窗口过程函数 回调函数 名称可以随机起
wc.lpszClassName = TEXT("WINDOW");//指定窗口类名
wc.lpszMenuName = NULL;//菜单名 没有填NULL
wc.style = 0; // 0代表默认风格
//2、 注册窗口类
RegisterClass(&wc);
//3、创建窗口
/*
lpClassName, 类名
lpWindowName, 窗口名
dwStyle, 显示风格 WS_OVERLAPPEDWINDOW
x, y,\ 创建窗口起始坐标 CW_USEDEFAULT
nWidth, nHeight, 创建窗口默认宽高 CW_USEDEFAULT
hWndParent, 父窗口 NULL
hMenu, 菜单 NULL
hInstance, 实例句柄 hInstance
lpParam 其他参数 NULL
*/
HWND hwnd = CreateWindow(wc.lpszClassName, TEXT("TEXT WINDOW"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
//4、 显示和更新
ShowWindow(hwnd, SW_SHOWNORMAL);
UpdateWindow(hwnd);
//5、通过循环取消息
/*
HWND hwnd; //主窗口
UINT message; //消息名称 WM_XXXX (WINDOW MESSAGE)
WPARAM wParam; // 附加消息 键盘
LPARAM lParam; // 附加消息 鼠标 左右键
DWORD time; // 消息产生时间
POINT pt; // 附加消息 鼠标 x y坐标
*/
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
/*
参数
_Out_ LPMSG lpMsg, 消息结构体
_In_opt_ HWND hWnd, NULL 捕获所有窗口消息
_In_ UINT wMsgFilterMin, 过滤最小消息数量
_In_ UINT wMsgFilterMax); 过滤最大消息数量 0 都写0 代表捕获所有消息
*/
//if (GetMessage(&msg, NULL, 0, 0) == FALSE)
//{
// break;
//}
//翻译消息
TranslateMessage(&msg);
//分发消息
DispatchMessage(&msg);
}
return 0;
}
3.MFC实现一个空窗口
3.1头文件 #include<afxwin.h>
3.2应用程序类 MyApp:public CWinApp
3.3有且仅有一个应用程序对象 MyApp app
3.4入口函数 BOOL InitInstance
3.5创建窗口
3.6窗口框架类 MyFrame:public CFrameWnd
3.7构造函数 Create(NULL,标题名)
3.8InitInstance 创建窗口
3.8.1MyFrame * frame = new MyFrame
3.8.2显示
3.8.3更新
3.8.4保存主窗口指针
3.8.5m_pMainWnd = frame
3.8.6return TRUE
3.9修改项目配置 DLL
mfc.h
#include <afxwin.h> //MFC需要包含的头文件
class MyApp :public CWinApp //CWinApp 应用程序类
{
public:
//MFC 程序入口
virtual BOOL InitInstance();
};
//窗口框架类
class MyFrame :public CFrameWnd
{
public:
MyFrame(); //窗口构造函数
//使用消息映射机制 必须引用声明宏
DECLARE_MESSAGE_MAP()
afx_msg void OnLButtonDown(UINT, CPoint); //鼠标左键按下声明
afx_msg void OnChar(UINT, UINT, UINT); // 键盘函数声明
afx_msg void OnPaint(); //绘图声明
};
mfc.cpp
#include "mfc.h"
MyApp app; //应用程序对象 ,有且仅有一个
BOOL MyApp::InitInstance()
{
//创建窗口
m_pMainWnd = new MyFrame;
//显示 和 更新
m_pMainWnd->ShowWindow(SW_SHOWNORMAL);
m_pMainWnd->UpdateWindow();
//m_pMainWnd = frame;//保存指向应用程序的主窗口的指针
return TRUE; //返回正常初始化
}
//消息映射的 分界宏
BEGIN_MESSAGE_MAP(MyFrame,CFrameWnd)
ON_WM_LBUTTONDOWN() //鼠标左键按下 宏
ON_WM_CHAR() //键盘宏
ON_WM_PAINT() //绘图宏
END_MESSAGE_MAP()
//窗口框架的默认构造函数
MyFrame::MyFrame()
{
Create(NULL, TEXT("MFC WINDOW"));
}
//鼠标左键按下 实现
void MyFrame::OnLButtonDown(UINT, CPoint point)
{
//TCHAR buf[1024];
//wsprintf(buf, TEXT("x = %d, y = %d"), point.x, point.y);
//MessageBox(buf);
CString str; //MFC使用的字符串
//格式化字符串
str.Format(TEXT(" :::::x = %d, y = %d"), point.x, point.y);
MessageBox(str);
}
//键盘实现
void MyFrame::OnChar(UINT key, UINT, UINT)
{
//TCHAR buf[1024];
//wsprintf(buf, TEXT("按下了%c"), key);
//MessageBox(buf);
CString str;
str.Format(TEXT("按下了%c 键"),key);
MessageBox(str);
}
void MyFrame::OnPaint()
{
CPaintDC dc(this); //画家 画到当前的窗口中
//画文字
dc.TextOutW(100, 100, TEXT("为了部落"));
dc.Ellipse(10, 10, 100, 100);
// 多字节 转 宽字节
//MessageBox(L"aaa");
MessageBox(TEXT("aaa"));
//TEXT TCHAR 自动编码转换
//统计宽字节字符串长度
char * p = "aaaa";
int n = 0;
n = strlen(p);
wchar_t * p2 = L"bbbb";
n = wcslen(p2);
//string 互相转换 char * .c_str()
//CString 和char * 互相转换
//char * -> CString
char * p3 = "aa";
CString str = CString(p3);
//CString -> char*
CString str2 = TEXT("abc");
CStringA tmp;
tmp = str2;
char * pp = tmp.GetBuffer();
MessageBox(CString(pp));
}
// Window字符集
// ANSI 1个字符 对应 1个字节 多字节
// 中文 韩文... 宽字节 1个字符对应多个字节 UniCode utf8 3个字节 gbk 2个字节
4.消息映射机制
4.1在.h中声明 声明宏
4.2.cpp中 分界宏
4.2.1Begin ( theClass ,BaseClass)
4.2.2End
4.3鼠标左键、键盘消息、绘图消息
4.4CString str format() 格式化字符串
4.5CPaintDC 查看其它画的图案 用CDC查找
5.Windows字符集介绍
5.1TEXT TCHAR 做自动编码转换
5.2多字节 转 宽字节 L
5.3统计宽字节长度 wcslen()
5.4CString 和char * 转换
5.4.1 char * -》CString 调用CString有参构造
5.4.2 CString - > char *
5.4.2.1CString s ;
5.4.2.2 CSringA tmp ; tmp = s
5.4.2.3tmp.getBuffer();
6.利用向导创建MFC
6.1单个文档 MFC标准
6.2生成4个类,用类视图看
6.3App InitInstance
6.4CMainFrame 框架类
6.5C…View 视类
6.6C…DOC 处理数据存储
6.7Create WM_CREATE OnCreate 之间联系
6.7.1Create 创建窗口 给系统发生 WM_CREATE消息
6.7.2OnCreate 响应WM_CREAT消息
6.8OnDraw 和OnPaint 关系
6.8.1如果同时存在 OnPaint会覆盖 OnDraw
6.9EX为结尾 都是扩展函数 Afx开头 全局函数