在对话框中显示图片,拉动滚动条后,再把滚动条拉回去的时候,图像变得模糊一片。
具体是滚出屏幕的那部分变的模糊一片,请问一下,有高手知道这个需要进行什么样的处理呢?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;
}
具体是滚出屏幕的那部分变的模糊一片,请问一下,有高手知道这个需要进行什么样的处理呢?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;
}
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);
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);
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);//以后滚动时就只需最后两句
那我现在是需要再写你说的这一句么?HBITMAP hBitmap;//你要显示的图像我新手,有点菜,不好意思哈~~
以下是我的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();
http://www.vckbase.com/document/viewdoc/?id=1612
两个教程供参考
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函数代码
StretchDIBits(oMemDC.m_hDC,0,0,iX,iY,0,0,iX,iY,
&p[sizeof(BITMAPINFO)],&sBmpInfo,DIB_RGB_COLORS,SRCCOPY);请问一下这2句的作用是?