windows API 第一个函数, 和封装

一个简单的windows 程序

#include <Windows.h>
#include <stdio.h>

LRESULT CALLBACK DealEven(
						  HWND hWnd,              // handle to window
						  UINT Msg,               // message
						  WPARAM wParam,          // first message parameter
						  LPARAM lParam           // second message parameter
					   );

int WINAPI WinMain(HINSTANCE hInstance,
				    HINSTANCE hPrevInstance,
				   LPSTR lpCmdLine,
				   int nShowCmd 
				   )
{
	// 创建一个窗口对象(并实例化)
	WNDCLASS wc;

	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.hCursor = LoadCursor(NULL,IDC_ARROW);
	wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
	wc.hInstance = hInstance;
	wc.lpfnWndProc = DealEven;		//重点:指定窗口消息的处理函数
	wc.lpszClassName = "Welcome To LM";
	wc.lpszMenuName = NULL;
	wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
	
	//注册这个窗口的对象
	RegisterClass(&wc);

	//创建一个窗口
	HWND hwnd= CreateWindow(
		wc.lpszClassName,  // registered class name
		"这是第一个Win32程序", // window name
		WS_OVERLAPPEDWINDOW,        // window style
		0,                // horizontal position of window
		0,                // vertical position of window
		600,           // window width
		600,          // window height
		NULL,      // handle to parent or owner window
		NULL,          // menu handle or child identifier
		wc.hInstance,  // handle to application instance
		NULL        // window-creation data
		);
	if (hwnd == NULL)
	{
		return 0;
	}
	// 显示窗口
	ShowWindow(hwnd,SW_SHOWNORMAL);

	//更新窗口
	UpdateWindow(hwnd);

	//接受消息处理
	MSG message;

	while (GetMessage(&message,hwnd,NULL,NULL))
	{
		TranslateMessage(&message);//把虚键消息翻译成字符消息(WM_CHAR),
										//再把WM_CHAR消息放到消息队列中去
		DispatchMessage(&message);	//指示操作系统把这条消息发送到窗口
										//过程WinProc进行处理
	}


	return message.wParam;

}

//窗口回调函数,由操作系统调用,程序员
//不要调用,但程序员需要编写其实现代码
LRESULT CALLBACK DealEven(
					   HWND hWnd,              // handle to window
					   UINT Msg,               // message
					   WPARAM wParam,          // first message parameter
					   LPARAM lParam           // second message parameter
					   )
{
	LPSTR szstring = "welcome to LM learning C plus plus";
	LPSTR szstring_Paint="I get Paint Message";

	switch (Msg)
	{
	case WM_CHAR:
		char szChar[20];
		sprintf_s(szChar,"你按下了%c键",(char)(wParam));
		MessageBox(NULL,szChar,"WM_CHAR",MB_OK);
		break;
	case WM_LBUTTONDOWN:
		HDC hdc;
		hdc = GetDC(hWnd);
		
		TextOut(hdc,0,100,szstring,strlen(szstring));
		ReleaseDC(hWnd,hdc);
		break;
	case WM_PAINT:
		HDC hdcPaint;
		PAINTSTRUCT paint;//画的句柄
		
		hdcPaint = BeginPaint(hWnd,&paint);
		TextOut(hdcPaint,0,0,szstring_Paint,strlen(szstring_Paint));
		EndPaint(hWnd,&paint);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd,Msg,wParam,lParam);
	}

}

上面的特别注意的就是别忘记要注册wc这个对象。RegisterClass()就是把定义好的窗口属性向系统进行登记。

WM_DESTROY 是用户单击右上角的关闭按钮来关闭窗口的时候产生的消息,然后调用PostQuitMessage(),这个函数在关闭窗口时候做一些善后处理。

DefWndProc()这个是对用户没有处理的消息默认处理。


#include <Windows.h>
#include <stdio.h>

LRESULT CALLBACK DealEven(
						  HWND hWnd,              // handle to window
						  UINT Msg,               // message
						  WPARAM wParam,          // first message parameter
						  LPARAM lParam           // second message parameter
					   );


// 下面对程序进行封装

//定义全局变量

//HINSTANCE hInst;
HWND hwnd;
MSG message;

char lpszClassName []="Welcome To LM" ;
LPSTR szstring = "welcome to LM learning C plus plus";
LPSTR szstring_Paint="I get Paint Message";

ATOM MyRegisterClass(HINSTANCE hInstance);	//注册函数 ATOM == unsigned short

BOOL  MyCreate(HINSTANCE ,int );	//程序实例化函数

int Run();	//消息循环函数

