调色板性能完善

      窗体移动时,不停的的重绘并不是一件好事,一定程度上会影响视觉效果。而且对于下面的色条而言,总用程序绘制也不是很好的选择。
      所以相应做以下修改:
     void  CXxDialog::OnPrint(){
            if(IsIconic){
                  ……
            }else{
                    CClientDC dc(this);
                    static bool bOnce=false;
                    if(!bOnce){
                           bOnce=true;
                           PostMessage(UM_DRAWBITMAP);//对应添加消息映射On_Message(UM_DRAWBITMAP,OnFinalPrint),并添加消息处理函数
                    }
                    CDialog::OnPaint();
            }
      }

    LRESULT   CXxDialog::OnFinalPrint(……){
            //把所有的绘制工作在这里完成
                  ……
            //接下来,将位图选入内存设备上下文

            HDC dcTemp=CreateCompatibleDC(pdcAll->m_hDC);

             HBITMAP hBitMap,hOldBitMap;

             hBitMap=CreateCompatibleBitmap(pdcAll->m_hDC,m_rcStatic.right-m_rcStatic.left,m_rcStatic.bottom-m_rcStatic.top);

             hOldBitMap=(HBITMAP)SelectObject(dcTemp,hBitMap);

             BitBlt(dcTemp,0,0,m_rcStatic.right-m_rcStatic.left,m_rcStatic.bottom-m_rcStatic.top,pdcAll->m_hDC,0,0,SRCCOPY);

             hBitMap=(HBITMAP)SelectObject(dcTemp,hOldBitMap);

             m_cBitmap.Attach(hBitMap);

             DeleteDC(dcTemp);
            return NULL;
      }
      接着要在背景重绘中将重回完成

      BOOL CXxDialog::OnEraseBkgnd(CDC* pDC)
      {
            //绘制上面的3个色条
            OnPaintEx();
            //绘制下面的色条

             CDC * pdcAll=GetDlgItem(IDC_STATIC_ALL)->GetDC();

             CDC cMemDC;

             cMemDC.CreateCompatibleDC(pdcAll);

             cMemDC.SelectObject(&m_cBitmap);

             pdcAll->BitBlt(0,0,m_rcStatic.right-m_rcStatic.left,m_rcStatic.bottom-m_rcStatic.top,&cMemDC,0,0,SRCCOPY);

             ReleaseDC(pdcAll);
             return CDialog::OnEraseBkgnd(pDC);
      }

      在背景重绘代码中我们不再阻止子窗口的重绘。

posted on 2009-09-13 15:53  learning...  阅读(196)  评论(1)    收藏  举报

导航