• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

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

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]
 
E

European

А зачем картинку загружать каждый раз в OnPaint? Загрузите ее при создании окна, а удалите в деструкторе
 
P

Purple

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

European

Тогда копните в сторону отказа от AlphaBlend, помнится мне не слишком она быста. Попробуйте для тестов BitBlt, например
 
P

Purple

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

European

Тогда проблема не в том коде, что вы привели. Возможно, слишком много раз вызывается перерисовка (не 2 раза как Вы говорите)
 
P

Purple

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

European

Если проект не большой, то можете выложить его здесь
 
Мы в соцсетях:

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