vc滚动条控件的一件怪事?!是微软的bug吗?

jackzhaowz 2009-06-25 09:34:35
info.nMax = 100;
info.nPage=0;默认值
maxpos = pScrollBar->GetScrollLimit();
maxpos=101;???
跟踪调试到
int CWnd::GetScrollLimit(int nBar)
{
int nMin, nMax;
GetScrollRange(nBar, &nMin, &nMax);
SCROLLINFO info;
if (GetScrollInfo(nBar, &info, SIF_PAGE))
{
nMax -= __max(info.nPage-1,0);
}
return nMax;
}
其中:nMax -= __max(info.nPage-1,0);返回 101
难道 __max(info.nPage-1,0) 取-1 ???

info.nPage>0 时, 如=20
maxpos = pScrollBar->GetScrollLimit();
maxpos 为 81,正确!

我试着在自己的程序中加入__max(0-1,0),返回正确的结果:0


...全文
54 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Conry 2009-06-25
  • 打赏
  • 举报
回复
应该是微软的bug,确切的说是宏定义的bug,所以说使用宏的时候一定要小心


试试下面的代码,保证maxpos=-1,至于原因就是因为a是一个无符号的数,a-1转化成无符号就是一个很大的数,当然大于0,而maxpos是有符号的,所以赋值的时候转化成有符号的,就是-1

info.nPage也是无符号的,所以就出现你说的问题了


int maxpos=0,minpos=0;
UINT a=0;

maxpos= __max(a-1,0);

thenshesaid 2009-06-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jackzhaowz 的回复:]
__max()是一个宏,无法跟进。

另外,我前天发的帖子《在对话框picture控件中联一个类,在类中如何存取对话框的成员变量?》
http://topic.csdn.net/u/20090622/11/5260906d-ff3a-4bc0-988c-fd7dacffb355.html?seed=1961313657
敬请诸位前辈解答,谢谢了。急!急!急!
[/Quote]
Go to disassembly

jackzhaowz 2009-06-25
  • 打赏
  • 举报
回复
__max()是一个宏,无法跟进。

另外,我前天发的帖子《在对话框picture控件中联一个类,在类中如何存取对话框的成员变量?》
http://topic.csdn.net/u/20090622/11/5260906d-ff3a-4bc0-988c-fd7dacffb355.html?seed=1961313657
敬请诸位前辈解答,谢谢了。急!急!急!
thenshesaid 2009-06-25
  • 打赏
  • 举报
回复
展开或跟进__max(info.nPage-1,0);去看看
jackzhaowz 2009-06-25
  • 打赏
  • 举报
回复
谢谢Conry解答

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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