Работа с HBitmaps

Я пытаюсь сохранить некоторые HBITMAP в массив и отобразить их позже. Создание HBITMAP из DC работает, но когда я пытаюсь отобразить сохраненный HBITMAP, я, кажется, получаю неправильный. Это заставляет меня думать, что я не совсем понял, как HTBIMAP хранятся в памяти. Я предполагал, что тип данных HBITMAP, по сути, является указателем на объект в памяти и это все, что мне нужно, но, может быть, это еще не все?

Вот пример кода:

HBITMAP aBitMaps[NUM_BITMAPS];
int iNumBitMaps;

void SaveScreen(CDC *dc)
{
  if (iNumBitMaps>0)
  {
    if (iNumBitMaps>=NUM_BITMAPS)
    {
      iNumBitMaps=NUM_BITMAPS-1;
      DeleteObject(aBitMaps[iNumBitMaps]);
    }
    for (int i=iNumBitMaps;i>0;i--)
    {
      aBitMaps[i] = aBitMaps[i-1];
    }
  }
  iNumBitMaps++;
  aBitMaps[0] = CreateCompatibleBitmap(dc->m_hDC, 800, 800);
  HDC hdcMem = CreateCompatibleDC(dc->m_hDC);
  SelectObject(hdcMem, aBitMaps[0]);
  BitBlt(hdcMem, 0, 0, 800, 800, dc->m_hDC, 0, 0, SRCCOPY);
  ReleaseDC(hdcMem);
}

void RestoreScreen(CDC *dc, int i)
{
  if (i>=NUM_BITMAPS) i = NUM_BITMAPS-1;
  if (i<0) i = 0;
  HDC hdcMem = CreateCompatibleDC(dc->m_hDC);
  SelectObject(hdcMem, aBitMaps[i]);
  BitBlt(dc->m_hDC, 0, 0, 800, 800, hdcMem, 0, 0, SRCCOPY);
  ReleaseDC(hdcMem);
}

Таким образом, идея по существу состоит в том, чтобы поместить указатели HBITMAP в массив и позднее отобразить любое из сохраненных изображений, выделив его в DC памяти и затем скопировав его в фактический DC. Что с этим не так?

Я использую VC++, Visual Studio 2010, без MFC.

РЕДАКТИРОВАТЬ:

Я сделал еще несколько тестов. Для отладки я попытался отобразить все сохраненные растровые изображения (смещенные в позиции), добавив следующее for цикл до SaveScreen

...
BitBlt(hdcMem, 0, 0, 800, 800, dc->m_hDC, 0, 0, SRCCOPY);
for (int j=0; j<iNumBitMaps;j++)
{
  SelectObject(hdcMem, aBitMaps[j]);
  BitBlt(dc->m_hDC, 20*(j+1), 100*(j+1), 800+20*(j+1), 800+100*(j+1), hdcMem, 0, 0, SRCCOPY);
}
ReleaseDC(hdcMem);

Это тогда отображает iNumBitMaps раз изображение, но это всегда одно и то же изображение (а именно то, что я сохранил в aBitMaps[0]). Я проверял в отладчике, что aBitMaps содержит все разные указатели. Итак, почему-то я думаю, что неправильно загружаю растровые изображения в память DC.

1 ответ

Решение

Я понял. В моем коде выше было две ошибки (о которых я знаю). Во-первых, память DC должна быть удалена после использования, поэтому ReleaseDC должен быть заменен DeleteDC,

Во-вторых, нужно знать, что объект, выбранный в DC, не может быть выбран в другой DC. Следовательно, важно, чтобы после работы с объектом в DC памяти объект должен был быть выгружен путем выбора предыдущего объекта DC. Таким образом, правильное конструирование

HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, aBitMaps[0]);
BitBlt(...);
HBITMAP hbmNew = (HBITMAP)SelectObject(hdcMem, hbmOld);

где сейчас hbmNew указывает на тот же объект, что и aBitMaps[0],

Другие вопросы по тегам