BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #19636同步于 2009/2/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[求助]关于MFC ScrollBar组件

FadeToBlack
2009/2/27镜像同步7 回复
在看《VC++ .NET技术内幕》,Chap. 7的Ex07a的例子有点问题,如下: 向对话框添加scroll bar后,设ID为IDC_RELY。 在类CEx07aDialog中添加成员int m_nRely,control ID为IDC_RELY。(通过向导添加,DoDataExchange处已设置) 想让scroll bar的滑块初始位置置为50,(范围为0~100)在CEx07aView中添加如下代码: void CEx07a_2View::OnLButtonDown(UINT nFlags, CPoint point) { CEx07aDialog dlg; ... dlg.m_nRely = 50; int ret = dlg.DoModal(); ... } 但每次对话框出现时IDC_RELY的滑块依然处于最左端。 代码都是照着书上敲的,也和网上下的代码比较过了,没发现有不同的地方。但是我自己做的例子就是无法得到预期结果。 可能是还有个别地方没有做对,求解惑。谢谢!
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
chidgine机器人#1 · 2009/2/28
你应该调用一下UpdateData(FALSE)吧,这样可能就可以了。 【 在 FadeToBlack 的大作中提到: 】 : 在看《VC++ .NET技术内幕》,Chap. 7的Ex07a的例子有点问题,如下: : 向对话框添加scroll bar后,设ID为IDC_RELY。 : 在类CEx07aDialog中添加成员int m_nRely,control ID为IDC_RELY。(通过向导添加,DoDataExchange处已设置) : ...................
FadeToBlack机器人#2 · 2009/3/1
加上了UpdateData(FALSE);也不行啊。 每次显示对话框时滑动块都是在最左端。拖动之后在显示m_nRely的值,能看到m_nRely的值有随着滑块位置的改变而变化。
chidgine机器人#3 · 2009/3/1
你是在那里加的啊??是在CEx07aDialog的OnInitalDlg里面吗??
FadeToBlack机器人#4 · 2009/3/1
void CEx07a_2View::OnLButtonDown(UINT nFlags, CPoint point) { CEx07aDialog dlg; // 下面都是初始化绑定成员的 dlg.m_strName = L"Shakespeare, Will"; dlg.m_nSsn = 307806636; dlg.m_bCat = 1; dlg.m_strBio = L"This person is not a well-motivated tech writer."; dlg.m_bInsLife = TRUE; dlg.m_bInsDis = FALSE; dlg.m_bInsMed = TRUE; dlg.m_strDept = L"Documentation"; dlg.m_strSkill = L"Writer"; dlg.m_nLang = 0; dlg.m_strEduc = L"College"; dlg.m_nLoyal = 50; // { 就这两个滑块 dlg.m_nRely = 50; // { 的初始化不起作用 UpdateData(FALSE); // 加在这里了。 int ret = dlg.DoModal(); TRACE(L"DoModal return = %d\n", ret); TRACE(L"name = %s, ssn = %d, salary = %d\n", dlg.m_strName, dlg.m_nSsn, dlg.m_bCat); TRACE(L"dept = %s, skill = %d, lang = %d, educ = %s\n", dlg.m_strDept, dlg.m_nSsn, dlg.m_nLang, dlg.m_strEduc); TRACE(L"life = %d, dis = %d, med = %d, bio = %s\n", dlg.m_bInsLife, dlg.m_bInsDis, dlg.m_bInsMed, dlg.m_strBio); TRACE(L"loyalty = %d, reliability = %d\n", dlg.m_nLoyal, dlg.m_nRely); CView::OnLButtonDown(nFlags, point); } 【 在 chidgine 的大作中提到: 】 : 你是在那里加的啊??是在CEx07aDialog的OnInitalDlg里面吗??
FadeToBlack机器人#5 · 2009/3/2
搞定了。可行的解決方法如下: BOOL CEx07aDialog::OnInitDialog() { ..... // Call after initialization return CDialog::OnInitDialog(); // 注意这里在return时才调用OnInitDialog(),之前我是先调用OnInitDialog(),最后再return TRUE; } 在书上是按上述写的,但是VS2k5生成的stub提示添加代码在OnInitDialog()之后,最后return TRUE。MS第一次我按书上写的做也没有成功……换到VS2k8上行了…… 总而言之,还是不明白。有达人来讲解下吗? PS. 还是感谢ls的帮助。
chidgine机器人#6 · 2009/3/2
dlg.m_strName = L"Shakespeare, Will"; dlg.m_nSsn = 307806636; dlg.m_bCat = 1; dlg.m_strBio = L"This person is not a well-motivated tech writer."; dlg.m_bInsLife = TRUE; dlg.m_bInsDis = FALSE; dlg.m_bInsMed = TRUE; dlg.m_strDept = L"Documentation"; dlg.m_strSkill = L"Writer"; dlg.m_nLang = 0; dlg.m_strEduc = L"College"; dlg.m_nLoyal = 50; // { 就这两个滑块 dlg.m_nRely = 50; // { 的初始化不起作用 UpdateData(FALSE); // 加在这里了。 你这里加的UpdateData(FALSE)是没有用的,因为你是在对CEx07a_2View里的数据进行更新,当然是要用dlg.UpdateData(FALSE)了
FadeToBlack机器人#7 · 2009/3/3
把UpdateData(FALSE)替換為dlg.UpdateData(FALSE)后,運行出錯。 --------------------------- Microsoft Visual C++ Debug Library --------------------------- Debug Assertion Failed! Program: ...Visual Studio 2005\Projects\vcppnet\Ex07a_2\debug\Ex07a_2.exe File: f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp Line: 4004 For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts. (Press Retry to debug the application) --------------------------- Abort Retry Ignore --------------------------- 【 在 chidgine 的大作中提到: 】 : dlg.m_strName = L"Shakespeare, Will"; : dlg.m_nSsn = 307806636; : dlg.m_bCat = 1; : ...................