在对话框中显示图片,拉动滚动条后,再把滚动条拉回去的时候,图像变得模糊一片。
具体是滚出屏幕的那部分变的模糊一片,请问一下,有高手知道这个需要进行什么样的处理呢?SCROLLINFO scrollinfo;
GetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
switch   (nSBCode)
{
case   SB_BOTTOM:
ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMax)*10);
scrollinfo.nPos = scrollinfo.nMax;
SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
break;
case   SB_TOP:
ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMin)*10);
scrollinfo.nPos = scrollinfo.nMin;
SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
break;
case   SB_LINEUP:
scrollinfo.nPos -= 1;
if   (scrollinfo.nPos <scrollinfo.nMin)
{
scrollinfo.nPos = scrollinfo.nMin;
break;
}
SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
ScrollWindow(0,10);
break;
case   SB_LINEDOWN:
scrollinfo.nPos += 1;
if   (scrollinfo.nPos> scrollinfo.nMax)
{
scrollinfo.nPos = scrollinfo.nMax;
break;
}
SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
ScrollWindow(0,-10);
break;
case   SB_PAGEUP:
scrollinfo.nPos -= 5;
if   (scrollinfo.nPos <scrollinfo.nMin)
{
scrollinfo.nPos = scrollinfo.nMin;
break;
}
SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
ScrollWindow(0,10*5);
break;
case   SB_PAGEDOWN:
scrollinfo.nPos += 5;
if   (scrollinfo.nPos> scrollinfo.nMax)
{
scrollinfo.nPos = scrollinfo.nMax;
break;
}
SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
ScrollWindow(0,-10*5);
break;
case   SB_ENDSCROLL:
// MessageBox( "SB_ENDSCROLL ");
break;
case   SB_THUMBPOSITION:
// ScrollWindow(0,(scrollinfo.nPos-nPos)*10);
// scrollinfo.nPos = nPos;
// SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
break;
case   SB_THUMBTRACK:
ScrollWindow(0,(scrollinfo.nPos-nPos)*10);
scrollinfo.nPos = nPos;
SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
break;
}

解决方案 »

  1.   

    你的ScrollWindow怎么只有两个参数?
    MSDN上的:
    BOOL ScrollWindow(          HWND hWnd,
        int XAmount,
        int YAmount,
        const RECT *lpRect,
        const RECT *lpClipRect
    );
    HBITMAP hBitmap;//你要显示的图像
    BITMAP  bm;
    GetObject (hBitmap, sizeof (BITMAP), (PSTR) &bm) ;
    SetRect(&rc,0,0,bm.bmWidth,bm.bmHeight);
    ScrollWindow(hwnd,XAmount,YAmount,&rc,NULL);
      

  2.   

    int x,y;//你图像左上角的当前坐标
    RECT    rc;
    HBITMAP hBitmap;//你要显示的图像
    BITMAP  bm;
    GetObject (hBitmap, sizeof (BITMAP), (PSTR) &bm) ;
    SetRect(&rc,x,y,bm.bmWidth,bm.bmHeight);
    ScrollWindow(hwnd,XAmount,YAmount,&rc,NULL);
    OffsetRect(&rc,XAmoun,YAmount);
      

  3.   

    囧....又有点小错误..
    int x,y;//你图像左上角的当前坐标
    RECT    rc;
    HBITMAP hBitmap;//你要显示的图像
    BITMAP  bm;
    GetObject (hBitmap, sizeof (BITMAP), (PSTR) &bm) ;
    SetRect(&rc,x,y,x+bm.bmWidth,y+bm.bmHeight);ScrollWindow(hwnd,XAmount,YAmount,&rc,NULL);
    OffsetRect(&rc,XAmoun,YAmount);//以后滚动时就只需最后两句
      

  4.   

    我的图片是从FileDialog里导入的导入的时候在OnPaint()中显示。
    那我现在是需要再写你说的这一句么?HBITMAP hBitmap;//你要显示的图像我新手,有点菜,不好意思哈~~
      

  5.   


    以下是我的OnPaint()代码:CPaintDC dc(this); // device context for painting

    // TODO: Add your message handler code here
    if (!m_hBitmap)
    return;
    CDC Memdc;
    Memdc.CreateCompatibleDC(&dc);
    Memdc.SelectObject(m_hBitmap); if(dc.GetDeviceCaps(RASTERCAPS)&RC_PALETTE && m_hPalette->m_hObject != NULL)
    {
    dc.SelectPalette(m_hPalette, FALSE); 
    dc.RealizePalette();
    } dc.BitBlt (0 ,0 ,nWidth, nHeight, &Memdc, 0, 0, SRCCOPY);
    Memdc.DeleteDC();
      

  6.   

    http://www.vckbase.com/document/viewdoc/?id=1811
    http://www.vckbase.com/document/viewdoc/?id=1612
    两个教程供参考
      

  7.   

    OnPaint()函数中有问题
    void CDlgShow::OnPaint() 
    {
    CPaintDC dc(this); // device context for painting

    // TODO: Add your message handler code here

    // Do not call CDialog::OnPaint() for painting messages TRACE("画图");
    BITMAPINFO sBmpInfo;
    memcpy(&sBmpInfo,p,sizeof(sBmpInfo));
    // int iX=sBmpInfo.bmiHeader.biWidth;
    // int iY=sBmpInfo.bmiHeader.biHeight; int iX=GetSystemMetrics(SM_CXSCREEN);
    int iY=GetSystemMetrics(SM_CYSCREEN); CDC* pDc = GetDC();

    CRect rect;
    GetClientRect(&rect);

    CDC oMemDC;
    oMemDC.CreateCompatibleDC(pDc);
    CBitmap oBit;
    oBit.CreateCompatibleBitmap(pDc,iX,iY);
    oMemDC.SelectObject(oBit);

    StretchDIBits(oMemDC.m_hDC,0,0,iX,iY,0,0,iX,iY,
    &p[sizeof(BITMAPINFO)],&sBmpInfo,DIB_RGB_COLORS,SRCCOPY);

    dc.BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&oMemDC,
    (rect.left+m_iImageHScrollPos),(rect.top+m_iImageVScrollPos),SRCCOPY); oBit.DeleteObject();
    oMemDC.DeleteDC();
    // dc.DeleteDC();
    }
    我曾经写过一个小程序,获取桌面图片,把它显示到对话框中,对话框中有滚动条以上是OnPaint函数代码
      

  8.   


    StretchDIBits(oMemDC.m_hDC,0,0,iX,iY,0,0,iX,iY,
    &p[sizeof(BITMAPINFO)],&sBmpInfo,DIB_RGB_COLORS,SRCCOPY);请问一下这2句的作用是?
      

  9.   

    这个貌似跟scroll没关系,应该是楼主的onpaint不对