繪製控制項位元影像背景–需要注意的問題

來源:互聯網
上載者: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 />

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.