2009-08-04 6 views
0

Я пишу программу в C++ gdi gdi +. Рисование большого изображения на gdi + bitmap медленно использует gdi + api. Таким образом, я использовал следующий способ привлечь:не может нарисовать объект GDI + bitmap

Bitmap img(xxx); 
Graphics gr(&img); 
HDC dc = gr.GetHDC(); 
::StretchDIBits( 
    dc, 
    rec.left, rec.top, 
    (rec.right - rec.left), (rec.bottom - rec.top), 
    m_recRegin.left , m_recRegin.top, 
    m_recRegin.right - m_recRegin.left, m_recRegin.bottom - m_recRegin.top, 
    XXX, XXX, DIB_RGB_COLORS, SRCCOPY); 
gr.ReleaseHDC(dc); 

этот код отлично работать некоторое время. Но когда системный пул заполнен, создается множество совместимыхDC с большим размером CBitmap. Кажется, что ничто не может нанести на битмап.

Что случилось? когда эта часть кода не удалось, я все еще могу рисовать на графике с помощью GDI + API,

GetLastError() возвращение 8.

Большое спасибо!

+1

Обновить нас с помощью значения, возвращаемого функцией GetLastError() после вызова метода StretchDIBits(). – arul

ответ

1

GetLastError) возвращение 8

8 ("не хватает памяти для обработки команды."

Итак, у вас закончилось хранилище для использования GDI для выполнения ::StretchDIBits.

В будущем вы можете искать ошибки Windows из командной строки с помощью: net helpmsg <error in decimal>.

+0

Спасибо! но если это произойдет, как я могу сделать это достаточно для хранения GDI? – user25749

+0

Не создавайте так много контроллеров домена? Почему вам нужно столько DC, а не просто много растровых изображений? – MSN

0

В дополнение к тому, что говорили другие, объекты Graphics реализуют IDisposable. Это означает, что они, вероятно, (и на самом деле) держатся за ограниченный ресурс. Убедитесь, что вы вызываете «gr.Dispose()» или помещаете вещи в блок «using». Если это не удастся, он оставит его сборщику мусора, чтобы определить, когда объекты будут завершены, и их ресурсы будут выпущены. Это плохая практика для ресурсоемких объектов, таких как Graphics.

В зависимости от размера Растровые изображения также могут быть ресурсными, поскольку они могут съесть много ОЗУ. Если растровые изображения, используемые в вашем образце кода, никогда не ссылаются на него, также убедитесь, что они удаляются ...