Изображение SVG не загружается в Firefox

Вам нужно использовать буфер для рисования. Вы можете создать память dc или использовать BeginBufferedPaint:

#include <uxtheme.h>
#pragma comment (lib, "uxtheme.lib")
...

case WM_PAINT:
{
    hdc = BeginPaint(hwnd, &ps);
    RECT rc;
    GetClientRect(hwnd, &rc);
    HDC memdc;
    auto hbuff = BeginBufferedPaint(hdc, &rc, BPBF_COMPATIBLEBITMAP, NULL, &memdc);
    Paint(memdc);
    EndBufferedPaint(hbuff, TRUE);
    EndPaint(hwnd, &ps);
    break;
}

Это должно исправить мерцание. Я бы предложил удалить таймер и обновить краску в перемещении мыши:

case WM_MOUSEMOVE:
    InvalidateRect(hwnd, NULL, NULL);
    break;

Вы также можете изучить флаг WS_EX_LAYERED с помощью SetLayeredWindowAttributes, это создаст прозрачное окно, которое отобразит рабочий стол под этим. Для простого рисования текста на самом деле не потребуется GDI +.

Кроме того, для большинства его классов Gdiplus имеет разные конструкторы, что позволяет избежать использования new / delete. Пример:

void DrawCursorCoords(Gdiplus::Graphics &graphics, Gdiplus::Bitmap&, Gdiplus::Color c)
{
    POINT cursorPos;
    GetCursorPos(&cursorPos);

    std::wstring x = std::to_wstring(cursorPos.x);
    std::wstring y = std::to_wstring(cursorPos.y);

    Gdiplus::Font font(L"Consolas", (Gdiplus::REAL)16);
    Gdiplus::SolidBrush brush(c);

    graphics.DrawString(x.c_str(), (int)x.length(), &font,
        Gdiplus::PointF((Gdiplus::REAL)cursorPos.x, (Gdiplus::REAL)cursorPos.y),
        &brush);

    graphics.DrawString(y.c_str(), (int)y.length(), &font,
        Gdiplus::PointF((Gdiplus::REAL)cursorPos.x, (Gdiplus::REAL)(cursorPos.y + 16)),
        &brush);
}

void Paint(HDC &hdc)
{
    Gdiplus::Graphics gfx(hdc);
    Gdiplus::Bitmap bmap(hbm, (HPALETTE)0);

    gfx.DrawImage(&bmap, 0, 0,
        GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));

    if(GetAsyncKeyState(VK_LBUTTON))
        DrawCursorCoords(gfx, bmap, (Gdiplus::Color)Gdiplus::Color::Red);
    else
        DrawCursorCoords(gfx, bmap, (Gdiplus::Color)Gdiplus::Color::Green);
}

Или вы можете объявить Gdiplus::Bitmap *bmap = new Gdiplus::Bitmap(hbm, NULL);, это делает копию hbm, поэтому вы можете сделать это более эффективным, объявив bmap глобальным и создав / уничтожьте его только один раз .

ReleaseDC(hwndDesktop, hdcDesktop);
DeleteDC(hdcDesktop); //<- not required

DeleteDC(hdcDesktop) не требуется. hdcDesktop был из GetDC, он очищен ReleaseDC

hbm = CreateCompatibleBitmap(...)
SelectObject(hdcCapture, hbm);
...
DeleteObject(hbm);

Вы также должны восстановить старое растровое изображение следующим образом:

 hbm = CreateCompatibleBitmap(...)
 auto oldbitmap = SelectObject(hdcCapture, hbm);
 ...
 //cleanup
 SelectObject(hdcCapture, oldbitmap);
 DeleteObject(hbm);

Хотя если вы не восстановите старое растровое изображение, окна будут пытаться исправить ошибку в любом случае, поэтому в большинстве случаев не будет никакой проблемы.

1
задан Anthony 19 January 2019 в 02:15
поделиться