2012-05-30 50 views
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); 

    } 
} 

回答

2

您最好在屏幕上方使用透明窗口。这会容易得多。 Windows的设计并不像你刚刚描述的那样。为了优化速度,您有两种方法:

  1. 使用两个DC - 一个由CreateCompatibleDC创建的存储器DC。这样,您可以先准备好图像,然后快速绘制图像,而不是窗口的DC。
  2. 记住矩形,您已经绘制了圆形并仅使该矩形失效。

另外请注意,你应该实现一个挂钩WM_MOUSEMOVE消息以接收它们。循环程序将占用99%的处理器时间。看看MSDN鼠标钩。

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

  • 更新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); 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,hold); DeleteObject(hbr); ptOld = ptNew; EndPaint(hWnd,& ps);

  • 明天会继续上钩。今天太晚了。或者,手动查看this article

+0

嗯,我读过关于此之前,但我不完全明白。正如我所说的,我第一次使用这个工具,而且我更像是一个系统管理员而不是程序员。你知道我可以看一些例子吗? – mohrphium

+0

会尝试,但这需要一些时间来思考。第一个问题是:你想要简单的WinAPI或MFC的提示吗? – Forgottn

+0

无论哪种方法更容易实现,因为我对其中任何一方都没有经验。 – mohrphium