Windows程序设计入门、MFC程序设计入门必备

1、WinMain函数

(1)Windows程序入口。

(2)创建一个窗口,并在给窗口中响应键盘及鼠标消息,步骤:

  • winMain函数的定义
  • 创建一个窗口
  • 进行消息循环
  • 编写窗口过程函数

(3)函数原型

int WINAPI WinMain(
HINSTANCE  hInstance,     //当前运行实例的句柄
HINSTANCE  hPrevInstance, //当前实例的前一个实例的句柄,一般为NULL
LPSTR  lpCmdLine,         //空终止符,指定传递给应用程序的命令行参数
int  nCmdShow             //指定程序窗口如何响应
);

2、窗口特征WNDCLASS结构体

Windows程序设计入门、MFC程序设计入门必备_第1张图片

a、style:

  • CS_ HREDRAW:当窗口水平方向上的宽度发生变化时,将重新绘制整个窗口。当窗口发生重绘时,窗口中的文字和图形将被擦除。如果没有指定这一样式,那么在水平方向上调整窗口宽度时,将不会重绘窗口。
  • CS _VREDRAW:当窗口垂直方向上的高度发生变化时,将重新绘制整个窗口。如果没有指定这一样式,那么在垂直方向上调整窗口高度时,将不会重绘窗口。
  • CS_ NOCLOSE:禁用系统菜单的Close命令,这将导致窗口没有关闭按钮。
  • CS_ DBLCLKS:当用户在窗口中双击鼠标时,向窗口过程发送鼠标双击消息。

b、lpfnWndProc:

函数指针,指向窗口过程函数,窗口过程函数是一个回调函数,回调函数在特定事件或条件发生时由另一方调用。回调函数实现机制:

  • 定义一个回调函数
  • 提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者
  • 当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理

例如Windows的消息处理机制,窗口过程函数被调用的过程:

1)在设计窗口类的时候,将窗口过程给你函数的地址赋值给lpfnWndProc成员变量

2)调用ResgiterClass(&wndclass)注册窗口类,那么系统就有了我们所编写的窗口过程函数的地址。

3)当应用程序接收到某一窗口的消息是,调用DispatchMessage(&msg)将消息回传给系统。系统则利用先前注册窗口类时得到的函数指针,调用过程函数对消息进行处理。

c、cbClsExtra:

附加内存空间,用于存储类的附加信息,Windows把这部分内存初始化为0,故一般设为0

d、cbWndExtra:

附加内存空间,一般设为0

e、hInstance:

指定包含窗口过程的程序的实例句柄

f、hIcon:

窗口图标,NULL则为默认

g、hCusor:

窗口类的光标句柄,如果为NULL,那么无论然后是鼠标进入到应用程序窗口中,应用程序都必须明确的设置光标的形状。可以调用LoadCursor函数来加载光标资源,返回系统分配给光标的句柄。

h、hbrBackground:

背景画刷句柄

i、lpszMenuName:

一个以空终止的字符串,指定菜单资源的名字,NULL则没有默认菜单

j、lpszClassName

一个以空终止的字符串,指定窗口类的名字

 

3、注册窗口

ATOM RegisterClass(CONST WNDCLASS *lpWndClass);

lpWndClass:窗口类对象指针

 

4、创建窗口

Windows程序设计入门、MFC程序设计入门必备_第2张图片

返回值:成功,返回系统为该窗口分配的句柄。失败,返回NULL

a、zClassName:指定窗口类的名称,与窗口的结构体中定义的一致

b、WindowName:指定窗口名字,显示在标题栏

c、dwStyle:指定创建的窗口样式WS_OVERLAPPEDWINDOW

■WS_ OVERL APPED:产生一个层叠的窗口,一个层叠的窗口有一个标题栏和一个边框。

■ws CAPTION: 创建一一个有标题栏的窗口。

■Ws_ SYSMENU:创建一个在标题栏上带有系统菜单的窗口,要和WS_ CAPTION类型一起使用。

■ws_ THICKFRAME: 创建一个具有可调边框的窗口。

■ws _MINIMIZEBOX: 创建一个具有最小化按钮的窗口,必须同时设定WS_ SYSMENU类型。

■WS_ MAXIMIZEBOX: 创建一个具有最大化按钮的窗口,必须同时设定WS_ SYSMENU类型。

d、x、y:

窗口左上角的x、y坐标

e、nWidth、nHeight:

窗口的宽、高

f、hWndParent:

指定被创建窗口的父窗口句柄

Windows程序设计入门、MFC程序设计入门必备_第3张图片

i、hMenu:指定窗口菜单句柄

j、hIstance:指定窗口所属的应用程序实例的句柄

k、lParam:作为WM_CREATE消息的附加参数lParam传入的数据指针,一般为NULL

5、显示及更新窗口

(1)显示使用ShowWindow

BOOL ShowWindow{
HWND hwnd,
int nCmdShow
};

hwnd:窗口句柄

nCmdShow:窗口显示状态,一下几种状态

