您的位置:首页 > 其它

绘制控件位图背景--需要注意的问题

2009-12-11 20:57 309 查看
绘制控件位图背景,在控件存在滚动条的情形下,需要格外的主意:

滚动条使控件窗口滚动了,当前DC的原点的也滚动了, 必须考虑DC滚动带来的偏差,否则 如果始终把一个位图从DC的(0,0)点绘制,那么位图会变得乱七八糟。

下面的代码是在 OnPaint 中考虑了滚动条带来的影响 实例代码:
滚动条的位置 就是 窗口偏移的大小。

void VividTree::OnPaint()
{
CPaintDC dc(this);
CDC dc_ff;
CBitmap bm_ff;
CBitmap *bm_old;
CFont *font, *old_font;
CFont fontDC;
int old_mode;

GetClientRect(&m_rect);
SCROLLINFO scroll_info;

// 确定窗口原点的偏移。 当滚动条移动时,背景和Item的绘制需要根据原点偏移做调整(因为当前PaintDC的起点偏移了)
// BEGIN
if ( GetScrollInfo( SB_HORZ, &scroll_info, SIF_POS | SIF_RANGE ) )
{
m_h_offset = -scroll_info.nPos;
m_h_size = max( scroll_info.nMax+1, m_rect.Width());
}
else
{
m_h_offset = m_rect.left;
m_h_size = m_rect.Width();
}

if ( GetScrollInfo( SB_VERT, &scroll_info, SIF_POS | SIF_RANGE ) )
{
if ( scroll_info.nMin == 0 && scroll_info.nMax == 100)
scroll_info.nMax = 0;
m_v_offset = -scroll_info.nPos * GetItemHeight();
m_v_size = max( (scroll_info.nMax+2)*((int)GetItemHeight()+1), m_rect.Height() );
}
else
{
m_v_offset = m_rect.top;
m_v_size = m_rect.Height();
}
TRACE("滚动条偏移  m_h_offset: [%d] m_h_size:[%d]  m_v_offset:[%d] m_v_size:[%d]/n", m_h_offset, m_h_size, m_v_offset, m_v_size);
// END

// 创建 PaintDC 的MemDC
dc_ff.CreateCompatibleDC( &dc );
bm_ff.CreateCompatibleBitmap( &dc, m_rect.Width(), m_rect.Height() );
bm_old = (CBitmap *)dc_ff.SelectObject( &bm_ff );

// MemDC中字体和当前控件字体类型不同,使一致
font = GetFont();
old_font = dc_ff.SelectObject( font );
old_mode = dc_ff.SetBkMode( TRANSPARENT );

// 背景和Item绘制到MemDC上
DrawBackGround( &dc_ff );
DrawItems( &dc_ff );

//把MemDC中的内容传送到真正的设备DC
dc.BitBlt( m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(), &dc_ff, 0, 0, SRCCOPY);

// 恢复DC内容
dc_ff.SelectObject( old_font );
dc_ff.SetBkMode( old_mode );
dc_ff.SelectObject( bm_old );
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: