не может рисовать на GDI + растровый объект - PullRequest
0 голосов
/ 04 августа 2009

Я пишу программу на c ++ gdi gdi +. Рисование большого изображения на gdi + растровое изображение выполняется медленно с использованием gdi + api. Поэтому я использовал следующий способ рисования:

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. Кажется, не может нарисовать что-либо на растровом изображении.

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

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

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

Ответы [ 2 ]

1 голос
/ 04 августа 2009

GetLastError () возвращает 8

8: «Недостаточно памяти для обработки этой команды.»

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

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

0 голосов
/ 21 ноября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...