■SW_HIDE:隐藏窗口并激活其他窗口。

■SW_SHOW:在窗口原来的位置以原来的尺寸激活和显示窗口。SW_ SHOWMAXIMIZED: 激活窗口并将其最大化显示。

■sw_ SHOWMINIMIZED:激活窗口并将其最小化显示。

■SW_ SHOWNORMAL:激活并显示窗口。如果窗口是最小化或最大化的状态,系统将其恢复

到原来的尺寸和大小。应用程序在第一次显示窗口的时候应该指定此标志。

(2)更新用UpdateWindow

BOOL UpdateWindow{
HWND hwnd
};

hwnd:窗口句柄

6、消息循环

在创建窗口、显示窗口、更新窗口后需要消息循环不断从消息对列找那个取出消息。使用GetMessage()从消息队列中取出消息。

BOOL GetMessage(
    LPMSG lpMsg,
    HWND hWnd,
    UINT wMsgFilterMin,
    UINT wMsgFilterMax,
)

返回值:除了接收到WM_QUIT外的消息均返回非零值。错误,返回-1。

  • lpMsg:指向一个消息结构体,GerMessage从线程的消息队列中取出消息信息将保存在该结构体对象中。
  • hWnd:指向接收属于哪个窗口的消息。一般为NULL,用于接收属于调用线程的所有窗口的窗口消息。
  • wMsgFilterMin:获取的消息的最小值,一般为0
  • wMsgFilterMax; 获取的消息的最大值。如果wMsgFilterMin和wMsgFilterMax都为0,则接收所有消息

例:

MSG msg;
    while(GetMessage(&msg, NULL, 0, 0)){
    TranslateMessage(&msg);
    DispatchMessae(&msg);
}

7、实例

#include 
#include 

// 过程函数的定义
LRESULT CALLBACK WinSunProc(
	HWND hwnd,		//窗口句柄
	UINT uMsg,		//消息常量标识符
	WPARAM wParam,	//特定附加消息
	LPARAM lParam	//特定附加消息
)
{
	switch (uMsg)
	{
	case WM_CHAR:
		char szChar[20];
		sprintf_s(szChar, "char code is %d", wParam);
		MessageBox(hwnd, szChar, "char", 0);
		break;
	case WM_LBUTTONDOWN:
		MessageBox(hwnd, "mouse clicked", "message", 0);
		HDC hdc;
		hdc = GetDC(hwnd);		//不能在响应WM_PAINT消息时调用
		TextOut(hdc, 0, 50, "你好", strlen("你好"));
		//ReleaseDC(hwnd);
		break;
	case WM_PAINT:
		HDC hDC;
		PAINTSTRUCT ps;
		hDC = BeginPaint(hwnd, &ps);	//只能在WM_PAINT消息时调用
		TextOut(hDC, 0, 0, "www.baidu.com", strlen("www.baid.com"));
		EndPaint(hwnd, &ps);
		break;

	case WM_CLOSE:
		if (IDYES == MessageBox(hwnd, "是否结束?", "message", MB_YESNO))
		{
			DestroyWindow(hwnd);
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hwnd, uMsg, wParam, lParam);
	}

	return 0;

}

// 主函数入口
int WINAPI WinMain(
	HINSTANCE hInstance,		//当前实例句柄
	HINSTANCE hPrevInstance,	//当前实例前一个实例句柄
	LPSTR lpCmdLine,			//命令行
	int nCmdShow				//显示方式
)
{
	// 设计一个窗口类
	WNDCLASS wndcls;
	wndcls.cbClsExtra = 0;							//附加内存空间
	wndcls.cbWndExtra = 0;							//附加内存空间
	wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);	//背景色
	wndcls.hCursor = LoadCursor(NULL, IDC_CROSS);	//光标
	wndcls.hIcon = LoadIcon(NULL, IDI_ERROR);		//图标
	wndcls.hInstance = hInstance;					//当前实例句柄
	wndcls.lpfnWndProc = WinSunProc;				//消息处理函数
	wndcls.lpszClassName = "baidu";					//窗口类名称
	wndcls.lpszMenuName = NULL;						//菜单名
	wndcls.style = CS_HREDRAW | CS_VREDRAW;			//窗口长/宽改变时重绘
	RegisterClass(&wndcls);							//注册窗口类

	// 创建窗口,定义一个变量来保存创建窗口后返回的句柄
	HWND hwnd;
	hwnd = CreateWindow("baidu", "标题",
		WS_OVERLAPPEDWINDOW, 0, 0, 600, 400, NULL, NULL, hInstance, NULL);

	// 显示及刷新窗口
	ShowWindow(hwnd, SW_SHOWNORMAL);
	UpdateWindow(hwnd);

	// 定义消息结构体,开始消息循环
	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);			//将消息回传给系统
	}

	return msg.wParam;		//返回特定附加标识
}

输出

Windows程序设计入门、MFC程序设计入门必备_第4张图片

 

你可能感兴趣的:(MFC,Windows编程)