Я пишу приложение mfc. У меня есть простой CWnd
с OnEraseBkgnd
и OnPaint
. Я испытываю некоторые проблемы, когда другое окно частично покрывает мое окно.Обрезная область для OnEraseBkgnd отличается от области отсечения для OnPaint
Таким образом, когда покрытие закрывается, мой CWnd
получает WM_ERASEBKGND
. Я очищаю грязную область, и я возвращаю TRUE
. Что я вижу здесь, так это то, что CDC
У меня есть набор обрезков, и я использую его, так что только покрытая часть стирается. Это хорошо.
Но тогда приходит WM_PAINT
. CDC
Я получаю с GetDC
не имеют любую отсечную коробку, поэтому вся область окна перекрашивается. Это проблема, потому что в моем событии рисования я использую CDC::DrawText
с прозрачным фоном (CDC::SetBkMode(TRANSPARENT)
) и покраска того же текста в том же не стертом месте, что и текст становится «полужирным». Просто рисовать текст снова и снова в одном и том же месте без вытирания фона делает его выглядеть уродливым.
Это нормальное поведение? Мой подход одобрен?
EDIT:
Здесь я придаю больше о выпуске Информацию по.
SSCCE:
class Foo : public CFrameWnd
{
public:
BOOL OnEraseBkgnd(CDC* pDC)
{
CRect rect;
pDC->GetClipBox(rect);
HBRUSH brush = ::GetSysColorBrush(COLOR_WINDOW);
HGDIOBJ pOld = pDC->SelectObject(brush);
const BOOL result = pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);
pDC->SelectObject(pOld);
return result;
}
void OnPaint()
{
CWnd::OnPaint();
CDC *dc = GetDC();
CRect clipBox;
dc->GetClipBox(clipBox);
CRect rect;
GetClientRect(rect);
CFont *font = &globalFont; // in my app here is the font I use but it doesn't matter
HFONT hFont = static_cast<HFONT>(font->GetSafeHandle());
auto oldFont = dc->SelectObject(hFont);
const int bkMode = dc->SetBkMode(TRANSPARENT);
dc->DrawText("AAAAAAAAA", -1, rect, 0);
dc->SetBkMode(bkMode);
dc->SelectObject(oldFont);
}
DECLARE_MESSAGE_MAP()
};
Создание:
Foo* f = new Foo;
f->Create(0, "test", WS_VISIBLE| WS_OVERLAPPEDWINDOW);
Ниже, как делает окно выглядеть нормально:
И ниже после перемещения окна так, половину текста был вне монитора, а затем вернулся:
Так часть окна, которая была невидима была стерта, а затем текст был помещен снова. Для видимой части окна текст не стирался, а в OnPaint
был снова перерисован, вызывая «жирный».
Это может помочь, если вы дадите больше информации. Каковы флаги создания этого окна и другого окна (всплывающее, дочернее и т. Д.)? Каковы родители этого окна, а другое окно и каково отношение? ---- Что касается изменения текста, выделенного полужирным шрифтом, возможно, это связано с форматированием четкого типа, оно не становится жирным, но текст становится немного тяжелее, потому что вы пишете его, не стирая прежний текст. –
@BarmakShemirani Я добавил код и скриншоты –