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

  • Автор темы Purple
  • Дата начала
P

Purple

Гость
#1
Проблема следующая: 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]
 
04.09.2006
2 566
2
Минск
#2
А зачем картинку загружать каждый раз в OnPaint? Загрузите ее при создании окна, а удалите в деструкторе
 
P

Purple

Гость
#3
Картинка может меняться по клику мыши.
Кстати со сменой картинок проблем нет - они меняются достаточно бодро. Проблема с отрисовкой стандартной графики - простых прямоугольников
 
04.09.2006
2 566
2
Минск
#4
Тогда копните в сторону отказа от AlphaBlend, помнится мне не слишком она быста. Попробуйте для тестов BitBlt, например
 
P

Purple

Гость
#5
Даже просто закоменченный Alphablend не ускорил отрисовку
 
04.09.2006
2 566
2
Минск
#6
Тогда проблема не в том коде, что вы привели. Возможно, слишком много раз вызывается перерисовка (не 2 раза как Вы говорите)
 
P

Purple

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