首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

有没有人发现setscrollinfo的一个潜在有关问题

2013-03-22 
有没有人发现setscrollinfo的一个潜在问题?有没有人发现setscrollinfo的一个潜在问题?别人的代码里发现的,

有没有人发现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);

结果依然存在这个问题


schlafenhamster老师说 是由于响应滚动条 的代码不对,导致的, 不赞同,

比如:把相应wm_hscroll,  wm_vscroll 的消息代码删掉,用defwindowproc来处理,依然有 模糊的情形。

大家是如何处理这种问题的,一个固定自定义窗口预览一张图片, 图片大小为止,所以必须有滚动条。


[解决办法]
"是由于响应滚动条 的代码不对,导致的, 不赞同"
不管赞同 不赞同,用我给的 代码 就不会 出现 你说的 问题吧。

热点排行