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

#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并非按照您刚才描述的方式运行。为了优化速度,您有两种方法:

  • 使用两个DC-一个内存DC由CreateCompatibleDC创建。这样,您可以先准备图像,然后快速绘制图像,而不是窗口的DC。
  • 记住矩形,您在其中绘制了圆并仅使该矩形无效。

  • 还要注意,您应该在WM_MOUSEMOVE消息上实现钩子(Hook)以接收它们。带有循环的程序将不消耗任何处理器时间的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_PAINTWndProc部分实现图形。

    hdc = BeginPaint(hWnd,&ps);
    POINT ptNew;
    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);
    SelectObject(hdc,保持);
    DeleteObject(hbr);
    ptOld = ptNew;
    EndPaint(hWnd,&ps);
  • 明天继续挂机。今天为时已晚。或者,手动查看this article
  • 10-07 21:05