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

时间:2012-05-30 19:59:39

标签: c++ draw invalidation ellipse

我有点困难,如何在绘制的椭圆被绘制到其他地方后删除它。我需要一个圆圈来跟踪我的鼠标,这是程序应该做的所有事情。我得到了鼠标位置并绘制了我的圆圈但是如何删除最后一个呢?

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

    }
}

1 个答案:

答案 0 :(得分:2)

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

  1. 使用两个DC - 由CreateCompatibleDC创建的一个内存DC。通过这种方式,您可以先准备好图像,然后快速绘制它而不是窗口的DC。
  2. 记住矩形,您绘制圆圈并使此矩形无效。
  3. 另请注意,您应该对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的{​​{1}}部分中实现绘图。

      hdc = BeginPaint(hWnd,&amp; ps); POINT ptNew; 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); SelectObject(hdc,hold); DeleteObject的(HBR); ptOld = ptNew; EndPaint(hWnd,&amp; ps);

    • 明天会继续挂钩。今天为时已晚。或者,手动查看this article