久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

MFC

 年華似水匆匆 2014-05-29

        自己通過嘗試,用修改視圖坐標的方法, 優(yōu)化了雙緩沖繪圖,實現(xiàn)起來并不復雜,。


在介紹這個方法前,重新介紹一下窗口和視口的概念.
窗口:就是我們通過拖滾動條所能看到的整個窗口.它是有一部分不能被當前顯示的.
視口:就是我們能直接看到的當前顯示的窗口,它是窗口的一部分,滾動窗口的視口肯定比窗口小一些,普通窗口的視口大小就是窗口大小.


下面介紹優(yōu)化方法

    網(wǎng)上給出的雙緩沖繪圖方法多是在內(nèi)存中繪出一幅和窗口大小相同的位圖再導入設備.對于滾動窗口,我前些日子寫的日志也給出了方法.這樣做,雖然達到了目 的,但是卻很大程度上的浪費了內(nèi)存資源.比如,窗口大小800*600,滾動窗口1600*800.如果只是刷新了1*1的視口區(qū)域,將需要在內(nèi)存中繪 800*600的位圖,對于滾動窗口,更是需要1600*800的位圖,而只有1*1的區(qū)域是有效的.資源浪費了幾十萬倍.優(yōu)化的方法就是在內(nèi)存中只繪一 幅和刷新區(qū)域同樣大小的位圖.


優(yōu)化步驟:

    一.在OnDraw(CDC* pDC)函數(shù)中定義相關變量.

       刷新區(qū)域 CRect rc,

       兼容DC   CDC memDC,

       兼容位圖 CBitmap memBmp,

    二.調(diào)用GetClipBox(&rc)獲得刷新區(qū)域,注意,獲得的區(qū)域是以邏輯坐標表示的,不是設備坐標,。rc的左上角坐標即兼容DC視口坐標相對邏輯坐標的偏移,,將這個坐標設為兼容DC的視口坐標原點,,這樣不做其它調(diào)整就可以按照邏輯坐標在兼容DC里繪圖了,。這樣繪圖時將邏輯坐標加上偏移量就是兼容DC的設備坐標.調(diào)用CreateCompatibleDC()創(chuàng)建兼容DC,調(diào)用 CreateCompatibleBitmap()創(chuàng)建兼容位圖,調(diào)用SelectObject()導入位圖.

    三.繪圖.先調(diào)用FillSolidRect()用指定的顏色刷背景,再判斷下要畫在圖在不在rc范圍內(nèi),如果不在,不畫,畫也沒有意義,畫圖.

    四.調(diào)用BitBlt()導入位圖,銷毀位圖對象,DC.

    五.最后,響應 WM_ERASEBKGND 消息,直接返回TRUE,取消刷新背景.

 

說明:雙緩沖繪圖本身都具有一定的復雜性,如果所繪的圖形并不復雜,使用這種方法不會有明顯的效果提升.

 

很簡單吧,給出示例代碼,在文檔類中保存的矩形對象m_ellipse內(nèi)畫橢圓.

void CTest2View::OnDraw(CDC* pDC)
{
    // TODO: add draw code for native data here
    CDC memDC;
    CBitmap memBmp;
    memDC.CreateCompatibleDC(pDC);//創(chuàng)建兼容DC
    CRect rc;
    pDC->GetClipBox(&rc);//獲得刷新區(qū)域
    // 創(chuàng)建兼容位圖
    memBmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
    memDC.SelectObject(&memBmp);//導入位圖        
    //紅色背景    
    memDC.FillSolidRect(0,0,rc.Width(),rc.Height(),RGB(255,0,0));
    memDC.SetWindowOrg(rc.left, rc.top);
    //start畫圖  這是畫一個橢圓的示例代碼
    CRect ellipse = GetDocument()->m_ellipse;
    if( !( (rc.left  > ellipse.right )        //右側超出
        || (rc.right < ellipse.left  )        //左側超出
        || (rc.top     > ellipse.bottom)      //下側超出
        || (rc.bottom< ellipse.top   ) ))     //上側超出
    {
        memDC.Ellipse(&ellipse);    //畫圖
    }
    //end畫圖
    //導入
    pDC->BitBlt(rc.left, rc.top, rc.Width(), rc.Height(), &memDC, rc.left, rc.top, SRCCOPY);
    memBmp.DeleteObject();//銷毀位圖
    memDC.DeleteDC();//銷毀DC   
}

BOOL CTestView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call

    // default
return TRUE;   
//    return CView::OnEraseBkgnd(pDC);
}

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多