Я изучаю, как использовать Direct2D и DirectWrite. Я написал пример приложения, которое использует эти библиотеки для рендеринга контента непосредственно в главном (верхнем уровне) окне. Он работает нормально.Direct2D отображается в главном окне, но не дочернем окне
Теперь я пытаюсь переписать код рисования для дочернего окна в другом приложении. Исходный код использует GDI и отлично работает. Но когда я конвертирую его в Direct2D, ничего не появляется (дочернее окно выглядит черным).
Я упростил код картины до простой заливки клиентской области.
LRESULT PlotWnd::OnPaint(UINT, WPARAM, LPARAM, BOOL &) {
ATL::CComPtr<ID2D1Factory> pD2DFactory;
HRESULT hr = ::D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory);
assert(SUCCEEDED(hr));
ATL::CComPtr<ID2D1HwndRenderTarget> pRT;
RECT rc;
GetClientRect(&rc);
D2D1_SIZE_U size = D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top);
hr = pD2DFactory->CreateHwndRenderTarget(
D2D1::RenderTargetProperties(/* D2D1_RENDER_TARGET_TYPE_SOFTWARE */),
D2D1::HwndRenderTargetProperties(m_hWnd, size), &pRT);
assert(SUCCEEDED(hr));
pRT->BeginDraw();
pRT->Clear(D2D1::ColorF(D2D1::ColorF::Beige));
hr = pRT->EndDraw();
assert(SUCCEEDED(hr));
ValidateRect(nullptr);
return 0;
}
Все Direct2D вызовов успеха с S_OK
, так что я вроде в недоумении, где искать проблему. На данный момент единственное существенное различие, которое я вижу в моем рабочем эксперименте и этой программе, заключается в том, что в этом я использую Direct2D только в одном дочернем окне.
Так что мои вопросы: есть ли проблема, которую я пропускаю при использовании Direct2D в дочернем окне? Какие-нибудь советы по дальнейшему отладке?
Обновление: Я удалил статику, чтобы избежать путаницы. Я полностью настраиваю и разрываю Direct2D с каждой краской. Существует ровно один вызов краски с реальным размером.
Если я переключусь на рендеринг программного обеспечения (используя D2D1_RENDER_TARGET_TYPE_SOFTWARE
в целевых свойствах рендеринга), проблема исчезнет - я получаю бежевую заливку, как ожидалось.
Это привело меня к подозрению в моем графическом драйвере, который устарел. Но теперь я обновил свой графический драйвер, и он по-прежнему терпит неудачу таким же образом. Что еще может привести к отказу аппаратного рендеринга, если рендеринг программного обеспечения работает так, как ожидалось?
Обновление 2: Я все еще пытаюсь воспроизвести это небольшой, самодостаточный пример. Между тем, я заметил, что просто запуск Spy ++ будет иногда заставляет окно фактически отображать на экран (один раз).
Вы переопределили обработчик 'WM_ERASEBKGND', чтобы он не закрывал окно? –
@Roger Rowland: Да, мой обработчик WM_ERASKBKGND ничего не делает. Если у меня он заполняется произвольным цветом, тогда я вижу этот цвет вместо бежевой заливки, которую я ожидаю от команды Direct2D Clear. –
Хорошо, просто просматривая некоторые «очевидные» вещи - имеет ли родительское окно стиль 'WS_CLIPCHILDREN'? –