VS2022学习记录(一)——鼠标状态检测及窗口文字输出

 代码示例:

case WM_LBUTTONDOWN:                      //鼠标左键按下触发事件。
        color = RGB(255, 0, 0);           //更改全局变量颜色为红色
        GetCursorPos(&P);                 //获取鼠标位置坐标并赋值给全局位置变量P
        InvalidateRect(hWnd, NULL, TRUE); //重绘屏幕
        break;

case WM_RBUTTONDOWN:                      //鼠标右键按下触发事件。
        color = RGB(0, 0, 255);           //更改全局变量颜色为绿色
        GetCursorPos(&P);                 //获取鼠标位置坐标并赋值给全局位置变量P
        InvalidateRect(hWnd, NULL, TRUE); //重绘屏幕
        break;

case WM_MOUSEMOVE:                        //鼠标移动触发事件
        GetCursorPos(&P);                 //获取鼠标位置坐标并赋值给全局位置变量P
        InvalidateRect(hWnd, NULL, TRUE); //重绘屏幕
        break;
case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            // TODO: 在此处添加使用 hdc 的任何绘图代码...
            SetTextColor(hdc,color);      //设置窗口文本颜色为全局变量color
            TextOut(hdc, P.x, P.y, L"Hello World!", 12); 
            /*在窗口坐标(P.x, P.y)处输出全宽字符串"Hello World!"*/
            EndPaint(hWnd, &ps);
        }
        break;

第一步:鼠标输入通知


  • 鼠标左键按下消息。

WM_LBUTTONDOWN

当用户在光标位于窗口工作区中并且用户按下鼠标左键时发布。 如果未捕获鼠标,则会将消息发布到光标下的窗口。 否则,会将消息发送到捕获了鼠标的窗口。

窗口通过其 WindowProc 函数接收此消息。

  • 鼠标右键按下消息。

WM_RBUTTONDOWN

当光标位于窗口工作区中并且用户按下鼠标右键时发布。 如果未捕获鼠标,则会将消息发布到光标下的窗口。 否则,会将消息发送到捕获了鼠标的窗口。

窗口通过其 WindowProc 函数接收此消息。

  • 鼠标移动消息。

WM_MOUSEMOVE

当光标移动到窗口时发布。 如果未捕获鼠标,则会将消息发送到包含光标的窗口。 否则,会将消息发送到捕获了鼠标的窗口。

窗口通过其 WindowProc 函数接收此消息。


其他相关信息请参考键盘和鼠标输入 - Win32 apps | Microsoft Docs


第二步:坐标信息获取


 GetCursorPos函数

语法

BOOL GetCursorPos(
 [out] LPPOINT lpPoint 
);

参数

[out] lpPoint

类型:LPPOINT

指向 POINT 结构的指针,该结构接收光标的屏幕坐标。

返回值

类型: 布尔

如果成功,则返回非零值,否则返回零。


其他相关信息请参考GetCursorPos function (winuser.h) - Win32 apps | Microsoft Docs


第三步:重新绘制窗口以使得消息触发输出事件在窗口显示


InvalidateRect 函数

将矩形添加到指定窗口的更新区域。更新区域表示窗口工作区中必须重绘的部分。

语法

BOOL InvalidateRect(
 [in] HWND hWnd,
 [in] const RECT *lpRect,
 [in] BOOL bErase 
);

参数

[in] hWnd

更新区域已更改的窗口的句柄。如果此参数为 NULL,则系统将失效并重新绘制所有窗口,而不仅仅是此应用程序的窗口,并在函数返回之前发送WM_ERASEBKGND和WM_NCPAINT消息。不建议将此参数设置为 NULL

[in] lpRect

指向 RECT 结构的指针,该结构包含要添加到更新区域的矩形的客户端坐标。如果此参数为 NULL,则将整个工作区添加到更新区域。

[in] lpRect

指定在处理更新区域时是否擦除更新区域中的后台。如果此参数为 TRUE,则在调用 BeginPaint 函数时将擦除背景。如果此参数为 FALSE,则背景保持不变。

返回值

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

如果函数失败,则返回值为零。


其他请参考InvalidateRect function (winuser.h) - Win32 apps | Microsoft Docs


第四步:窗口文字输出


一、SetTextColor 函数

将指定设备上下文的文本颜色设置为指定的颜色。

语法

COLORREF SetTextColor(
  [in] HDC      hdc,
  [in] COLORREF color
);

参数

[in] hdc

设备上下文的句柄。

[in] color

文本的颜色。

返回值

如果函数成功,则返回值是作为 COLORREF 值的上一个文本颜色的颜色引用。

如果函数失败,则返回值CLR_INVALID。


其他请参考SetTextColor function (wingdi.h) - Win32 apps | Microsoft Docs


二、TextOut 函数

使用当前选定的字体、背景色和文本颜色在指定位置写入字符串。

语法

BOOL TextOutW(
  [in] HDC     hdc,
  [in] int     x,
  [in] int     y,
  [in] LPCWSTR lpString,
  [in] int     c
);

参数

[in] hdc

设备上下文的句柄。

[in] x

系统用于对齐字符串的参考点的 x 坐标(以逻辑坐标表示)。

[in] y

系统用于对齐字符串的参考点的 y 坐标(以逻辑坐标表示)。

[in] lpString

指向要绘制的字符串的指针。字符串不需要以零终止,因为 cchString 指定字符串的长度。

[in] c

lpString 所指向的字符串的长度,以字符为单位。

返回值

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

如果函数失败,则返回值为零。


其他请参考SetTextColor function (wingdi.h) - Win32 apps | Microsoft Docs


你可能感兴趣的:(VS2022学习记录,c++,visual,studio)