LRESULT CALLBACK DealEven(
						  HWND hWnd,              // handle to window
						  UINT Msg,               // message
						  WPARAM wParam,          // first message parameter
						  LPARAM lParam           // second message parameter
					   );
void OnLButtonDown(
				   HWND hwnd,
					UINT message,
					WPARAM wParam,
					LPARAM lParam
				   );

void OnPaint(
			HWND hwnd,
			UINT message,
			WPARAM wParam,
			LPARAM lParam
			);

void OnDestroy(
			   HWND hwnd,
			   UINT message,
			   WPARAM wParam,
			   LPARAM lParam
			   );

void OnChar(
			HWND hwnd,
			UINT message,
			WPARAM wParam,
			LPARAM lParam
			);


int WINAPI WinMain(HINSTANCE hInstance,
				   HINSTANCE hPrevInstance,
				   LPSTR lpCmdLine,
				   int nShowCmd 
				   )
{
	MyRegisterClass(hInstance);	//此处传递hInstance就是为了初始化,wc里面的hInstance

	MyCreate(hInstance,nShowCmd);

	ShowWindow(hwnd,nShowCmd);
	
	UpdateWindow(hwnd);
	
	return Run();

}

ATOM MyRegisterClass(HINSTANCE hInstance)
{
	// 创建一个窗口对象(并实例化)
	WNDCLASS wc;

	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.hCursor = LoadCursor(NULL,IDC_ARROW);
	wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
	wc.hInstance = hInstance;
	wc.lpfnWndProc = DealEven;		//重点:指定窗口消息的处理函数
	wc.lpszClassName =lpszClassName ;
	wc.lpszMenuName = NULL;
	wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;

	//注册这个窗口的对象
	return RegisterClass(&wc);
}

BOOL MyCreate(HINSTANCE hInstance,int nCmdShow )
{
	//创建一个窗口
	hwnd= CreateWindow(
		lpszClassName,  // registered class name
		"这是第一个Win32程序", // window name
		WS_OVERLAPPEDWINDOW,        // window style
		0,                // horizontal position of window
		0,                // vertical position of window
		600,           // window width
		600,          // window height
		NULL,      // handle to parent or owner window
		NULL,          // menu handle or child identifier
		hInstance,  // handle to application instance
		NULL        // window-creation data
		);
	if (hwnd == NULL)
	{
		return FALSE;
	}

	return TRUE;
}

int Run()
{
	while (GetMessage(&message,hwnd,NULL,NULL))
	{
		TranslateMessage(&message);//把虚键消息翻译成字符消息(WM_CHAR),
		//再把WM_CHAR消息放到消息队列中去
		DispatchMessage(&message);	//指示操作系统把这条消息发送到窗口
		//过程WinProc进行处理
	}


	return message.wParam;
}

//窗口回调函数,由操作系统调用,程序员
//不要调用,但程序员需要编写其实现代码

LRESULT CALLBACK DealEven(
						  HWND hwnd,              // handle to window
						  UINT Msg,               // message
						  WPARAM wParam,          // first message parameter
						  LPARAM lParam           // second message parameter
					   )
{
	

	switch (Msg)
	{
	case WM_CHAR:
		OnChar(hwnd, Msg,wParam, lParam );
		break;
	case WM_LBUTTONDOWN:
		OnLButtonDown(hwnd, Msg,wParam, lParam);
		break;
	case WM_PAINT:
		OnPaint(hwnd, Msg,wParam, lParam);
		break;
	case WM_DESTROY:
		OnDestroy(hwnd, Msg,wParam, lParam);
		break;
	default:
		return DefWindowProc(hwnd,Msg,wParam,lParam);
	}

}

void OnChar( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
	char szChar[20];
	sprintf_s(szChar,"你按下了%c键",(char)(wParam));
	MessageBox(NULL,szChar,"WM_CHAR",MB_OK);
}

void OnLButtonDown( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
	HDC hdc;
	hdc = GetDC(hwnd);

	TextOut(hdc,0,100,szstring,strlen(szstring));
	ReleaseDC(hwnd,hdc);
}
void OnPaint( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
	HDC hdcPaint;
	PAINTSTRUCT paint;//画的句柄

	hdcPaint = BeginPaint(hwnd,&paint);
	TextOut(hdcPaint,0,0,szstring_Paint,strlen(szstring_Paint));
	EndPaint(hwnd,&paint);
}
void OnDestroy( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
	PostQuitMessage(0);
}

BeginPaint()启动绘图,函数TextOut用于在用户绘制文字,函数EndPaint()用于结束绘图操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值