【问题标题】:C++ GDI+ clearing previous screenC++ GDI+ 清除上一个屏幕
【发布时间】:2018-12-20 03:36:42
【问题描述】:

所以我试图在它旁边绘制我的光标位置,到目前为止它工作得很好。期望它有时会从以前的帧中留下“痕迹”,所以我想知道如何清除它们?有什么快速的技巧吗?

这是一个快速的 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;
}

【问题讨论】:

标签: c++ frame gdi+ flush


【解决方案1】:

您不应该在桌面上绘图。您应该只在自己的窗口中绘制。如果您在桌面或其他任何人的窗口上绘制,它将在该窗口的下一个绘制周期被清除。这是无法控制的。

你也不能在控制台上画画。 Windows 控制台有自己的窗口和无法访问的绘制例程。控制台确实提供了许多功能,例如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创建一个窗口,以及一个窗口消息循环来响应WM_PAINT进行绘画,以及处理其他窗口消息。

请参阅Walkthrough: Creating Windows Desktop Applications 了解 Windows 编程简介,或参阅 Windows 编程入门书籍。

【讨论】:

    猜你喜欢
    • 2013-06-24
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 2010-11-26
    • 2016-01-15
    • 2017-03-15
    • 2019-10-23
    • 1970-01-01
    相关资源
    最近更新 更多