消息分为两类
//不进队列消息 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://0键
SetWindowText(hWnd, L"按下了0键");
break;
case VK_NUMPAD0://右边的0键
SetWindowText(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);//交给操作系统默认处理
}