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

Тема в разделе "MS Visual C++", создана пользователем kirrun, 8 апр 2007.

  1. kirrun

    kirrun Member

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

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

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

    Код (Text):
    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 уменьшить, допустим, шиирну, то фон в отрезанном куске виден... Как будто, я что-то не так делаю с маской...
     
  2. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Вот это не поможет?
    EE.com
    В самом конце страницы.
     
  3. kirrun

    kirrun Member

    Регистрация:
    8 апр 2007
    Сообщения:
    7
    Симпатии:
    0
    гм... Да, вопрос именно этот... Только они денег хотят... :)
     
  4. kirrun

    kirrun Member

    Регистрация:
    8 апр 2007
    Сообщения:
    7
    Симпатии:
    0
    Так все, проблема решена перечитыванием хелпа.

    Правильное использование такое:
    Код (Text):
    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 ненужные области залиты черным, иначе получится *цензура*
     
Загрузка...

Поделиться этой страницей