绘制控件位图背景--需要注意的问题
2009-12-11 20:57
309 查看
绘制控件位图背景,在控件存在滚动条的情形下,需要格外的主意:
滚动条使控件窗口滚动了,当前DC的原点的也滚动了, 必须考虑DC滚动带来的偏差,否则 如果始终把一个位图从DC的(0,0)点绘制,那么位图会变得乱七八糟。
下面的代码是在 OnPaint 中考虑了滚动条带来的影响 实例代码:
滚动条的位置 就是 窗口偏移的大小。
滚动条使控件窗口滚动了,当前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 ); }
相关文章推荐
- android ListView item 点击设置背景图片需要注意的问题
- 在使用 CCRenderTexture、shader 绘制几何图元时需要注意的一些细节问题
- mfc ocx 控件开发需要注意的问题
- WM_CTLCOLOR消息,绘制子控件背景问题
- ASP.NET数据控件绑定需要注意的问题
- ZedGraph控件重新绘制时需要注意的…
- 当ListView控件在后台绑定数据源时,用DataPager控件分页需要注意的问题
- 当ListView控件在后台绑定数据源时,用DataPager控件分页需要注意的问题
- 使用layoutParams设置控件高宽需要注意的问题
- Mater-Details数据查询修改时,在用DetailsView进行新建,编辑(添加DropDownList控件)应用时需要注意的几点问题
- 在重绘了背景的对话框上用双缓冲绘图的方式绘制picture控件时出现的问题
- MFC中让控件随窗体大小变化而变化中需要注意的问题
- 使用layoutParams设置控件高宽需要注意的问题
- 在使用 CCRenderTexture、shader 绘制几何图元时需要注意的一些细节问题
- 解析256色位图需要注意的一些问题
- replaceAll、replaceFirst使用需要注意的问题
- 应届生面试过程中需要注意的问题
- 用range进行python循环需要注意的问题
- web程序使用Oracle需要注意的问题.
- Python初学者需要注意的问题