如何刷新/重绘屏幕(不是程序窗口)

How to refresh/redraw the screen (not the program window)

本文关键字:屏幕 程序 窗口 何刷新 刷新      更新时间:2023-10-16

我有点难以弄清楚,如何在其他地方绘制椭圆后将其删除。我需要一个圆圈来一直跟随我的鼠标,这就是程序应该做的所有事情。我获取鼠标位置并绘制我的圆圈,但如何删除最后一个?

#include <Windows.h>
#include <iostream>
void drawRect(int a1, int a2){
HDC screenDC = ::GetDC(0);
//Draw circle at mouse position
::Ellipse(screenDC, a1, a2+5, a1+9, a2+14);
::ReleaseDC(0, screenDC);
//::InvalidateRect(0, NULL, TRUE); //<- I tried that but then everything flickers
//Also, the refresh rate is not fast enough... still some circles left
}
int main(void)
{
int a1;
int a2;
bool exit=false;
while (exit!=true)
    {
    POINT cursorPos;
    GetCursorPos(&cursorPos);
    float x = 0;
    x = cursorPos.x; 
    float y = 0;
    y = cursorPos.y;
    a1=(int)cursorPos.x;
    a2=(int)cursorPos.y; 
    drawRect(a1, a2);
    }
}

你最好在整个屏幕上使用透明窗口。这将容易得多。Windows 并非设计为按照您刚才描述的方式运行。为了优化速度,您有两种方法:

  1. 使用两个 DC - 一个由 CreateCompatibleDC 创建的内存 DC。通过这种方式,您可以先准备图像,然后快速绘制它而不是窗口的 DC。
  2. 记住矩形,您在其中绘制了圆并仅使此矩形无效。

另请注意,您应该在WM_MOUSEMOVE消息上实现挂钩以接收它们。带有循环的程序将白白消耗 99% 的处理器时间。在 MSDN 中查找鼠标挂钩。

好的,这将是WinAPI。希望您知道如何编写 WinAPI 应用程序的基本内容,例如消息循环等。在任何情况下,您都可以将Visual Studio模板用于WinAPI应用程序。我会这样做的。首先,删除有关"关于"对话框和工作人员的无趣代码(如果您不知道该怎么做,可以跳过它)。接下来,您应该创建窗口:

  • 更新MyRegisterClass函数。取代

    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName = MAKEINTRESOURCE(IDC_...);

wcex.hbrBackground = CreateSolidBrush(RGB(128, 128, 128));
wcex.lpszMenuName = NULL;
  • 更新InitInstance函数。取代

    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

hWnd = CreateWindowEx(WS_EX_TOPMOST|WS_EX_LAYERED, szWindowClass, szTitle, WS_POPUP|WS_VISIBLE, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

在检查 hWnd 的一致性后立即添加以下代码行:

SetLayeredWindowAttributes(hWnd, RGB(128, 128, 128), 255, LWA_COLORKEY);

取代

ShowWindow(hWnd, nCmdShow);

ShowWindow(hWnd, SW_MAXIMIZE);
  • 现在,在WndProc WM_PAINT部分中实现绘图。

    hdc = BeginPaint(hWnd, &ps);点 pt新;GetCursorPos(&ptNew);HBRUSH hbr = CreateSolidBrush(RGB(255, 255, 255));HBRUSH hold = (HBRUSH)SelectObject(hdc, hbr);Ellipse(hdc, ptNew.x + 15, ptNew.y + 15, ptNew.x + 30, ptNew.y + 30);选择对象(hdc,保持);删除对象(hbr);ptOld = ptNew;EndPaint(hWnd, &ps);

  • 明天会继续上钩。今天为时已晚。或者,手动查看本文。