win32消息处理和创建窗口

0.说明

观看滴水逆向视频总结(部分截图来自于滴水课件)

编译器:vc++6.0

编写语言:c

欢迎大家留言交流😃^ __ ^

1.win32事件和消息

image-20201017003404361

image-20201017003155575

2.系统处理消息

image-20201017003908093

1.用户产生消息,该消息进入系统的消息队列

2.所有的应用程序也存在一个队列,该队列挨个读取消息队列。

3.如果一个应用程序检测到这个消息是自己的,就处理该消息,如果不是,就不管,继续循环读取队列中下一个消息。

4.如果一个消息所有应用都不处理,就由系统处理,这个函数DefWindowProc(hwnd , uMsg, wParam, lParam);//例如在桌面任意点击一下。

image-20201017004921503

3.win32创建窗口和消息处理

创建win32应用程序

(以下好多win32api可以通过MSDN文档查询)(或微软官网查询)

image-20201017005310332

image-20201017005446566

image-20201017005602004

image-20201017005702894

//步骤9:回调函数(消息处理函数)
LRESULT CALLBACK WindowProc(  									
							IN  HWND hwnd,  		
							IN  UINT uMsg,  		
							IN  WPARAM wParam,  		
							IN  LPARAM lParam  		
							)  		
{  									
	switch(uMsg)								
	{								
		//窗口消息							
	case WM_CREATE: 								
		{							
			DbgPrintf("WM_CREATE %d %d\n",wParam,lParam);						
			CREATESTRUCT* createst = (CREATESTRUCT*)lParam;						
			DbgPrintf("CREATESTRUCT %s\n",createst->lpszClass);						
									
			return 0;						
		}							
	case WM_MOVE:								
		{							
			DbgPrintf("WM_MOVE %d %d\n",wParam,lParam);						
			POINTS points = MAKEPOINTS(lParam);						
			DbgPrintf("X Y %d %d\n",points.x,points.y);						
									
			return 0;						
		}							
	case WM_SIZE:								
		{							
			DbgPrintf("WM_SIZE %d %d\n",wParam,lParam);						
			int newWidth  = (int)(short) LOWORD(lParam);    						
			int newHeight  = (int)(short) HIWORD(lParam);   						
			DbgPrintf("WM_SIZE %d %d\n",newWidth,newHeight);						
									
			return 0;						
		}							
	case WM_DESTROY:								
		{							
			DbgPrintf("WM_DESTROY %d %d\n",wParam,lParam);						
			PostQuitMessage(0);						
									
			return 0;						
		}							
		//键盘消息							
	case WM_KEYUP:								
		{							
			DbgPrintf("WM_KEYUP %d %d\n",wParam,lParam);						
									
			return 0;						
		}							
	case WM_KEYDOWN:								
		{							
			DbgPrintf("WM_KEYDOWN %d %d\n",wParam,lParam);						
									
			return 0;						
		}							
		//鼠标消息							
	case WM_LBUTTONDOWN:								
		{							
			DbgPrintf("WM_LBUTTONDOWN %d %d\n",wParam,lParam);						
			POINTS points = MAKEPOINTS(lParam);						
			DbgPrintf("WM_LBUTTONDOWN %d %d\n",points.x,points.y);						
									
			return 0;						
		}							
	}								
    //无用的消息,还要传给这个函数处理。
	return DefWindowProc(hwnd,uMsg,wParam,lParam);
}  									

4.源代码

编译环境:vc++6.0

image-20201017010334404

// c.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include<windows.h>

HINSTANCE hAppInstance;

LRESULT CALLBACK WindowProc(
	IN HWND hwnd,
	IN UINT uMsg,
	IN WPARAM wParam,
	IN LPARAM lParam
	);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 //	hAppInstance = hInstance;

	//窗口的类名
	PSTR className = "My First Window";
	
	//创建窗口类的对象
	WNDCLASS wndclass = {0};//必须所有值赋初值

	wndclass.hbrBackground = (HBRUSH)COLOR_MENU;//窗口的背景色
	wndclass.hCursor = LoadCursor(NULL , IDC_APPSTARTING);
	wndclass.lpfnWndProc = WindowProc;//窗口过程函数
	wndclass.lpszClassName = className;//窗口名
	wndclass.hInstance = hInstance;//定义窗口类的应用程序的实例句柄


	//注册窗口类
	RegisterClass(&wndclass);

	//创建窗口
	HWND hwnd = CreateWindow(
		className,				//类名
		"My first window!",		//窗口标题
		WS_OVERLAPPEDWINDOW,	//窗口外观样式
		400,					//相对于父窗口的x坐标
		200,					//相对于父窗口的y坐标
		1000,					//窗口的宽度
		600,					//窗口的高度
		NULL,					//父窗口句柄,为NULL
		NULL,					//菜单句柄,为NULL
		hInstance,				//当前应用程序的句柄
		NULL					//附件数据一般为NULL
		);

	if(hwnd == NULL)//是否创建成功
		return 0;

	//显示窗口
	ShowWindow(hwnd , SW_SHOW);

	//更新窗口
	UpdateWindow(hwnd);

	//消息循环
	MSG msg;
	while(GetMessage(&msg, NULL, 0, 0) )
	{
		TranslateMessage(&msg);//翻译消息
		DispatchMessage(&msg);//分发消息

	}



	return 0;
}

//回调函数
LRESULT CALLBACK WindowProc(
							IN	HWND hwnd,
							IN	UINT uMsg,
							IN	WPARAM wParam,
							IN	LPARAM lParam)
{
	if(uMsg == WM_DESTROY)//对应销毁(关闭)窗口的消息
	{
		PostQuitMessage(0);//关闭程序。
		return 0;//处理完消息后要返回0。
	}
	return DefWindowProc(hwnd , uMsg, wParam, lParam);//自己不要的消息发给系统处理
}

欢迎大家留言交流^ _ ^

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值