《Windows API每日一练》

2.2.8 第15练:处理WM_CLOSE消息

/*------------------------------------------------------------------------

 015 编程达人win32 API每日一练

     第15个例子WM_CLOSE.C:回调函数---处理WM_CLOSE消息    

     WM_CLOSE消息

     DestroyWindow函数

    注意:关闭窗口后,程序退出。

 (c) www.bcdaren.com 编程达人

-----------------------------------------------------------------------*/

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //消息回调函数

/*************************程序入口 ******************************************

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

    LPSTR lpCmdLine, int nCmdShow)

{

    static TCHAR szAppName[] = TEXT("HelloWin"); // 窗口类名

    ……(略)

    return msg.wParam;//msg.wParam 来自一条表示退出的消息,返回这个值给系统

}

 /************************回调函数——消息处理过程****************************/

 //窗口回调函数

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

     HDC hDC;       //设备环境——绘图的地方

     PAINTSTRUCT ps; //绘图结构体变量

     RECT rect;      //绘图区范围

     switch (message)

     {

     case WM_CREATE: //创建窗口消息

            return 0;

     case WM_PAINT://绘图函数,在窗口上画画儿!

           hDC = BeginPaint(hwnd, &ps);

           //获得客户区大小

           GetClientRect(hwnd, &rect);  

           //绘制字符串

           TextOut(hDC, 200, 200, TEXT("爱达人!"), lstrlen(TEXT("爱达人!")));

           //绘制椭圆图形

           Ellipse(hDC, 250, 250, 1200, 500);

           //绘制格式化文本,客户区中间垂直居中对齐

           DrawText(hDC, TEXT("我的第一个窗口程序!"), -1, &rect,DT_CENTER |

DT_VCENTER | DT_SINGLELINE);

           EndPaint(hwnd, &ps);

           return 0;

     case WM_CLOSE:

/*

 1、一般是响应WM_CLOSE:调用DestroyWindow(),DestroyWindow()又发送WM_DESTROY消息;响应WM_DESTROY时,PostQuitMessage()函数发送WM_QUIT标记到消息队列,GetMessage()发现WM_QUIT时,退出程序

 2、一个窗口或者应用程序应该被关闭时发出WM_CLOSE消息,当接收到WM_CLOSE消息时,

如果你愿意,可以通过MessageBox向用户提出是否真的要退出。

 3、用户选择退出或不退出。*/           

         if (IDYES == MessageBox(hwnd,TEXT("是否真的要退

出!),TEXT("OK?"),MB_YESNO))

         {

             DestroyWindow(hwnd);

             break;

         }

         else

            break;//不退出,并且什么都没做。

     case WM_DESTROY://处理退出消息

            PostQuitMessage(0);//此消息直接进入消息队列的头部!

            break;

     default:     //可以放在最后

          return DefWindowProc(hwnd, message, wParam, lParam); //调用默认窗口过程以为应用程序未处理的任何窗口消息提供默认处理

     }

     return 0;

     //return DefWindowProc(hwnd, message, wParam, lParam); //调用默认窗口过程以为应用程序未处理的任何窗口消息提供默认处理

}

/*************************************注意*************************************

WM_CLOSE消息:作为窗口或应用程序应终止的信号发送。

#define WM_CLOSE                        0x0010

返回值类型:LRESULT

如果应用程序处理此消息,则应返回零。

备注

应用程序可以在销毁窗口之前提示用户进行确认,方法是处理WM_CLOSE消息并仅在用户确认选择后才调用DestroyWindow函数。

默认情况下,DefWindowProc函数调用DestroyWindow函数来销毁窗口。

*******************************************************************************

DestroyWindow函数:销毁指定的窗口。该函数将WM_DESTROY和WM_NCDESTROY消息发送到窗口以将其停用并从中移出键盘焦点。

该函数还破坏窗口的菜单,刷新线程消息队列,破坏计时器,删除剪贴板所有权,并中断剪贴板查看器链(如果窗口位于查看器链的顶部)。

如果指定的窗口是父窗口或所有者窗口,则DestroyWindow在销毁父窗口或所有者窗口时会自动销毁关联的子窗口或所有者窗口。该函数首先销毁子窗口或所有者窗口,然后销毁父窗口或所有者窗口。DestroyWindow还会破坏由CreateDialog函数创建的无模式对话框。

BOOL DestroyWindow(

  HWND hWnd    //销毁窗口的句柄

);

返回值类型:布尔

如果函数成功,则返回值为非零。

如果函数失败,则返回值为零。要获取扩展的错误信息,请调用GetLastError。

*/

       点击“关闭”系统菜单后,弹出对话框窗口,如图2-6所示:

