Поиск:

Ответ в темуСоздание новой темы Создание опроса
> почему мерцает 
:(
    Опции темы
xTr1m
Дата 27.7.2006, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: нет
Всего: 1



Код DrawItem для кнопки

Код

CDC *dc = CDC::FromHandle(lpDIS->hDC);

    CBrush *brush = dc->GetCurrentBrush();
    LOGBRUSH log;
    brush->GetLogBrush(&log);

    CBrush br(log.lbColor);
    CBrush br_shadow(GetSysColor(COLOR_BTNSHADOW));
    CBrush br_btn_down(GetSysColor(COLOR_3DHIGHLIGHT));
    
    CRect rect, rect_border;
    GetClientRect(&rect);
    rect_border = rect;
    
    CDC mem;
    mem. CreateCompatibleDC(dc);  
    CBitmap bit_map;
    bit_map.CreateCompatibleBitmap(dc,rect.Width(),rect.Height());  
    mem.SelectObject(&bit_map);
    mem.FillSolidRect(&rect,RGB(212,208,200));
    mem.FillSolidRect(&rect,log.lbColor);
    
    if(!m_MouseOver)
    {
        //br.CreateSysColorBrush(COLOR_BTNHILIGHT);
        mem.SelectStockObject(NULL_BRUSH);
        mem.SelectStockObject(NULL_PEN);
        mem.Rectangle(&rect);
    }
    else if(m_MouseOver && !m_MouseDown)
    {
        rect.bottom -= 1;
        rect.right -= 1;

        mem.SelectObject(&br_shadow);
        mem.SelectStockObject(NULL_PEN);
        mem.Rectangle(&rect_border);

        mem.SelectObject(&br);
        mem.Rectangle(&rect);
        
        mem.SelectStockObject(WHITE_PEN);
        mem.MoveTo(rect.left, rect.top);
        mem.LineTo(rect.right, rect.top);
        mem.MoveTo(rect.left, rect.top);
        mem.LineTo(rect.left, rect.bottom);
    }
    else if(m_MouseOver && m_MouseDown)
    {
        rect.top += 1;
        rect.left += 1;

        mem.SelectObject(&br_shadow);
        mem.SelectStockObject(NULL_PEN);
        mem.Rectangle(&rect_border);

        mem.SelectObject(&br_btn_down);
        mem.Rectangle(&rect);    
    }

    mem.SetBkMode(TRANSPARENT);
    CString temp;
    GetWindowText(temp);
    mem.DrawText(temp, &rect, DT_VCENTER |  DT_CENTER | DT_SINGLELINE);

    dc->BitBlt(0,0,rect.Width(),rect.Height(),&mem,0,0,SRCCOPY); 


Но почему-то кнопки на форме все равно мигают, когда я по ним мышкой бегаю. Почему? 
PM MAIL WWW ICQ   Вверх
vvpC
Дата 27.7.2006, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 20.5.2006
Где: Москва

Репутация: нет
Всего: нет



а зачем это все рисовать в DrawItem да еще каждый раз создавать новый битмап? Достаточно создать его один раз когда изменяется размер кнопки. Точнее лучше создать три битмапа которые уже содержат изображения кнопки в зависимости от m_Mouse(*). А при отрисовке вызывать только BitBlt копирующий картинку из того битмапа, который нужен в данный момент. 
PM MAIL WWW   Вверх
xTr1m
Дата 27.7.2006, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: нет
Всего: 1



Попробую с тремя bitmap, спасибо 
PM MAIL WWW ICQ   Вверх
Earnest
Дата 27.7.2006, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



И еще убедись, что EraseBackgnd не стирает фон при каждом redraw: перехвати и ничего не делая верни TRUE. 


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0442 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.