MFC学习笔记
记录一些零碎知识
文本框需将Mutiline设置为true之后方可进行换行,滑块出现true选项;可通过在准备传入SetWindowTextw()的CString中加入\r\n实现换行
更改对话框ID后,要去头文件中更改 关联ID,这里IDE不会自动修改,需要手动完成,否则可能导致对话框无法添加变量。
借书对话框中需要获取来自文档类的成员变量中的数据,由于采用(if(win.DoModal()==IDOK))写法,故很难给对话框控件预设数据(触发确认按钮时才进入后面的程序),大概思路分两种,其一在对话框中利用文档类指针(可通过重载构造函数传入),其二考虑单独将所需数据通过构造函数传入,经历自己写的CString对象数组使用失败后,通过查资料得知CStringArray的存在,将其视为突破口,打算将可借图书存在这个数组类中。
出现问题:
访问冲突,将pos++改为book.GetNext(pos)解决;对于POSITION类型的变量pos,想当然认为pos++和list.GetNext(pos);效果相同,结果发现使用前者时pos会变成类似野指针的东西(在指向末尾时++)而通过GetNext()函数得到的pos会变成NULL便于判断CList结束。
error C2248: “CObject::CObject”: 无法访问 private 成员(在“CObject”类中声明),由于微软将Object类的运算符设置为私有,CStringArray不支持赋值等运算,故不可传值调用,对此要么重载赋值号和拷贝构造函数,要么直接传地址进去,已采用后者。
附:DoModal函数调用流程
CMyDialog::DoModal()
CMyDialog::OnInitDialog()
CDialog::OnInitDialog()
CWnd::UpdateData(false)
CMyDialog::DoDataExchange;
发现保存文件为空:文档类中没有写序列化函数
打开时报错“意外的文件格式”:序列化函数输入和输出不匹配
下拉框获取序号时,ASSERT中止:
_AFXWIN_INLINE int CComboBox::GetCurSel() const
{ ASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, CB_GETCURSEL, 0, 0); }似乎在DoModal()==IDOK之后,该控件已销毁,只有变量能保存下来,故须提前将信息储存在变量中,采用OnCbnSelchangeCombo1()函数,在选择一项时就把它对应的字符串存入一个预设的CString中
同样RadioButto也会面临这个问题,如果你选择了使用GetCheck()来判断状态。同样可通过利用成员变量记录状态来解决问题。