Как создать перо того же цвета, что и у твердой кисти? - PullRequest
1 голос
/ 18 марта 2019

Я хотел бы получить цвет (colorref) SolidBrush для создания пера того же цвета, используя только функции Windows API (без точечной сети и тому подобное), используя C / C ++ / Asm / Delphi и т. Д.

Если это поможет, это то, чего я пытаюсь достичь: я нарисовал кривую, используя PolyLine в окне с изменяемым размером.

Разрешение Windows очищать фон при каждом изменении размера окна вызывает очень заметное мерцание. Чтобы свести к минимуму мерцание, я могу получить фоновую кисть, которую Windows использует для очистки окна (GetClassLongPr), и создать перо того же цвета, чтобы перерисовать только кривую с помощью этого пера, эффективно стирая ее, не стирая полностью клиентская область (именно это и вызывает мерцание). Конечно, я не могу создать это перо, если не найду способ получить colorref из дескриптора кисти, возвращаемого GetClassLongPtr.

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

ПРИМЕЧАНИЕ. Мне известно, что другим способом решения проблемы мерцания является создание области отсечения, которая приведет к стиранию только кривой, но обработка области выполняется намного медленнее, чем просто перерисовка кривой с пером, установленным на цвет фона. ,

После этого длинного рассказа возникает вопрос: как создать перо того же цвета, что и у сплошной кисти, используемой для стирания клиентской области окна?

Спасибо.

1 Ответ

2 голосов
/ 18 марта 2019

Вы получаете параметры сплошной кисти с помощью GetObject () в структуру LOGBRUSH , затем вы используете CreatePen () для создания пера.

Однако идея избежать мерцания состоит в том, чтобы использовать двойную буферизацию: не рисовать на DC, который вы получаете от GetDC (), а на DC памяти. Не используйте WM_ERASEBKGND для стирания фона, обработайте WM_ERASEBKGND и верните ненулевое значение, ничего не делая, вместо этого удалите его в WM_PAINT. Создайте DC памяти с помощью CreateCompatibleDC () , затем используйте BitBlt () , чтобы перенести чертеж в фактический DC.

Все это, если вообще все-таки используется GDI, сейчас предпочитаете Direct2D.

...