返回信息流在看《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的滑块依然处于最左端。
代码都是照着书上敲的,也和网上下的代码比较过了,没发现有不同的地方。但是我自己做的例子就是无法得到预期结果。
可能是还有个别地方没有做对,求解惑。谢谢!
这是一条镜像帖。来源:北邮人论坛 / cpp / #19636同步于 2009/2/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[求助]关于MFC ScrollBar组件
FadeToBlack
2009/2/27镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
你应该调用一下UpdateData(FALSE)吧,这样可能就可以了。
【 在 FadeToBlack 的大作中提到: 】
: 在看《VC++ .NET技术内幕》,Chap. 7的Ex07a的例子有点问题,如下:
: 向对话框添加scroll bar后,设ID为IDC_RELY。
: 在类CEx07aDialog中添加成员int m_nRely,control ID为IDC_RELY。(通过向导添加,DoDataExchange处已设置)
: ...................
加上了UpdateData(FALSE);也不行啊。
每次显示对话框时滑动块都是在最左端。拖动之后在显示m_nRely的值,能看到m_nRely的值有随着滑块位置的改变而变化。
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里面吗??
搞定了。可行的解決方法如下:
BOOL CEx07aDialog::OnInitDialog()
{
.....
// Call after initialization
return CDialog::OnInitDialog(); // 注意这里在return时才调用OnInitDialog(),之前我是先调用OnInitDialog(),最后再return TRUE;
}
在书上是按上述写的,但是VS2k5生成的stub提示添加代码在OnInitDialog()之后,最后return TRUE。MS第一次我按书上写的做也没有成功……换到VS2k8上行了……
总而言之,还是不明白。有达人来讲解下吗?
PS. 还是感谢ls的帮助。
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)了
把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;
: ...................