• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 圖像平滑滾動效果的VC實現

    發表于:2007-07-14來源:作者:點擊數: 標簽:
    前言: 在圖像的編程中,經常會遇到這樣一種情況,在有限的區域中顯示了一幅大圖,這時要瀏覽圖像的各個部分,這就需要用到圖像的滾動。關于它的實現,許多書都有提及,但其中的關鍵點和難點,即拖動中的刷新和閃爍問題,卻講述的不多,這也是我寫本文的目的
    前言:

      在圖像的編程中,經常會遇到這樣一種情況,在有限的區域中顯示了一幅大圖,這時要瀏覽圖像的各個部分,這就需要用到圖像的滾動。關于它的實現,許多書都有提及,但其中的關鍵點和難點,即拖動中的刷新和閃爍問題,卻講述的不多,這也是我寫本文的目的所在,下面我將詳細分析實現方法。

      實現效果及實現方法:

      在圖像區域中按下鼠標左鍵,可拖動圖像在某一有限區域中任意滾動。

      方法為 :拖動時計算上次與本次的偏移,然后將圖像顯示的起始點進行變化并刷新圖像區域。

      實現部分:

      第一步:響應WM_LBUTTONDOWN 消息,記錄按下開始拖動的起始位置。

      void CWingImgDlg::OnLButtonDown(UINT nFlags, CPoint point)

      {

       // TODO: Add your message handler code here and/or call default

       m_lPicOldLeft = point.x;

       m_lPicOldTop = point.y;

       CDialog::OnLButtonDown(nFlags, point);

      }

      第二步:響應WM_MOUSEMOVE 消息,實現滾動。

      void CWingImgDlg::OnMouseMove(UINT nFlags, CPoint point)

      {

       // TODO: Add your message handler code here and/or call default

       file://如果鼠標按下

       if( (nFlags & MK_LBUTTON) == MK_LBUTTON )

       {

        m_lPicNewLeft = point.x;

        m_lPicNewTop = point.y;

        DWORD dwLRShift = m_lPicNewLeft - m_lPicOldLeft;

        DWORD dwTBShift = m_lPicNewTop - m_lPicOldTop;

        file://改變圖像顯示的起始點

        m_lPicLeft = m_lPicLeft - dwLRShift;

        m_lPicTop = m_lPicTop - dwTBShift;

        file://判斷邊界的語句,省去。

        m_lPicOldLeft = m_lPicNewLeft;

        m_lPicOldTop = m_lPicNewTop;

        file://進行刷新的語句,見第四步。

       }

       CDialog::OnMouseMove(nFlags, point);

      }

      第三步:在OnPaint中顯示,顯示的其他部分,如圖像的得來等,省去。

      void CWingImgDlg::OnPaint()

       {

        CPaintDC dc(this); // device context for painting

        file://其他的顯示內容,省去。

        if(m_pImgInfo != NULL)

         dc.BitBlt(m_wShowAdjLeft,m_wShowAdjTop,m_lWidth,m_lHeight,&m_AdjDC,

         m_lPicLeft,m_lPicTop,SRCCOPY);

         CDialog::OnPaint();

        }
      第四步:刷新處理。

       最常想到的方法,當然是使用Invalidate(TRUE);//刷新整個無效區

       UpdateWindow();

       這時,會刷新整個程序區域的無效區,閃爍非常嚴重,改正如下:

        InvalidateRect(&m_rtPic,TRUE); file://僅刷新圖像顯示區域

        UpdateWindow();

       此時,僅會刷新圖像所在區域,閃爍有所緩解,再進一步,可使用

        InvalidateRect(&m_rtPic,TRUE); file://使用快速重畫

        ReDrawWindow(&m_rtPic,NULL,RDW_INTERNALPAINT| RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);

    進行處理,此時閃爍更進一步減小,考慮到,其他部分可能影響刷新區域,干脆將OnPaint()直接使用在此處,即變為:

      OnPaint();

      但如果在OnPaint()中有大量的繪圖語句,這種方法仍舊不可行,考慮到不能激發OnPaint()這一因素及控制刷新范圍,我采用了如下非標準的方法解決,代碼如下:

      CDC *pDC;

      pDC = GetDC();

      if(m_pImgInfo != NULL)

       pDC->BitBlt(m_wShowLeft,m_wShowTop,m_lWidth,m_lHeight,&m_AdjDC,m_lPicLeft,m_lPicTop,SRCCOPY);

       ReleaseDC(pDC);

      這種方法很好地解決了刷新閃爍的問題,圖像拖動時很平穩且無閃爍。

      這是我在實踐中遇到的一個問題,寫出來,與大家共享。如果有問題,或者有更好的建議和做法,歡迎和我聯系探討,如需要整個程序的源文件,請Mail聯系(DavidZheng@Acercm.com.cn)。

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>