有没有人发现setscrollinfo的一个潜在问题?
有没有人发现setscrollinfo的一个潜在问题?
别人的代码里发现的,后来我做了几个实验,确实存在这个问题:
一个固定大小的自己创建的窗口预览图片, 有时候会出现垂直或者水平滚动条的模糊不清晰的现象。
原因在于:setscrollinfo的scrollinfo的参数不对导致的。
别人代码是如此设置:
根据所加载的图片的大小对scrollinfo进行设置大小。
ZeroMemory(&bitmap,sizeof(BITMAP));
GetObject(hBitmap,sizeof(BITMAP),&bitmap);
m_nHorzMaxSize=bitmap.bmWidth;
m_nVertMaxSize=bitmap.bmHeight;
m_nHorzPos=m_nVertPos=0;
//设置水平滚动条
SCROLLINFO si;
ZeroMemory(&si,sizeof(SCROLLINFO));
si.cbSize=sizeof(SCROLLINFO);
si.fMask=SIF_RANGE|SIF_PAGE;
si.nMax=m_nHorzMaxSize-1;
si.nMin=0;
si.nPage=m_nHorzPageSize;
SetScrollInfo(hWnd,SB_HORZ,&si,TRUE);
//设置垂直滚动条
ZeroMemory(&si,sizeof(SCROLLINFO));
si.cbSize=sizeof(SCROLLINFO);
si.fMask=SIF_RANGE|SIF_PAGE;
si.nMax=m_nVertMaxSize-1;
si.nMin=0;
si.nPage=m_nVertPageSize;
SetScrollInfo(hWnd,SB_VERT,&si,TRUE);
bHelpTest=TRUE;
hOldBitmap=(HBITMAP)SelectObject(hMemDc,hBitmap);
DarwPic(hWnd, hMemDc,m_nHorzPos, m_nVertPos,bitmap,uFlag);
return 0;
}
对于变量:m_nHorzpageSize进行设值,是在wm_create里设置的.
case WM_CREATE:
{
LONG lStyle= GetWindowLong(hWnd,GWL_STYLE);
lStyle&=~WS_SIZEBOX;//WS_THICKFRAME
lStyle&=~WS_MAXIMIZEBOX;
lStyle&=~WS_MINIMIZEBOX;
SetWindowLong(hWnd,GWL_STYLE,lStyle);
RECT rect;
GetClientRect(hWnd,&rect);
m_nHorzPageSize=rect.right-rect.left;
m_nVertPageSize=rect.bottom-rect.top;
模糊不清晰的原因在于:如果图片的宽度》客户区域的宽度,且高度《客户区域的高度, 此时就会导致水平滚动条模糊;
图片的高度》客户区域的高度,且宽度《客户区域的宽度,此时就会垂直滚动条模糊。
图片的高度》客户区域的高度,且宽度》客户区域的宽度,此时就清晰无比.
如果图片的高度,宽度均小于客户区域的高度,宽度,那么也会模糊,此时模糊是垂直模糊。
总结:如果当scrollinfo这个结构体的nMax<nPage的时候,那么就会出现模糊问题. 为了验证这个总结,我修正了代码:
//设置水平滚动条
SCROLLINFO si;
ZeroMemory(&si,sizeof(SCROLLINFO));
si.cbSize=sizeof(SCROLLINFO);
si.fMask=SIF_RANGE|SIF_PAGE;
si.nMax=m_nHorzMaxSize-1;
si.nMin=0;
si.nPage=m_nHorzPageSize<m_nHorzMaxSize?m_nHorzPageSize:m_nHorzMaxSize;
SetScrollInfo(hWnd,SB_HORZ,&si,TRUE);
//设置垂直滚动条
ZeroMemory(&si,sizeof(SCROLLINFO));
si.cbSize=sizeof(SCROLLINFO);
si.fMask=SIF_RANGE|SIF_PAGE;
si.nMax=m_nVertMaxSize-1;
si.nMin=0;
si.nPage=m_nVertPageSize<m_nVertMaxSize?m_nVertPageSize:m_nVertMaxSize;
SetScrollInfo(hWnd,SB_VERT,&si,TRUE);
结果依然存在这个问题