如何刷新/重绘屏幕(不是程序窗口)
How to refresh/redraw the screen (not the program window)
我有点难以弄清楚,如何在其他地方绘制椭圆后将其删除。我需要一个圆圈来一直跟随我的鼠标,这就是程序应该做的所有事情。我获取鼠标位置并绘制我的圆圈,但如何删除最后一个?
#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 - 一个由
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);
现在,在
WndProc
WM_PAINT
部分中实现绘图。hdc = BeginPaint(hWnd, &ps);点 pt新;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);选择对象(hdc,保持);删除对象(hbr);ptOld = ptNew;EndPaint(hWnd, &ps);
明天会继续上钩。今天为时已晚。或者,手动查看本文。
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 截取屏幕截图后程序卡住
- QT快速C++应用程序与多个屏幕
- C++ Windows 凭据提供程序错误屏幕
- 将源文件扩展名从 .m 更改为 .mm 在屏幕保护程序项目的 Xcode 9.3 中失败
- Qt将应用程序与屏幕上的左上角对齐
- 如何在程序崩溃时关闭程序,没有任何警告屏幕等.C++窗口
- 如何在Qt Android应用程序上禁用屏幕保护程序
- 如何使用Qt读取我的应用程序屏幕像素数据
- 我的程序没有将字符显示在屏幕上
- 如何在C 编写的控制台应用程序中清除屏幕
- 在MFC C++应用程序中在屏幕上绘制点的最快方法
- 如何在预览窗口关闭后完成 SDL 屏幕保护程序应用程序
- 在win8登录屏幕上运行应用程序
- 使用C++在Windows 8中不固定到"开始屏幕"的应用程序快捷方式
- C++使用Qt库的应用程序在屏幕保护程序启动时停止工作
- 为什么DirectX全屏应用程序会提供黑色屏幕截图
- 当屏幕保护程序在Linux下启动或停止时,是否可以通知通知
- 如何防止我的屏幕截图制作控制台程序阻止屏幕截图
- 控制台应用程序屏幕在 Visual c++ 6.0 中消失