2017-01-21 11 views
1

У меня есть небольшая библиотека 2D-рендеринга на C++, которая работает в приложениях Win32 и использует Direct2D для рисования. Я вызвал BeginDraw(), выполнил загрузку чертежа, а затем вызвал DrawText(). Это, конечно же, перед EndDraw().Почему мой вызов D2D1 :: RenderTarget :: DrawText() приводит к повторному отправке WM_PAINT?

Вместо того чтобы возвращаться, чтобы я мог выполнять вызовы функций рендеринга, он останавливается, потому что он отправил WM_PAINT (предположительно, не дожидаясь). (И будет продолжать отправлять сообщение, пока, возможно, окно не будет проверено? t know)

Я попытался поймать вызов и проверить, если я рисую в то время, и в этом случае притвориться, что я обработал сообщение правильно (но без фактической проверки какого-либо региона клиента вручную), но он просто сохраняет отправка его, а DrawText() не возвращается.

Это нормальное поведение и что с этим делать?

(Я использую Visual Studio 2013 сообщества, а также.)

+1

'WM_PAINT' будет продолжаться, пока вы не нарисуете или не проверите свое окно. Если вам все равно (потому что вы не используете GDI), тогда просто вызывайте «BeginPaint», а затем «EndPaint». –

+0

Спасибо Раймонду. Я не понимаю, почему он отправляет один из DrawText ID2D1 :: RenderTarget в любом случае, когда он не делает этого при использовании таких функций, как DrawLine или DrawRect. Есть идеи? –

+0

То, что вы описываете, звучит странно для меня. У меня есть тестовое приложение самостоятельно, где я выполняю DrawTextLayout() в обработчике WM_PAINT, после EndDraw() я просто проверяю ValidateRect (hwnd, NULL), и он работает нормально. Не могли бы вы показать часть своего кода? Предположительно, это HwndRenderTarget, не так ли? Какая версия Windows? – bunglehead

ответ

0

Я нашел ошибку в конце концов.

Один из параметров, переданных функции DIrect2D, был недопустимым указателем объекта, поскольку я не знал, что я уже выпустил память, а затем пытался использовать объект для рисования материала. Если бы я знал, что шаблон памяти по умолчанию для выпущенных указателей Direct2D был 0xcdcdcdcd (или что-то в этом роде), я бы это раньше видел.

По какой-то причине без ведома человека это вызвало ошибку WM_PAINT ... ужасающую ошибку.

Спасибо всем!