春天花會開

          ***********

          統(tǒng)計

          留言簿(4)

          閱讀排行榜

          評論排行榜

          2010年6月9日 #

          Windows GDI、GDI+ 繪圖 防閃爍

          “閃爍”的原因是擦除背景(用背景色重新填充)與繪制前景圖像之間有時間差,而且背景和前景顏色有差異,導致眼睛看上去好像在閃爍。
          “閃爍”并不主要是因為GDI或GDI+效率低造成的。

          解決這個問題需從兩個方面入手:1.縮短(或消除)前后景繪圖時間差,2.減少繪制次數(shù)
          1.縮短(或消除)前后景繪圖時間差
          OnEraseBkgnd(CDC* pDC)
          {
              return TRUE;
          }

          實際上背景填充是必須,否則前景圖像與殘留的背景混在一起非常雜亂,
          這里取消的步驟,其實移到繪圖過程了(見2.),合成一張完整圖像。

          2.減少繪制次數(shù)
          采用“雙緩沖”技術,先在內(nèi)存緩沖區(qū)中完成繪圖,再貼到屏幕上
          另外如果緩沖圖像內(nèi)容不是變化的,應存為成員對象之類,不要每次去畫
          一般在OnDraw(CDC* pDC)中完成
          ///////////////////////////--GDI --////////////////////////////////////
          int nWidth=1000;
          int nHeight=1000;
          CDC MemDC; //首先定義一個顯示設備對象
          CBitmap MemBitmap;//定義一個位圖對象
          //隨后建立與屏幕顯示兼容的內(nèi)存顯示設備
          MemDC.CreateCompatibleDC(pDC); //這時還不能繪圖,因為沒有地方畫 ^_^
          //下面建立一個與屏幕顯示兼容的位圖,至于位圖的大小嘛,可以用窗口的大小
          //,也可以自己定義(如:有滾動條時就要大于當前窗口的大小,在BitBlt時決定拷貝內(nèi)存的哪部分到屏幕上)

          MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);
          //將位圖選入到內(nèi)存顯示設備中
          //只有選入了位圖的內(nèi)存顯示設備才有地方繪圖,畫到指定的位圖上

          CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
          //先用背景色將位圖清除干凈,這里用原背景色作為背景
          //你也可以用自己應該用的顏色

          MemDC.FillSolidRect(0,0,nWidth,nHeight,pDC->GetBkColor());
          //繪圖
          CBrush brush(RGB(0,255,0));
           for(int i=0;i<50;i++)
           {
            for(int j=0;j<80;j++)
            {
             //MemDC.Rectangle(10*j,10*i,9,9);
             CRect rc(10*j,10*i,10*j+8,10*i+8);
             MemDC.FillRect(&rc,&brush);
            }
           }
          //將內(nèi)存中的圖拷貝到屏幕上進行顯示
          pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);
          //繪圖完成后的清理
          MemBitmap.DeleteObject();
          MemDC.DeleteDC();


          ///////////////////////////--GDI+ --////////////////////////////////////
           Bitmap* buf=new Bitmap(2000,2000) ;
           Graphics gc(buf);//Graphics.FromImage(buf);
           //反鋸齒
           //gc.SetSmoothingMode(SmoothingModeAntiAlias);
           SolidBrush bgbrush(Color(255,255,255,255));
           gc.FillRectangle(&bgbrush,0,0,2000,2000);//背景填充
           Pen      pen(Color(255, 0, 0, 255));
           SolidBrush sbrush(Color(255,0,255,255));
           for(int i=0;i<60;i++)
           {
            for(int j=0;j<60;j++)
             gc.FillRectangle(&sbrush,10*j,10*i,9,9);
           }
           Graphics G(pDC->GetSafeHdc()); 
           G.DrawImage(buf ,0,0);

           

          posted @ 2010-06-19 16:09 春天花會開 閱讀(2642) | 評論 (1)編輯 收藏

          Visual studio 2008/2010 MFC程序Menu、Toolbar字體偏小解決辦法

          首先,這是一個MFC的Bug
          http://connect.microsoft.com/VisualStudio/feedback/details/505466/mfc-visual-style-font-size-too-small-to-display-chinese-character-clearly-on-windows-xp

          解決時間暫時還不確定,臨時的方案如下:
          App在InitInstance中加入:

          LOGFONT logfont = {0};
          :: SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &logfont, 0);
          afxGlobalData.SetMenuFont(&logfont,true);

          注釋:

          字體的設置保存在一個全局變量afxGlobalData中,此變量定義AfxGlobals.h中。
          AFX_GLOBAL_DATA中有一個SetMenuFont可以設定字體屬性,影響Menu、Toolbar、Dock Pane等的caption字體。
          但是這個設置對tooltip無影響,臨時解決:在上面代碼基礎上在加入

          if(afxGlobalData.fontTooltip.GetSafeHandle() != NULL)
           {
            ::DeleteObject(afxGlobalData.fontTooltip.Detach());
           }
           afxGlobalData.fontTooltip.CreateFontIndirect(&logfont);

          posted @ 2010-06-09 08:49 春天花會開 閱讀(2428) | 評論 (2)編輯 收藏

          主站蜘蛛池模板: 文成县| 无极县| 新化县| 阿城市| 彩票| 湘西| 长葛市| 任丘市| 新密市| 兰州市| 敖汉旗| 垦利县| 安岳县| 万宁市| 呼图壁县| 清流县| 临江市| 阿尔山市| 土默特右旗| 宜川县| 瓮安县| 丰都县| 萍乡市| 陵川县| 房产| 平阴县| 武川县| 玛纳斯县| 威海市| 五家渠市| 开封县| 同心县| 当涂县| 文山县| 集贤县| 辰溪县| 吴旗县| 湄潭县| 织金县| 县级市| 上栗县|