Ускорение работы графики

Тема в разделе "MS Visual C++", создана пользователем Purple, 11 май 2010.

  1. Purple

    Purple Гость

    Проблема следующая: DrawButton иногда не успевает отработать. Invalidate(0) вызывается в OnLButtonDown. В OnLButtonUp() CurButton обнуляется и тоже вызывается Invalidate(0). Вопрос - как тут еще можно переделать код, если отрисовка притормаживает.

    <!--shcode--><pre><code class='CPP'>HBITMAP hLayout;
    CBitmap m_bmpNormal;
    COLORREF BkgndPixel;

    void CMyPanel::OnPaint()
    {
    CPaintDC dc(this); // device context for painting
    CDC memDc;
    if (!memDc.CreateCompatibleDC(&dc)) return;

    hLayout = SHLoadDIBitmap (BmpPath);
    m_bmpNormal.Attach (hLayout);

    HBITMAP m_hOldBitmap = (HBITMAP)::SelectObject(memDc.GetSafeHdc(), m_bmpNormal);
    dc.BitBlt(0, 0, 240, 122, &memDc, 0, 0, SRCCOPY);

    BkgndPixel = dc.GetPixel (0, 0);
    if (CurButton >=0) DrawButton(dc);

    ::SelectObject(memDc.GetSafeHdc(), m_hOldBitmap);

    m_bmpNormal.DeleteObject();
    memDc.DeleteDC();
    }

    void CMyPanel::DrawButton(CPaintDC &aDC) //Отрисовка типа нажатой кнопки
    {
    int x, y, height, width;

    /*здесь переменным присваиваются значения*/

    CBrush b;
    b.CreateSolidBrush (BkgndPixel);

    CPen p(PS_NULL, 5, RGB(255,0,0));
    aDC.SelectObject(p);
    aDC.SelectObject(b);
    aDC.Rectangle(x, y, x + width, y + 5);
    BLENDFUNCTION blend={AC_SRC_OVER,0,180, 0};
    AlphaBlend(aDC, x, y+5, width, 5, aDC, x, y, width, 5, blend);
    blend.SourceConstantAlpha = 100;
    AlphaBlend(aDC, x, y+10, width, 5, aDC, x, y, width, 5, blend);
    }[/CODE]
     
  2. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    А зачем картинку загружать каждый раз в OnPaint? Загрузите ее при создании окна, а удалите в деструкторе
     
  3. Purple

    Purple Гость

    Картинка может меняться по клику мыши.
    Кстати со сменой картинок проблем нет - они меняются достаточно бодро. Проблема с отрисовкой стандартной графики - простых прямоугольников
     
  4. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Тогда копните в сторону отказа от AlphaBlend, помнится мне не слишком она быста. Попробуйте для тестов BitBlt, например
     
  5. Purple

    Purple Гость

    Даже просто закоменченный Alphablend не ускорил отрисовку
     
  6. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Тогда проблема не в том коде, что вы привели. Возможно, слишком много раз вызывается перерисовка (не 2 раза как Вы говорите)
     
  7. Purple

    Purple Гость

    мм. Забыла добавить, что это WinCE. И OnPaint происходит несколько раз в секунду, даже если вообще ничего не трогать.
     
  8. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Если проект не большой, то можете выложить его здесь
     
Загрузка...

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