当前位置:   article > 正文

mfc 学习的第一天_mfcxk

mfcxk

mfc 学习的第一天

1 通过底层实现窗口
1.1 sdk api 句柄
1.2 消息处理机制
1.3 头文件 windows.h
1.4 程序入口 winMain

2 具体6个步骤
2.1 1、设计窗口 WNDCLASS wc
2.2 2、注册窗口 RegisterClass
2.3 3、创建窗口 createWindow
2.4 4、显示和更新 showWindhow updateWindow
2.5 5、通过循环取消息 MSG msg
2.5.1 写循环 while(1)
2.5.2 GetMessage==false 跳出循环
2.5.3 翻译消息
2.5.4 分发消息
2.6 6、窗口过程
2.6.1 LRESULT CALLBACK WindowProc
2.6.2 返回默认处理
2.6.3 return DefWindowProc(hwnd, uMsg, wParam, lParam);
2.6.4 点击叉子 WM_CLOSE destroy
2.6.5 WM_DESTROY postQuitMessage(0)
2.6.6 鼠标左键按下
2.6.7 键盘按下
2.6.8 绘图 文字

vs2013创建win32项目

步骤:文件→新建→项目→选择Win32项目,确定→下一步→勾上空项目,完成→源文件右键→添加→新建项→C++文件→名称为:windows.c→添加

小技巧:

安装番茄助手,提高编程效率。

注释/取消注释
1)注释:组合键“Ctrl+K+C”;
2)取消注释:组合键“Ctrl+K+U”

windows.c的源码

#include <Windows.h> //底层实现窗口	的头文件
#include <windowsx.h>  

 


//6、处理窗口过程


//CALLBACK 代表__stdcall参数的传递顺序:从右到左 一次入栈,并且在函数返回前 清空堆栈
LRESULT CALLBACK WindowProc(
	HWND   hwnd,   //消息所属的窗口句柄
	UINT   uMsg,   //具体的消息名称  WM_XXXX 消息名
	WPARAM wParam, //键盘附加消息
	LPARAM lParam  //鼠标附加消息
	)
{
	POINT pt; //定义坐标
	PAINTSTRUCT ps; //定义绘图结构体
	HDC	hdc; //定义设备上下文句柄 
	switch (uMsg)
	{
	case WM_CLOSE:
		//所以xxxWindow为结尾的方法,都不会进入到消息队列中,而是直接执行
		DestroyWindow(hwnd); //DestroyWindow  发送另一个消息 WM_DESTROY
		break;
	case WM_DESTROY:
		PostQuitMessage(0);  //真正的退出窗口 使 GetMessage(&msg,NULL,0,0) == FALSE
	case  WM_LBUTTONDOWN:  //鼠标左键按下
		pt.x = GET_X_LPARAM(lParam);  //GET_X_LPARAM 方法 需要加windowsx.h 头文件
		pt.y = GET_Y_LPARAM(lParam);

		wchar_t buf[1024];
		wsprintf(buf, TEXT("x = %d,y = %d"), pt.x, pt.y);

		MessageBox(hwnd, buf, TEXT("鼠标的左键按下"), MB_OK);
		break; 
	case WM_KEYDOWN:  //键盘
		MessageBox(hwnd, TEXT("键盘按下"), TEXT("键盘按下"), MB_OK);
		break;

	case WM_PAINT: //绘图
		//绘图结构体
		hdc = BeginPaint(hwnd, &ps);
		TextOut(hdc, 100, 100, TEXT("hello"), strlen("hello"));
		EndPaint(hwnd, &ps);

		break;
	default:
		break;
	}
	 
	//返回值用默认处理方式
	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

//程序入口函数

//WINAPI 代表__stdcall参数的传递顺序:从右到左 一次入栈,并且在函数返回前 清空堆栈
 int WINAPI WinMain(
	HINSTANCE hInstance,  //应用程序实例句柄
	HINSTANCE hPrevInstance,  //上一个应用程序句柄,在win32环境下,参数一般为NULL,不起作用了
	LPSTR lpCmdLine,   // char * argv[]
	int nShowCmd)    //显示命令  窗口 最大化、最小化、正常
{
	//1、设计窗口
	//2、注册窗口
	//3、创建窗口
	//4、显示和更新
	//5、通过循环取消息 
	//6、处理消息(窗口过程)


	 //1、设计窗口
	 WNDCLASS wc;
	 wc.cbClsExtra = 0; //类的额外的内存
	 wc.cbWndExtra = 0; //窗口额外的内存
	 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //设置背景
	 wc.hCursor = LoadCursorW(NULL,	IDC_HAND);  //设置光标 如果第一个参数为NULL,代表使用系统提供的光标
	 wc.hIcon = LoadIconW(NULL, IDI_ERROR); //图标 如果第一个参数为NULL,代表使用系统提供的图标
	 wc.hInstance = hInstance; //应用程序实例句柄  传入WinMain中的形参即可
	 wc.lpfnWndProc = WindowProc; //回调函数  窗口过程
	 wc.lpszClassName = TEXT("WIN"); //指定窗口类名称
	 wc.lpszMenuName = NULL; //菜单名称
	 wc.style = 0; //显示风格 0代表默认风格

	 //2、注册窗口类
	 RegisterClass(&wc);

	 //3、创建窗口
	 /*
	 lpClassName,  类名
	 lpWindowName, 标题名
	 dwStyle,   WS_OVERLAPPEDWINDOW 风格
	 x,  显示坐标  CW_USEDEFAULT 使用默认值
	 y,
	 nWidth,  宽高
	 nHeight, 
	 hWndParent,   父窗口 NULL
	 hMenu,   菜单 NULL
	 hInstance,  实例句柄 hInstance
	 lpParam  附加值  鼠标附加值 NULL
	 */
	 HWND hwnd =  CreateWindow(wc.lpszClassName,wc.lpszMenuName,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;  具体的消息名称
		 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,  最小和最大的过滤的消息 一般填入0
		_In_ UINT wMsgFilterMax   填0代表捕获所有的消息
		 */
		//if (GetMessage(&msg,NULL,0,0) == FALSE)
		 //{
			// break;
		 //}

		 //翻译消息
		 TranslateMessage(&msg); 

		 //不为false 则分发消息
		 DispatchMessage(&msg);

	 }

	 //6、处理窗口过程


	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/857311
推荐阅读
相关标签
  

闽ICP备14008679号