我有点困难,如何在绘制的椭圆被绘制到其他地方后删除它。我需要一个圆圈来跟踪我的鼠标,这是程序应该做的所有事情。我得到了鼠标位置并绘制了我的圆圈但是如何删除最后一个呢?
#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);
}
}
答案 0 :(得分:2)
最好在屏幕上方使用透明窗口。这会容易得多。 Windows不是按照您刚才描述的方式运行的。为了优化速度,您有两种方法:
CreateCompatibleDC
创建的一个内存DC。通过这种方式,您可以先准备好图像,然后快速绘制它而不是窗口的DC。另请注意,您应该对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。