看不懂《Windows程序设计》中的这个语句,请大家帮忙解释下,谢谢!!

紫色动力 2010-12-15 10:27:12
代码如下:

case WM_PAINT :
hdc = BeginPaint (hwnd, &ps) ;

// Get vertical scroll bar position

si.cbSize = sizeof (si) ;
si.fMask = SIF_POS ;
GetScrollInfo (hwnd, SB_VERT, &si) ;
iVertPos = si.nPos ;

// Get horizontal scroll bar position

GetScrollInfo (hwnd, SB_HORZ, &si) ;
iHorzPos = si.nPos ;

// Find painting limits

iPaintBeg = max (0, iVertPos + ps.rcPaint.top / cyChar) ;//就是这两句看不懂啊。ps.rcPaint
iPaintEnd = min (NUMLINES - 1, //是整个客户区吗?
iVertPos + ps.rcPaint.bottom / cyChar) ;

for (i = iPaintBeg ; i <= iPaintEnd ; i++)
{
x = cxChar * (1 - iHorzPos) ;
y = cyChar * (i - iVertPos) ;

TextOut (hdc, x, y,
sysmetrics[i].szLabel,
lstrlen (sysmetrics[i].szLabel)) ;

TextOut (hdc, x + 22 * cxCaps, y,
sysmetrics[i].szDesc,
lstrlen (sysmetrics[i].szDesc)) ;

SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;

TextOut (hdc, x + 22 * cxCaps + 40 * cxChar, y, szBuffer,
wsprintf (szBuffer, TEXT ("%5d"),
GetSystemMetrics (sysmetrics[i].iIndex))) ;

SetTextAlign (hdc, TA_LEFT | TA_TOP) ;
}

EndPaint (hwnd, &ps) ;
return 0 ;

这是SYSMETS3中的程序的一段代码,这个程序用SetScrollInfo来实现滚动条。但程序中重画范围这段代码看不懂,请大家解释下,谢谢!!
...全文
168 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2011-01-20
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖

相关规定详见界面界面版关于版主结帖工作的具体办法
xumaojun 2010-12-22
  • 打赏
  • 举报
回复
max (0, iVertPos + ps.rcPaint.top / cyChar) >=0
min (NUMLINES - 1, iVertPos + ps.rcPaint.bottom / cyChar) <= NUMLINES - 1
紫色动力 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hnwyllmm 的回复:]

太明显了,第一个要保证最上(top)不小于0, 最下不超过NUMLINES-1
[/Quote]
问题是为什么这么做就可能保证不小于0和不超过NUMLINES - 1?
Eleven 2010-12-16
  • 打赏
  • 举报
回复
不懂得函数可以参考MSDN
羽飞 2010-12-16
  • 打赏
  • 举报
回复
太明显了,第一个要保证最上(top)不小于0, 最下不超过NUMLINES-1
向立天 2010-12-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 h_rui 的回复:]
iPaintBeg = max (0, iVertPos + ps.rcPaint.top / cyChar) ;//返回最大值
iPaintEnd = min (NUMLINES - 1, iVertPos + ps.rcPaint.bottom / cyChar) ;//返回最值
第一个可能是为了保证iVertPos + ps.rcPaint.top / cyChar》=0吧,就那么几个数……
[/Quote]MSDN是个好帮手
H_rui 2010-12-16
  • 打赏
  • 举报
回复
iPaintBeg = max (0, iVertPos + ps.rcPaint.top / cyChar) ;//返回最大值
iPaintEnd = min (NUMLINES - 1, iVertPos + ps.rcPaint.bottom / cyChar) ;//返回最值
第一个可能是为了保证iVertPos + ps.rcPaint.top / cyChar》=0吧,就那么几个数值综合上面意思看下不就懂了,不懂的查下MSDN啊

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