MFC(一)

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开头 全局函数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值