繪製控制項位元影像背景–需要注意的問題
來源:互聯網
上載者:User
繪製控制項位元影像背景,在控制項存在捲軸的情形下,需要格外的主意: 捲軸使控制項視窗滾動了,當前DC的原點的也滾動了, 必須考慮DC滾動帶來的偏差,否則 如果始終把一個位元影像從DC的(0,0)點繪製,那麼位元影像會變得亂七八糟。 下面的代碼是在 OnPaint 中考慮了捲軸帶來的影響 執行個體代碼:
捲軸的位置 就是 視窗位移的大小。
void VividTree::OnPaint()<br />{<br />CPaintDC dc(this);<br />CDC dc_ff;<br />CBitmap bm_ff;<br />CBitmap *bm_old;<br />CFont *font, *old_font;<br />CFont fontDC;<br />int old_mode;</p><p>GetClientRect(&m_rect);<br />SCROLLINFO scroll_info;</p><p>// 確定視窗原點的位移。 當捲軸移動時,背景和Item的繪製需要根據原點位移做調整(因為當前PaintDC的起點位移了)<br />// BEGIN<br />if ( GetScrollInfo( SB_HORZ, &scroll_info, SIF_POS | SIF_RANGE ) )<br />{<br />m_h_offset = -scroll_info.nPos;<br />m_h_size = max( scroll_info.nMax+1, m_rect.Width());<br />}<br />else<br />{<br />m_h_offset = m_rect.left;<br />m_h_size = m_rect.Width();<br />}</p><p>if ( GetScrollInfo( SB_VERT, &scroll_info, SIF_POS | SIF_RANGE ) )<br />{<br />if ( scroll_info.nMin == 0 && scroll_info.nMax == 100)<br />scroll_info.nMax = 0;<br />m_v_offset = -scroll_info.nPos * GetItemHeight();<br />m_v_size = max( (scroll_info.nMax+2)*((int)GetItemHeight()+1), m_rect.Height() );<br />}<br />else<br />{<br />m_v_offset = m_rect.top;<br />m_v_size = m_rect.Height();<br />}<br />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);<br />// END</p><p>// 建立 PaintDC 的MemDC<br />dc_ff.CreateCompatibleDC( &dc );<br /> bm_ff.CreateCompatibleBitmap( &dc, m_rect.Width(), m_rect.Height() );<br /> bm_old = (CBitmap *)dc_ff.SelectObject( &bm_ff );</p><p>// MemDC中字型和當前控制項字型類型不同,使一致<br />font = GetFont();<br />old_font = dc_ff.SelectObject( font );<br />old_mode = dc_ff.SetBkMode( TRANSPARENT );</p><p>// 背景和Item繪製到MemDC上<br />DrawBackGround( &dc_ff );<br />DrawItems( &dc_ff );</p><p>//把MemDC中的內容傳送到真正的裝置DC<br /> dc.BitBlt( m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(), &dc_ff, 0, 0, SRCCOPY);</p><p>// 恢複DC內容<br />dc_ff.SelectObject( old_font );<br />dc_ff.SetBkMode( old_mode );<br /> dc_ff.SelectObject( bm_old );<br />}<br />