C++ GDI+ 清除上一屏幕
C++ GDI+ clearing previous screen
所以我试图在它旁边绘制我的光标位置,到目前为止它工作得很好。预计它有时会留下前几帧的 "trail",所以我想知道如何清除它们?有快速的技巧吗?
这是一个快速 GIF:
这是我的代码:
void DrawCursorCoords(Gdiplus::Graphics &graphics, Gdiplus::Font &font, Gdiplus::Brush &brush)
{
POINT cursorPos;
GetCursorPos(&cursorPos);
std::wstring x = std::to_wstring(cursorPos.x);
std::wstring y = std::to_wstring(cursorPos.y);
graphics.DrawString(x.c_str(), x.length(), &font, Gdiplus::PointF(cursorPos.x, cursorPos.y), &brush);
graphics.DrawString(y.c_str(), y.length(), &font, Gdiplus::PointF(cursorPos.x, cursorPos.y + 50), &brush);
}
int main()
{
// Start GDI+
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
// Initialize graphics, brushes etc...
HWND hWnd = GetDesktopWindow();
HDC hdc = GetDC(hWnd);
Gdiplus::Graphics * gfx = new Gdiplus::Graphics(hdc);
Gdiplus::Pen * pen = new Gdiplus::Pen(Gdiplus::Color(255, 0, 255));
Gdiplus::Font * cursorFont = new Gdiplus::Font(L"Consolas", 16);
Gdiplus::SolidBrush * cursorBrush = new Gdiplus::SolidBrush(Gdiplus::Color(255, 0, 0, 150));
Gdiplus::SolidBrush * clearBrush = new Gdiplus::SolidBrush(Gdiplus::Color::Transparent);
while (!GetAsyncKeyState(VK_INSERT))
{
printf("Drawing!\n");
DrawCursorCoords(*gfx, *cursorFont, *cursorBrush);
// 1. Super slow + just fills the screen black
//gfx->Clear(Gdiplus::Color::Transparent);
// 2. Doesn't "flush" anything?
//gfx->Flush();
// 3. Super slow + does nothing
//gfx->FillRectangle(clearBrush, Gdiplus::Rect(0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)));
}
printf("Stopped drawing!\n");
delete gfx;
delete pen;
delete cursorFont;
delete cursorBrush;
delete clearBrush;
ReleaseDC(hWnd, hdc);
Gdiplus::GdiplusShutdown(gdiplusToken);
return 0;
}
你不应该在桌面上画画。您应该只绘制自己的 window。如果您在桌面或任何其他人的 window 上绘制,它将在下一个绘制周期中被清除 window。这是不可能控制的。
你也不能在控制台上绘图。 Windows 控制台有它自己的 window 和它自己的不可访问的绘制例程。控制台确实提供了一些功能,例如 SetConsoleCursorPosition
允许在不同位置打印文本。
示例:
#include <Windows.h>
#include <iostream>
int main()
{
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
while(true)
{
COORD coord = { 0, 0 };
SetConsoleCursorPosition(hout, coord);
std::cout << "Move the mouse and click a key\n";
system("pause");
POINT pt;
GetCursorPos(&pt);
HWND hwnd = GetConsoleWindow();
RECT rc;
GetClientRect(hwnd, &rc);
ScreenToClient(hwnd, &pt);
CONSOLE_SCREEN_BUFFER_INFO inf;
GetConsoleScreenBufferInfo(hout, &inf);
coord.X = (SHORT)MulDiv(pt.x, inf.srWindow.Right, rc.right);
coord.Y = (SHORT)MulDiv(pt.y, inf.srWindow.Bottom, rc.bottom);
SetConsoleCursorPosition(hout, coord);
std::cout << "X";
}
return 0;
}
控制台的绘图选项有限。对于实际绘图,您必须使用 CreateWindow
创建一个 window,以及一个 window 消息循环来响应 WM_PAINT
进行绘图,以及处理其他 window 消息。
请参阅 Walkthrough: Creating Windows Desktop Applications 了解 windows 编程的介绍,或参阅 Windows 编程的介绍书籍。
所以我试图在它旁边绘制我的光标位置,到目前为止它工作得很好。预计它有时会留下前几帧的 "trail",所以我想知道如何清除它们?有快速的技巧吗?
这是一个快速 GIF:
这是我的代码:
void DrawCursorCoords(Gdiplus::Graphics &graphics, Gdiplus::Font &font, Gdiplus::Brush &brush)
{
POINT cursorPos;
GetCursorPos(&cursorPos);
std::wstring x = std::to_wstring(cursorPos.x);
std::wstring y = std::to_wstring(cursorPos.y);
graphics.DrawString(x.c_str(), x.length(), &font, Gdiplus::PointF(cursorPos.x, cursorPos.y), &brush);
graphics.DrawString(y.c_str(), y.length(), &font, Gdiplus::PointF(cursorPos.x, cursorPos.y + 50), &brush);
}
int main()
{
// Start GDI+
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
// Initialize graphics, brushes etc...
HWND hWnd = GetDesktopWindow();
HDC hdc = GetDC(hWnd);
Gdiplus::Graphics * gfx = new Gdiplus::Graphics(hdc);
Gdiplus::Pen * pen = new Gdiplus::Pen(Gdiplus::Color(255, 0, 255));
Gdiplus::Font * cursorFont = new Gdiplus::Font(L"Consolas", 16);
Gdiplus::SolidBrush * cursorBrush = new Gdiplus::SolidBrush(Gdiplus::Color(255, 0, 0, 150));
Gdiplus::SolidBrush * clearBrush = new Gdiplus::SolidBrush(Gdiplus::Color::Transparent);
while (!GetAsyncKeyState(VK_INSERT))
{
printf("Drawing!\n");
DrawCursorCoords(*gfx, *cursorFont, *cursorBrush);
// 1. Super slow + just fills the screen black
//gfx->Clear(Gdiplus::Color::Transparent);
// 2. Doesn't "flush" anything?
//gfx->Flush();
// 3. Super slow + does nothing
//gfx->FillRectangle(clearBrush, Gdiplus::Rect(0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)));
}
printf("Stopped drawing!\n");
delete gfx;
delete pen;
delete cursorFont;
delete cursorBrush;
delete clearBrush;
ReleaseDC(hWnd, hdc);
Gdiplus::GdiplusShutdown(gdiplusToken);
return 0;
}
你不应该在桌面上画画。您应该只绘制自己的 window。如果您在桌面或任何其他人的 window 上绘制,它将在下一个绘制周期中被清除 window。这是不可能控制的。
你也不能在控制台上绘图。 Windows 控制台有它自己的 window 和它自己的不可访问的绘制例程。控制台确实提供了一些功能,例如 SetConsoleCursorPosition
允许在不同位置打印文本。
示例:
#include <Windows.h>
#include <iostream>
int main()
{
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
while(true)
{
COORD coord = { 0, 0 };
SetConsoleCursorPosition(hout, coord);
std::cout << "Move the mouse and click a key\n";
system("pause");
POINT pt;
GetCursorPos(&pt);
HWND hwnd = GetConsoleWindow();
RECT rc;
GetClientRect(hwnd, &rc);
ScreenToClient(hwnd, &pt);
CONSOLE_SCREEN_BUFFER_INFO inf;
GetConsoleScreenBufferInfo(hout, &inf);
coord.X = (SHORT)MulDiv(pt.x, inf.srWindow.Right, rc.right);
coord.Y = (SHORT)MulDiv(pt.y, inf.srWindow.Bottom, rc.bottom);
SetConsoleCursorPosition(hout, coord);
std::cout << "X";
}
return 0;
}
控制台的绘图选项有限。对于实际绘图,您必须使用 CreateWindow
创建一个 window,以及一个 window 消息循环来响应 WM_PAINT
进行绘图,以及处理其他 window 消息。
请参阅 Walkthrough: Creating Windows Desktop Applications 了解 windows 编程的介绍,或参阅 Windows 编程的介绍书籍。