图2-6 WM_CLOSE消息

 注意

       读者可能会有疑问,当用户点击系统菜单“关闭”窗口时,是如何产生并获取WM_CLOSE消息的呢?答案是Windows操作系统获取“关闭”系统菜单消息后,再发送一个WM_CLOSE消息。这个问题,我们将在下一节消息机制中详细讲解。

2.2.9 第16练:处理WM_SIZE消息

/*------------------------------------------------------------------------

 016 编程达人win32 API每日一练

     第16个例子WM_SIZE.C:窗口过程---处理WM_SIZE消息    

     WM_SIZE消息---调整客户区大小

     InvalidateRect函数

    注意:关闭窗口后,程序退出。

 (c) www.bcdaren.com 编程达人

-----------------------------------------------------------------------*/

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //消息回调函数

/*************************程序入口 ******************************************

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

    LPSTR lpCmdLine, int nCmdShow)

{

    static TCHAR szAppName[] = TEXT("HelloWin"); // 窗口类名

    ……(略)

    return msg.wParam;//msg.wParam 来自一条表示退出的消息,返回这个值给系统

}

 /*************************回调函数——消息处理过程***************************/

 //窗口过程回调函数

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

     HDC hDC;       //设备环境——绘图的地方

     PAINTSTRUCT ps; //绘图结构体变量

     RECT rect;      //绘图区范围

     static int cxClient,cyClient;//客户区的宽度和高度,定义为静态局部变量

     switch (message)

     {

     case WM_CREATE: //创建窗口消息

          //return 0;

          break;    //也可以

     case WM_SIZE://更改窗口客户区大小的消息

          GetClientRect(hwnd, &rect);//等价于lParam参数的作用

          InvalidateRect(hwnd, &rect, TRUE);//TRUE重绘窗口客户区背景

          cxClient = LOWORD(lParam);//客户区的新宽度

          cyClient = HIWORD(lParam);//客户区的新高度

          break;

     case WM_PAINT://绘图函数,在窗口上画画儿!

          hDC = BeginPaint(hwnd, &ps);

          //获得客户区大小

          GetClientRect(hwnd, &rect);  

          //绘制字符串---跟随客户区尺寸的变化而变化

          //TextOut(hDC, 200, 200, TEXT("爱达人!"), lstrlen(TEXT("爱达人!

")));//对比测试

          TextOut(hDC, cxClient / 5, cyClient / 5, TEXT("爱达人!"),

lstrlen(TEXT("爱达人!")));

          //绘制椭圆图形---跟随客户区尺寸的变化而变化

          //Ellipse(hDC, 250, 250, 1200, 500);//对比测试

            Ellipse(hDC, cxClient / 4 , cyClient / 4 , cxClient / 4 * 3,

cyClient / 4 * 3);

          //绘制格式化文本,客户区中间垂直居中对齐

          DrawText(hDC, TEXT("我的第一个窗口程序!"), -1, &rect,DT_CENTER |

DT_VCENTER | DT_SINGLELINE);

          EndPaint(hwnd, &ps);

          break;

     case WM_CLOSE:

          if (IDYES == MessageBox(hwnd,TEXT("是否真的要退出!

"),TEXT("OK?"),MB_YESNO))

          {

              DestroyWindow(hwnd);

              break;

          }

          else

              break;//不退出,并且什么都没做。

     case WM_DESTROY://处理退出消息

           PostQuitMessage(0);//此消息直接进入消息队列的头部!

           break;

     default:     //可以放在最后

         return DefWindowProc(hwnd, message, wParam, lParam);//调用默认窗口过程

     }

     return 0;

     //return DefWindowProc(hwnd, message, wParam, lParam); //调用默认窗口过程

}

/*************************************注意*************************************

WM_SIZE消息:当主窗口的客户区部分大小改变时,我们的应用程序将接收到 WM_SIZE 消息。

lParam 的高字部分是客户区的高,低字部分是客户区的宽。

wParam请求的调整大小类型。此参数可以是下列值之一。

SIZE_MAXHIDE:当某个其他窗口最大化时,消息将发送到所有弹出窗口。

SIZE_MAXIMIZED:窗口已最大化。

SIZE_MAXSHOW:当某些其他窗口恢复到原来的大小时,消息将发送到所有弹出窗口。

SIZE_MINIMIZED:窗口已最小化。

SIZE_RESTORED:窗口已调整大小,但SIZE_MINIMIZED或SIZE_MAXIMIZED值均不适用。

说明:

lParam和GetClientRect的功能一样,有时候WM_SIZE的效率要比使用GetClientRect高.

可以在程序中使用WM_SIZE来保存客户区的大小方便以后使用.

*******************************************************************************

InvalidateRect函数:向指定的窗体更新区域添加一个矩形,然后窗口客户区域的这一部分将被重新绘制。

BOOL InvalidateRect(

  HWND       hWnd, //新区域已更改的窗口的句柄。如果此参数为NULL,

                   //则系统将使所有窗口(不仅是此应用程序的窗口)无效并重新绘制

//所有窗口,并在函数返回之前发送WM_ERASEBKGND和WM_NCPAINT消

//息。不建议将此参数设置为NULL。

  const RECT *lpRect,//指向RECT结构的指针,该结构包含要添加到更新区域的矩形的客

//户坐标。如果此参数为NULL,则整个工作区将添加到更新区域。

  BOOL       bErase  //指定在处理更新区域时是否要擦除更新区域内的背景。

                     //如果此参数为TRUE,则在调用BeginPaint函数时将擦除背景。

                     //如果此参数为FALSE,则背景保持不变。

);

*/  运行结果:

图2-7 WM_SIZEE消息

 

总结

       1.读者是否还记得,当我们执行ShowWindow函数时会向消息队列发送一个WM_SIZE消息。WM_SIZE消息用于向窗口发送尺寸改变的消息。当窗口的大小发生变化时,系统会生成并发送WM_SIZE消息给窗口,使程序能够对窗口尺寸的改变做出响应。WM_SIZE消息的lParam 参数的高字部分是客户区的高,低字部分是客户区的宽。wParam参数为请求的调整大小类型。每个Windows消息都有附属的wParam参数和lParam 参数。不同消息的wParam参数和lParam 参数的含义是不同的。我们将在2.4节中详细讲解。

       2.细心的读者会发现,本例中的窗口是可以通过鼠标拖动改变窗口的大小,同时窗口客户区绘制的图形和文本也随之而改变相应的位置。请注意处理WM_PAINT消息时的GDI绘图函数,绘制图形和文本的坐标位置是和窗口客户区等比例的。首先定义static变量cxClient,cyClient,接着在处理WM_SIZE消息时通过lParam参数获取窗口客户区的高和宽。当然也可以通过GetClientRect函数获取窗口客户区的宽和高,使用其中一个方法就可以了。

       3.请读者对比测试一下,如果将绘制文本和椭圆的坐标和区域设置为固定值,显示效果如何。

2.2.10 第17练:处理WM_CHAR消息

/*------------------------------------------------------------------------

 017 编程达人win32 API每日一练

     第17个例子WM_CHAR.C:窗口过程---处理WM_CHAR消息    

     WM_CHAR消息---接收按键消息

     _stprintf_s函数

    注意:关闭窗口后,程序退出。

 (c) www.bcdaren.com 编程达人

-----------------------------------------------------------------------*/

#include <windows.h>

#include <tchar.h>

/*********************************回调函数***********************************

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //消息回调函数

/*************************程序入口 ******************************************

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

    LPSTR lpCmdLine, int nCmdShow)

{

    static TCHAR szAppName[] = TEXT("HelloWin"); // 窗口类名

    ……(略)

    return msg.wParam;//msg.wParam 来自一条表示退出的消息,返回这个值给系统

}

 /************************回调函数——消息处理过程****************************/

 //窗口过程回调函数

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

     HDC hDC;       //设备环境——绘图的地方

     PAINTSTRUCT ps; //绘图结构体变量

     RECT rect;      //绘图区范围

     static int cxClent,cyClient;//客户区的宽度和高度,定义为静态局部变量

     switch (message)

     {

     case WM_CREATE: //创建窗口消息

          //return 0;

          break;    //也可以

     case WM_SIZE://更改窗口客户区大小的消息

          //GetClientRect(hWnd, &rect);//等价于lParam参数的作用

          //InvalidateRect(hWnd, &rect, TRUE);//TRUE重绘窗口客户区背景

          cxClent = LOWORD(lParam);//客户区的新宽度

          cyClient = HIWORD(lParam);//客户区的新高度

          break;

     case WM_CHAR:

          TCHAR szChar[20];//定义字符缓冲区

          //_stprintf_s(szChar, 20, TEXT("您按下了%c"), wParam);

          swprintf_s(szChar, 20, TEXT("您按下了%c"), wParam);

          MessageBox(hwnd, szChar, TEXT("爱达人!"), 0);

          break;

     case WM_PAINT://绘图函数,在窗口上画画儿!

            hDC = BeginPaint(hwnd, &ps);

            //获得客户区大小

            GetClientRect(hwnd, &rect);  

            //绘制字符串---跟随客户区尺寸的变化而变化

            //TextOut(hDC, 200, 200, TEXT("爱达人!"), lstrlen(TEXT("爱达人!

")));//对比测试

            TextOut(hDC, cxClent / 5, cyClient / 5, TEXT("爱达人!"),

lstrlen(TEXT("爱达人!")));

            //绘制椭圆图形---跟随客户区尺寸的变化而变化

            //Ellipse(hDC, 250, 250, 1200, 500);//对比测试

            Ellipse(hDC, cxClent / 4 , cyClient / 4 , cxClent / 4 * 3, cyClient

/ 4 * 3);

            //绘制格式化文本,客户区中间垂直居中对齐

            DrawText(hDC, TEXT("我的第一个窗口程序!"), -1, &rect,DT_CENTER |

DT_VCENTER | DT_SINGLELINE);

            EndPaint(hwnd, &ps);

            break;

     case WM_CLOSE:

            if (IDYES == MessageBox(hwnd,TEXT("是否真的要退出?"),TEXT("爱达人

"),MB_YESNO))

            {

                DestroyWindow(hwnd);

                break;

            }

            else

                break;//不退出,并且什么都没做。

     case WM_DESTROY://处理退出消息

               PostQuitMessage(0);

               break;

     default:     //可以放在最后

         return DefWindowProc(hwnd, message, wParam, lParam);//调用默认窗口过程

     }

     return 0;

     //return DefWindowProc(hwnd, message, wParam, lParam); //调用默认窗口过程

}

/************************************注意**************************************

WM_CHAR消息:当TranslateMessage函数翻译WM_KEYDOWN消息时,将其发送到具有键盘焦点的窗口中。该WM_CHAR消息包含被按下的键的字符代码。

#define WM_CHAR                         0x0102

wParam:虚拟键代码经过翻译后的字符代码

lParam:描述击键消息的32位值,包括6个字段:重复计数、扫描代码、扩展键标志、上下文代码、前一个键状态标志和转换状态标志

备注

该WM_CHAR消息使用Unicode转换格式(UTF)-16。

*******************************************************************************

_stprintf_s函数:将若干个argument按照format格式存到buffer字符串缓冲区中。sprintf_s对于格式化string中的格式化的字符的有效性进行了检查,

sprintf_s也携带着接收格式化字符串的缓冲区的大小。右键查看函数的定义

int sprintf_s(

   char *buffer,        //字符串缓冲区

   size_t sizeOfBuffer, //字符串缓冲区的大小

   const char *format,  //格式化字符串

   ...                  //可选参数列表

);

*/

运行结果:

图2-8 WM_CHAR消息

 

总结

       1.此例中,在处理WM_CHAR消息时,取WM_CHAR消息的wParam参数(字符),通过MessageBox对话框输出。那么WM_CHAR消息又是从哪里来的呢?

       当用户按下键盘按键(字符键),会产生一个WM_KEYDOWN消息,并送入窗口消息队列,由主程序的消息循环GetMessage函数获取,然后经过TranslateMessage函数将WM_KEYDOWN消息中的虚拟键码转换为字符,并生成一个WM_CHAR消息送入消息队列。GetMessage函数再次从消息队列中取出WM_CHAR消息后,通过DispatchMessage函数分发给Windows系统,最后调用窗口过程处理WM_CHAR消息。

       2.【注意】本例中使用C标准库swprintf_s函数将wParam参数中的字符复制到缓冲区。swprintf_s函数需要添加头文件<tchar.h>。这里也可以使用_stprintf_s函数。二者的区别是:

swprintf_s适用于 Unicode 字符处理,而 _stprintf_s是一个通用的格式化函数,可以根据编译时的字符集选项来处理不同类型的字符。你可以根据自己的需要来选择使用适合的函数。

       3.本例WM_SIZE消息中调用了InvalidateRect函数,用于将指定的窗口或窗口的一部分标记为无效,并发送一个绘图消息给窗口,以便在下一次更新时重新绘制该区域。

InvalidateRect(hWnd, &rect, TRUE);//TRUE重绘窗口客户区背景。参数&rect为指定的无效矩形区域指针,TRUE表示重绘时清除背景。

2.2.11 第18练:处理WM_LBUTTONDOWN消息

/*------------------------------------------------------------------------

 018 编程达人win32 API每日一练

     第18个例子WM_LBUTTONDOWN.C:窗口过程---处理WM_LBUTTONDOWN消息    

     WM_LBUTTONDOWN消息--接收按下鼠标左键消息

注意:关闭窗口后,程序退出。

 (c) www.bcdaren.com 编程达人

-----------------------------------------------------------------------*/

#include <windows.h>

#include<tchar.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //消息回调函数

/*************************程序入口 ******************************************

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

    LPSTR lpCmdLine, int nCmdShow)

{

    static TCHAR szAppName[] = TEXT("HelloWin"); // 窗口类名

    ……(略)

    return msg.wParam;//msg.wParam 来自一条表示退出的消息,返回这个值给系统

}

 //*************************回调函数——消息处理过程*************************

 //窗口过程回调函数

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

     HDC hDC;       //设备环境——绘图的地方

     PAINTSTRUCT ps; //绘图结构体变量

     RECT rect;      //绘图区范围

     static int cxClent,cyClient;//客户区的宽度和高度,定义为静态局部变量

     switch (message)

     {

     case WM_CREATE: //创建窗口消息

          //return 0;

          break;    //也可以

     case WM_SIZE://更改窗口客户区大小的消息

          //GetClientRect(hWnd, &rect);//等价于lParam参数的作用

          //InvalidateRect(hWnd, &rect, TRUE);//TRUE重绘窗口客户区背景

          cxClent = LOWORD(lParam);//客户区的新宽度

          cyClient = HIWORD(lParam);//客户区的新高度

          break;

//操作系统捕获键盘按键消息送入消息队列,然后GetMessage消息循环从消息队列中取出

     //TranslateMessage(&msg);  //将虚拟键消息转换为字符消息

     //DispatchMessage(&msg);   //发送消息函数,先把msg发送给操作系统,然后由操作系统再调用Wndproc函数!

     case WM_CHAR:

          TCHAR szChar[20];

          _stprintf_s(szChar, 20, TEXT("您按下了%c"), wParam);

          MessageBox(hwnd, szChar, TEXT("爱达人!"), 0);

          break;

 //操作系统捕获鼠标按键消息送入消息队列,然后GetMessage消息循环从消息队列中取出

     //TranslateMessage(&msg);  //将虚拟键消息转换为字符消息

     //DispatchMessage(&msg);   //发送消息函数,先把msg发送给操作系统,然后由操作系统再调用Wndproc函数!

     case WM_LBUTTONDOWN:

          //可以调用自定义功能函数

          MessageBox(hwnd, TEXT("单击左键!"), TEXT("爱达人!"), 0);

          break;

     case WM_PAINT://绘图函数,在窗口上画画儿!

            hDC = BeginPaint(hwnd, &ps);

            //获得客户区大小

            GetClientRect(hwnd, &rect);  

            //绘制字符串---跟随客户区尺寸的变化而变化

            //TextOut(hDC, 200, 200, TEXT("爱达人!"), lstrlen(TEXT("爱达人!

")));//对比测试

            TextOut(hDC, cxClent / 5, cyClient / 5, TEXT("爱达人!"),

lstrlen(TEXT("爱达人!")));

            //绘制椭圆图形---跟随客户区尺寸的变化而变化

            //Ellipse(hDC, 250, 250, 1200, 500);//对比测试

            Ellipse(hDC, cxClent / 4 , cyClient / 4 , cxClent / 4 * 3, cyClient

/ 4 * 3);              

            //绘制格式化文本,客户区中间垂直居中对齐

            DrawText(hDC, TEXT("我的第一个窗口程序!"), -1, &rect,DT_CENTER |

 DT_VCENTER | DT_SINGLELINE);

            EndPaint(hwnd, &ps);

            break;

     case WM_CLOSE:

            if (IDYES == MessageBox(hwnd,TEXT("是否真的要退出?"),TEXT("爱达人

"),MB_YESNO))

            {

                DestroyWindow(hwnd);

                break;

            }

            else

                break;//不退出,并且什么都没做。

     case WM_DESTROY://处理退出消息

            PostQuitMessage(0);//此消息直接进入消息队列的头部!

            break;

     default:     //可以放在最后

         return DefWindowProc(hwnd, message, wParam, lParam);//调用默认窗口过程

     }

     return 0;

     //return DefWindowProc(hwnd, message, wParam, lParam); //调用默认窗口过程

}

/************************************注意**************************************

WM_LBUTTONDOWN消息:当光标在窗口的客户区域中时用户按下鼠标左键时发布。如果未捕获鼠标,则消息将发布到光标下方的窗口。

否则,该消息将发布到捕获鼠标的窗口中。窗口通过其WindowProc函数接收此消息。

C ++

#define WM_LBUTTONDOWN                  0x0201

参量

wParam指示各种虚拟键是否按下。此参数可以是以下一个或多个值。

MK_CONTROL     0x0008    CTRL键按下。

MK_LBUTTON     0x0001    鼠标左键按下。

MK_MBUTTON     0x0010    鼠标中键按下。

MK_RBUTTON     0x0002    鼠标右键按下。

MK_SHIFT       0x0004    SHIFT键按下。

MK_XBUTTON1    0x0020    第一个X按钮按下。

MK_XBUTTON2    0x0040    第二个X按钮按下。

lParam

低位字指定光标的x坐标。坐标相对于客户区域的左上角。

高阶字指定光标的y坐标。坐标相对于客户区域的左上角。

*/

运行结果:                                                                         

图2-9 WM_LBUTTONDOWN消息

 

总结

       1.当用户按下鼠标左键时,Windows操作系统捕获鼠标左键消息并送入窗口消息队列,由主程序的消息循环GetMessage函数获取,再由DispatchMessage函数分发给Windows系统,调用窗口过程处理WM_LBUTTONDOWN消息。

       2.wParam和lParam参数:wParam的前缀w是WORD的意思,表示一个16位无符号短整型,这是Win16位系统遗留,在32位系统中该类型改为UINT类型,但名称继续沿用。lParam的前缀 L是LONG长整型,32位长整数。

       不同消息的附属wParam参数和lParam参数具有不同的含义。

消息来源

wParam(高16位)

wParam(低16位)

lParam

键盘消息

ASCII码或虚拟键码

按键相关状态信息

鼠标消息

鼠标事件的附加信息

按键的相关状态信息

储存鼠标的坐标

菜单消息

0

低字为菜单ID

0

快捷键消息

1

快捷键ID

0

控件消息

控件通知码

控件ID

控件句柄

表2-1 wParam参数和lParam参数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/692533.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt5/6使用SqlServer用户连接操作SqlServer数据库

网上下载SQLServer2022express版数据库,这里没啥可说的,随你喜欢,也可以下载Develop版本。安装完后,我们可以直接连接尝试, 不过一般来说,还是下载SQLServer管理工具来连接数据更加方便。 所以直接下载ssms, 我在用的时候,一开始只能用Windows身份登录。 所以首先,我…

判断经纬度是否在某个城市内

一、从高德获取指定城市边界经纬度信息 通过apifox操作&#xff1a; 二、引入第三方jar包&#xff1a; maven地址&#xff1a;https://mvnrepository.com/ maven依赖&#xff1a; <dependency><groupId>org.locationtech.jts</groupId><artifactId>…

(论文翻译)Coordinate Attention for Efficient Mobile Network Design(坐标注意力 CVPR2021)

Coordinate Attention for Efficient Mobile Network Design&#xff08;CVPR2021&#xff09; 文章目录 Coordinate Attention for Efficient Mobile Network Design&#xff08;CVPR2021&#xff09;摘要1.引言2.相关工作3.方法&#xff1a;Coordinate Attention3.1.Revisit …

Golang | Leetcode Golang题解之第139题单词拆分

题目&#xff1a; 题解&#xff1a; func wordBreak(s string, wordDict []string) bool {wordDictSet : make(map[string]bool)for _, w : range wordDict {wordDictSet[w] true}dp : make([]bool, len(s) 1)dp[0] truefor i : 1; i < len(s); i {for j : 0; j < i;…

DBeaver连接MySQL提示“Public Key Retrieval is not allowed“问题的解决方式

问题描述 客户端root用户连接数据库出现出现Public Key Retrieval is not allowed 原因分析&#xff1a; 加上allowPublicKeyRetrievalfalse&#xff1a; 解决方案&#xff1a; allowPublicKeyRetrievaltrue&#xff1a;

ICLR24大模型提示(8) | 退一步思考:在大型语言模型中通过抽象引发推理

【摘要】我们提出了一种简单的提示技术&#xff0c;即后退提示法&#xff0c;它使 LLM 能够进行抽象&#xff0c;从包含特定细节的实例中得出高级概念和第一原理。通过使用概念和原理来指导推理&#xff0c;LLM 显著提高了遵循正确推理路径解决问题的能力。我们使用 PaLM-2L、G…

Go微服务: 分布式之通过可靠消息实现最终一致性

通过可靠消息实现最终一致性 可靠消息&#xff0c;就是靠普消息&#xff0c;还是基于之前的这个案例 比如这个订单服务&#xff0c;无论你是先发送消息&#xff0c;还是先新建订单&#xff0c;它其实都是发送的不可靠消息就是说如果这个消息&#xff0c;像mysql事务那样&#…

一维信号循环平移小波降噪方法(MATLAB R2021b)

循环平移算法由Coifman和Donoho最先提出&#xff0c;其基本原理是将信号进行循环平移&#xff0c;将平移后的信号降噪后再做逆循环平移&#xff0c;改变平移位数&#xff0c;多次重复上述运算&#xff0c;将获得的所有结果求平均&#xff0c;得到最后的结果。 在理想情况下&am…

【C++】深入理解decltype和decltype(auto)

深入理解decltype和decltype&#xff08;auto&#xff09; 一、decltype语法介绍二、decltype的推导规则1. expr不加括号2. expr加上括号 三、关于decltype的CV属性推导四、 decltype(auto) 的使用 一、decltype语法介绍 decltype关键字是C11新标准引入的关键字&#xff0c;它…

html--酷炫背景引导主页

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>ZZVIPS酷炫背景引导主页</title><meta name"viewport" content"widthdevice-width,initial-scale1,maximum-scale1,user-scala…

社区贡献者分享 | OpenVINO™ 代码贡献助力我的开源之路

点击蓝字 关注我们,让开发变得更有趣 作者 | 占俊坚 排版 | 李擎 摘要 在 OpenVINO™ 2024.1 release 版本中&#xff0c;我为 OpenVINO™ 添加了 TensorFlow 中的 Rint operation 以及 PyTorch 中的 aten::bucketize operation 的支持&#xff0c;在此分享我的实现过程&#x…

最快的开源UDP传输工具:Kcptun

Kcptun&#xff1a;极速网络隧道&#xff0c;让数据传输飞起来&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 kcptun 是一个轻量级、高性能的TCP/UDP网络加速工具&#xff0c;由xtaci开发并托管在GitHub上。它通过使用kcp协议&#xff0c;为网络数据传输提供了一个快…

深度解析:AI Prompt 提示词工程的兴起、争议与未来发展

PART1: 提示词工程的兴起 在人工智能领域中&#xff0c;一个新的领域——提示词工程&#xff08;prompt engineering&#xff09;——开始显露头角。 这个领域的核心在于精心设计输入&#xff0c;以引导AI模型产生特定的、期望的输出。 随着AI技术的飞速发展&#xff0c;特别…

移除重复节点---链表

面试题 02.01. 移除重复节点 - 力扣&#xff08;LeetCode&#xff09; 链表指针p和curr 与head指向同一块空间&#xff1b; p和head来比较相同的值&#xff0c;遇到一样的值、就改变这个空间里面struct的成员变量next指针指向的地址&#xff0c;跳向next的next再比较&#xf…

深度网络学习笔记(二)——Transformer架构详解(包括多头自注意力机制)

Transformer架构详解 前言Transformer的整体架构多头注意力机制&#xff08;Multi-Head Attention&#xff09;具体步骤1. 步骤12. 步骤23. 步骤34. 步骤4 Self-Attention应用与比较Self-Attention用于图像处理Self-Attention vs. CNNSelf-Attention vs. RNN Transformer架构详…

Kimichat使用案例010:快速识别出图片中的表格保存到Excel

文章目录 一、介绍二、图片信息三、输入内容四、输出内容五、markdown提示词六、markdown输出一、介绍 如果有一张图片格式的表格,想要快速复制到Excel表格中,那么一般要借助于OCR工具。之前试过不少在线OCR工具,识别效果差强人意。其实,kimichat就可以非常好的完成这个任务…

为什么需要在微服务中使用链路追踪?Spring Cloud 可以选择哪些微服务链路追踪方案?

引言&#xff1a;在当今的软件开发领域中&#xff0c;微服务架构已经成为了构建大型应用程序的主流方式之一。随着微服务数量的增加和服务之间复杂性的提高&#xff0c;对于了解和监控服务之间的调用关系变得越来越重要。而链路追踪技术的出现&#xff0c;为解决这一难题提供了…

心链13---主页切换功能 + loading特效 + 导航栏完善 + 队伍页接口修改

心链 — 伙伴匹配系统 直接取出所有用户&#xff0c;依次和当前用户计算分数&#xff0c;取 TOP N&#xff08;54 秒&#xff09; 优化方法&#xff1a; 切忌不要在数据量大的时候循环输出日志&#xff08;取消掉日志后 20 秒&#xff09;Map 存了所有的分数信息&#xff0c;占…

[ROS 系列学习教程] 建模与仿真 - 使用 Arbotix 控制机器人

ROS 系列学习教程(总目录) 本文目录 一、Arbotix 简介二、安装Arbotix三、配置Arbotix控制器四、配置launch启动文件五、数据交互接口六、在rviz中仿真控制机器人6.1 直接发topic控制6.2 使用键盘控制6.3 编写代码控制机器人移动 前面讲了机器人的建模&#xff0c;是静态的&…

力扣 240.搜素矩阵II

题目描述&#xff1a; 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9…