• Бесплатный ВЕБИНАР по OSINT с Екатериной Тьюринг: ➡️9 февраля в 19:00 (мск) пройдет урок

    Как безопасно искать информацию в открытых источниках

    🔥 Записаться 🔥

[mfc] Трабла с рисованием и маской

  • Автор темы Автор темы kirrun
  • Дата начала Дата начала
K

kirrun

Пишу игру "Бильряд" используя MFC (я не извращенец, это задание такое).
Суть в том, что чтобы избежать мерцания, пришлось восопльзоваться бэкбуферами, т.е. сначала все рисуется в виртуальном CDC в памяти, а потом BitBlt копируется в реальный.

Возникло у меня желание позади всей это щтуки подолжить фон. Но игра-то рендерится каждые n мс, ибо обновляется, а фон столько рисовать не надо. Ему достаточно в WM_PAINT нарисоватьсядин раз. Всвязи с тем, захотелось дать понять всему этому делу, что рисовать надо только там, где есть объекты, а фон трогать не надо. Не беда. Создал контекст-маску, попутно отрисовываю в нем объекты беленьким цветом, а потом копирую при помощи MaskBlt исползуюя получившуюся маску. Только вот что странно, рисуется все нормлаьно, но поверх фона таки закрашивается все черным. Соответственно, если всю маску залить черным цветом, я получаю сплошную темноту вместо фона... Непонятно...

Вот код (вырезки):

Код:
void BGame::Render(void)
{
CClientDC pdc(dlg);

// Creating BackBuffer
CDC memdc;
memdc.CreateCompatibleDC(&pdc);
CBitmap membmp;
membmp.CreateCompatibleBitmap(&pdc, border->Width(), border->Height());
memdc.SelectObject(&membmp);
//memdc.FillRect(CRect(0,0,border->Width(), border->Height()), &CBrush(RGB(0, 0, 0)));

// Creating MaskBuffer
CDC maskdc;
maskdc.CreateCompatibleDC(&pdc);
CBitmap maskbmp;
maskbmp.CreateCompatibleBitmap(&maskdc, border->Width(), border->Height());
maskdc.SelectObject(&maskbmp);


// Rendering objects to BackBuffer
BObj *obj=0;
for (long i=0; i<objs.Count(); i++)
if (objs[i]->GetStatus(BITS_NEEDSRENDER)) {
obj = objs[i];
obj->SetPos(obj->GetPos()+field->GetLT()); //offset
obj->Render(&memdc); // Rendering objects
obj->Render(&maskdc, false); // Rendering only with white color to mask
obj->SetPos(obj->GetPos()-field->GetLT()); //offset
}

// Copying BackBuffer to real dlg's DC
pdc.MaskBlt((int)border->GetLT().GetX(), (int)border->GetLT().GetY(), border->Width(), border->Height(), &memdc, 0, 0, maskbmp, 0, 0, SRCCOPY);

// Cleaning
maskbmp.DeleteObject();
maskdc.DeleteDC();
membmp.DeleteObject();
memdc.DeleteDC();
}

Еще добавлю, что если кощунственно при создании memdc уменьшить, допустим, шиирну, то фон в отрезанном куске виден... Как будто, я что-то не так делаю с маской...
 
Вот это не поможет?

В самом конце страницы.
 
гм... Да, вопрос именно этот... Только они денег хотят... :)
 
Так все, проблема решена перечитыванием хелпа.

Правильное использование такое:
Код:
pdc.MaskBlt((int)border->GetLT().GetX(), (int)border->GetLT().GetY(), (int)border->Width(), (int)border->Height(), &memdc, 0, 0, maskbmp, 0, 0, MAKEROP4(SRCCOPY, SRCPAINT));
(это при условии, что в memdc ненужные области залиты черным, иначе получится *цензура*
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!