1

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

#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);

    }
}
4

1 回答 1

2

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

  1. 使用两个 DC - 一个由CreateCompatibleDC. 通过这种方式,您可以先准备图像,然后快速绘制它而不是窗口的 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);
  • 现在,实现WM_PAINT.WndProc

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

  • 明天继续钩。今天太晚了。或者,手动查看这篇文章。

于 2012-05-30T20:06:55.070 回答