Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > почему мерцает


Автор: xTr1m 27.7.2006, 09:23
Код 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); 


Но почему-то кнопки на форме все равно мигают, когда я по ним мышкой бегаю. Почему? 

Автор: vvpC 27.7.2006, 11:14
а зачем это все рисовать в DrawItem да еще каждый раз создавать новый битмап? Достаточно создать его один раз когда изменяется размер кнопки. Точнее лучше создать три битмапа которые уже содержат изображения кнопки в зависимости от m_Mouse(*). А при отрисовке вызывать только BitBlt копирующий картинку из того битмапа, который нужен в данный момент. 

Автор: xTr1m 27.7.2006, 12:25
Попробую с тремя bitmap, спасибо 

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)