Windows编程笔记(3)->常用消息处理与自定义消息

消息分为两类

//不进队列消息 WM_CREATE
//进队列消息:大部分消息时属于这一类

//WM_CREATE消息
//WPARAM:没有使用的
//LPARAM: CREATESTRUCT结构体指针

//WM_CLOSE消息 窗口关闭消息,此时还能还原出来窗口
//发生在:点击关闭 按钮的时候
//WPARAM: 没有使用的
//LPARAM: 没有使用的

//WM_DESTROY消息 表示窗口销毁消息,凡是执行到了WM_DESTROY消息了,那么此时窗口已经不能还原窗口了,界面已经被销毁了。
//发生在什么时候:程序退出,进行清理工作了。

//WM_LBUTTONDOWN鼠标左键点击客户区消息
//WPARAM:
//LPARAM:

//WM_LBUTTONUP:鼠标左键抬起
//WM_RBUTTONDOWN:鼠标右键按下
//WM_RBUTTONUP:鼠标右键抬起
//WM_LBUTTONBLACK:鼠标左键双击消息、
//WM_MOUSEMOVE:鼠标移动消息
//WM_KEYDOWN:键盘按下消息

//WPARAM:
//LPARAM:

//WM_KEYUP:按键抬起消息
//WM_CHAR:字符消息

//1.系统消息,刚才介绍的这一些都是系统消息
//WN_USER 1024以下的定义的是系统消息
//1024以上的是用户自定消息

//2.自定义消息
//如果自定义消息
//宏定义

//3.发送消息
//既可以发送系统消息,又可以发送用户自定义消息
//SendMessage:是一个阻塞函数,如果发送的消息没有没出完,则不返回,处理完成,返回结果,并且结果就是SendMessage的返回值
//PostMessage:是一个非阻塞函数,只负责把消息发过去,不会等待消息的处理完成的结果

//SendMessage:用于自己进程发送消息
//PostMessage:向进程外发送消息

//代码如下

LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hDC;

