gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:27:37 25 4
gpt4 key购买 nike

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

#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 消息上实现 Hook 以接收它们。带有循环的程序将白白吃掉 99% 的处理器时间。看MSDN用于鼠标 Hook 。

好的,这将是 WinAPI。希望您知道如何编写 WinAPI 应用程序的基本内容,例如消息循环和其他内容。在任何情况下,您都可以将 Visual Studio 模板用于 WinAPI 应用程序。我会这样做的。首先,去掉About对话框和staff的无趣代码(不知道干什么的可以跳过)。接下来,您应该创建窗口:

  • 更新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);
  • 现在,在 WndProcWM_PAINT 部分实现绘图。

    hdc = BeginPaint(hWnd, &ps);点 ptNew;GetCursorPos(&ptNew);HBRUSH hbr = CreateSolidBrush(RGB(255, 255, 255));HBRUSH hold = (HBRUSH)SelectObject(hdc, hbr);椭圆(hdc,ptNew.x + 15,ptNew.y + 15,ptNew.x + 30,ptNew.y + 30);SelectObject(hdc, hold);删除对象(hbr);ptOld = ptNew;EndPaint(hWnd, &ps);

  • 明天将继续 Hook 。今天太迟了。或者,查看 this article手动。

关于c++ - 如何刷新/重绘屏幕(不是程序窗口),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10823385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com