我很难弄清楚如何在绘制到其他地方后绘制椭圆。我需要一个圆圈来始终跟随我的鼠标,这是程序所要做的。我得到了鼠标位置并绘制了圆圈,但是如何删除最后一个?
#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并非按照您刚才描述的方式运行。为了优化速度,您有两种方法:
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_PAINT
的WndProc
部分实现图形。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);