wchar_t szMesg[200];
//sprintf字符串格式化函数,窄字符
wsprintf(szMsg,L"窗口句柄:0X%x\t消息:0X%x\twParam:%d\tlParam:%d\n",hWnd,uMsg,wParam,lParam);//字符串格式化函数,宽字符
OutputDebugString(szMsg);//仅限于调试
switch(uMsg)
{
 //窗口处理消息,发生在什么时候:窗口还没有显示的时候,通过调用CreateWindow函数或者CreateWindowEx函数,发出这个消息
case WM_CREATE:
{
//MessageBox(NULL,L"这是WM_CREATE消息",L"提示",MB_OK);//阻塞函数,不点不往下走
CREATESTRUCT *pcs=(CREATESTRUCT*)lParam;
break;
}
case WM_LBUTTONDOWN://鼠标左键点击客户区消息
{
//MessageBox(hWnd,L"WM_LBUTTTONDOWN",L"提示",MB_OK);
//int xPos=LOWORD(lParam);//WORD:字,unsigned short , 0-》65535
//int yPos=HIWORD(lParam);

//wchar_t szText[100];
//wsprintf(szText,L"当前鼠标点击坐标(%d,%d)",xPos,yPos);
//把坐标设置到窗口的标题
SetWindowText(hWnd,szText);

//发送系统消息
//SendMessage(hWnd,WM_CLOSE,0,0);
//SendMessage(hWnd,WM_DESTROY,0,0);
//SendMessage(hWnd,WM_KEYDOWN,VK_SPACE,0);

//PostMessage(hWnd,WM_CLOSE,0,0);
//PostMessage(hWnd,WM_DESTROY,0,0);
//PostMessage(hWnd,WM_KEYDOWN,VK_TAB,0);
//SendMessage(hWnd,WM_KEYDOWN,VK_TAB,0);

//发送一个用户自定义消息
//BOOL b=PostMessage(hWnd,UM_TEST,45,50);
//int a=20;

HWND hNotepad=FindWindow(L"Notepad",L"无标题-记事本");
if(hNotepad==NULL)
{
MessageBox(NULL,L"没有查找到窗口",L"提示",MB_OK);
break;
}
case UM_TEST://用户自定义消息
{
int a=(int)wParam;
int b=(int)lParam;

int result=a+b;
return result;
}
case WM_MOUSEMOVE: //鼠标移动消息
{
int xPos=LOWORD(lParam);
int yPos=HIWORD(lParam);

wchar_t szText[100];
wsprintf(szText,L"当前鼠标点击坐标(%d,%d)",xPos,xPos);

if (wParam & MK_CONTROL) //按位&
		{
			wcscat(szText, L"按下了Ctrl;");
		}
		if (wParam & MK_LBUTTON)
		{
			wcscat(szText, L"按下了鼠标左键;");
		}
		if (wParam & MK_MBUTTON)
		{
			wcscat(szText, L"按下了鼠标中键;");
		}
		if (wParam & MK_RBUTTON)
		{
			wcscat(szText, L"按下了鼠标右键;");
		}
		if (wParam & MK_SHIFT)
		{
			wcscat(szText, L"按下了鼠标Shift;");
		}

		//把坐标设置到窗口的标题
		SetWindowText(hWnd, szText);

		break;
	}

case WM_KEYDOWN: //键盘按下消息
{
//MessageBox(hWnd, L"提示", L"OK", MB_OK);
		switch (wParam)
		{
		case VK_RETURN://回车键
			SetWindowText(hWnd, L"按下了回车键");
			break;
		case VK_SPACE://空格键
			SetWindowText(hWnd, L"按下了空格键");
			break;
		case VK_ESCAPE://ESC键
			SetWindowText(hWnd, L"按下了ESC键");
			break;
		case VK_SHIFT://Shift键
			SetWindowText(hWnd, L"按下了Shift键");
			break;
		case VK_TAB://Tab键
			SetWindowText(hWnd, L"按下了Tab键");
			break;
		case VK_F1://F1键
			SetWindowText(hWnd, L"按下了F1键");
			break;
		case 0x41://A键
			SetWindowText(hWnd, L"按下了A键");
			break;
		case 0x30://0SetWindowText(hWnd, L"按下了0键");
			break;
		case VK_NUMPAD0://右边的0SetWindowText(hWnd, L"按下了右边的0键");
			break;
		case VK_UP://break;
		case VK_DOWN://break;
		case VK_LEFT://break;
		case VK_RIGHT://break;
		}
	break;
}
case WM_CHAR: //字符消息
{
char charcode=(TCHAR)wParam;

wchar_t szText[100];
wsprintf(szText,L"当前字符:%c",charcode);
SetWindowText(hWnd,szText);
break;
}
case WM_PAINT: //客户区绘图消息,GDI绘图技术
{
//开始绘图
HDC hdc=BeginPaint(hWnd,&ps);
//Rectangle(hdc,0,0,200,200);
//绘制椭圆
Ellipse(hdc,0,0,300,200);
//结束绘图
EndPaint(hWnd,&ps);
break;
}
case WM_CLOSE: //窗口关闭消息
{
//ShowWindow(hWnd,SW_HIDE); //隐藏
//return 1; //表示我已经处理了
if(IDYES==MessageBox(hWnd,L"您确定要关闭吗?",L"温馨提示",MB_YESNO)
{
DestroyWindow(hWnd); //销毁窗口,干掉界面,不会发出WM_QUIT,会发出一个WM_DESTROY消息
}
else
{
//break; //还是执行了DefWindowProc系统默认处理,界面销毁,不会退出进程
//return 0; //没有处理,没有人去处理
return 1;  //我已经处理了;
}
break;
}
case WM_DESTROY: //窗口销毁消息
{
//ShowWindow(hWnd,SW_SHOW);   //无力回天了
PosQuitMessage(0);    //表示发出WM_QUIT
break;
}
return DeFWindowProc(hWnd,uMsg,wParam,lParam);//交给操作系统默认处理
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丿雨落轻尘丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值