zl程序教程

您现在的位置是:首页 >  云平台

当前栏目

6消息机制

消息 机制
2023-09-11 14:21:07 时间


窗口创建过程和消息响应
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // 将实例句柄存储在全局变量中
MessageBox(NULL,"创建之前","窗口",MB_OK);
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
MessageBox(hWnd,"创建之后","窗口",MB_OK);
if (!hWnd)
{
return FALSE;
}

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

return TRUE;
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;

switch (message)
{
case WM_CLOSE:
if(MessageBox(hWnd,"close关闭窗口","窗口",MB_YESNO)==1)
break;
return DefWindowProc(hWnd, message, wParam, lParam);

case WM_SYSCOMMAND:
if(wParam==SC_CLOSE)
{
if(MessageBox(hWnd,"syscommand关闭窗口","窗口",MB_YESNO)==1)
break;
}
return DefWindowProc(hWnd, message, wParam, lParam);
case WM_CREATE:
MessageBox(hWnd,"创建之时","窗口",MB_OK);

.......

结论:
1.按代码所示,先调用MessageBox(NULL,"创建之前","窗口",MB_OK),CreateWindow后马上跳转到
WndProc()的WM_CREATE的MessageBox(hWnd,"创建之时","窗口",MB_OK),再返回
MessageBox(hWnd,"创建之后","窗口",MB_OK),再到ShowWindow()显示窗口。
每一个操作都会到WndProc()进行相应。
2.WM_SYSCOMMAND,WM_CLOSE的相应顺序:
在关闭窗口时,先响应WM_SYSCOMMAND,因为关闭窗口属于系统命令,后再执行WM_CLOSE,进一步关闭
窗口。


自定义消息

#define WM_BOTTON WM_USER+1

注意:所自定义的消息必须在WM_USER顺序之后,WM_USER之前已被系统占用。即WM_USER+2,WM_USER+3
。。。WM_USER+100000000均可使用。

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;

switch (message)
{
case WM_RBUTTONDOWN:
PostMessage(hWnd,WM_BOTTON,0,0);
//SendMessage(hWnd,WM_BOTTON,0,0);
break;
case WM_BOTTON:
MessageBox(hWnd,"自定义消息","窗口",MB_YESNO);
break;

。。。。。

结果:
当在窗口中,鼠标右击按下会触发WM_RBUTTONDOWN,通过PostMessage(hWnd,WM_BOTTON,0,0),调用
自定义消息 WM_BOTTON。


PostMessage()与SendMessage()的区别:
PostMessage():只负责将消息放到消息队列中,不确定何时及是否处理。执行后马上返回(非阻塞);
PostMessage()发送消息时,消息要先放入县城的消息队列 ,然后通过消息循环Dispatch到目标窗口。

SendMessage():要等到收到消息处理的返回码后才继续,消息处理后才返回。(阻塞);
SendMessage()发送消息时,系统直接调用目标窗口的消息处理程序,并将结果返回,SendMessage在同
一线程中发送消息并不入线程消息队列。