如何用SetDlgItemText显示std::vector?MFC直角三角形计算问题
解决MFC中历史记录显示的类型不匹配问题
嘿,我懂你遇到的麻烦了——编译器报错是因为SetDlgItemText的第二个参数需要的是LPCTSTR类型的字符串指针,但你直接传入了std::vector<CString>,这俩类型完全不兼容,编译器自然没法帮你转换。
咱们一步步来修复这个问题:
1. 错误原因拆解
SetDlgItemText(IDC_History, history); 这行代码里,history是一个存储多个字符串的容器,而控件需要的是一个单一的、连续的字符串(比如把所有历史结果拼接在一起,每行显示一条记录)。
2. 修复方案:拼接vector中的历史记录
你需要把std::vector<CString>里的所有结果拼接成一个单独的CString,再传给控件。比如用循环遍历vector,给每个结果加上换行符拼起来:
替换你代码的最后两行:
// 把vector中的历史记录拼接成带换行的字符串 CString historyStr; for (const auto& record : history) { historyStr += record; historyStr += _T("\r\n"); // Windows下编辑框的换行用\r\n } // 现在把拼接好的字符串传给控件 SetDlgItemText(IDC_History, historyStr);
3. 额外的优化小建议
- 调整
calchyp函数的参数类型:你现在的函数参数是int x, int y,但实际传入的是double类型的a1和b1,虽然能隐式转换,但改成double参数可以避免精度损失,逻辑也更合理:double calchyp(double x, double y) { //C^2 = A^2 + B^2 double z2 = (x * x) + (y * y); double z = sqrt(z2); // 用sqrt比pow(z2, 0.5)更高效、准确 return z; } - 设置编辑框属性:如果
IDC_History是编辑框控件,记得在VS的属性窗口里把它设置为Multiline(多行)和Vertical Scroll(垂直滚动),这样才能完整显示所有历史记录,不会被截断。
修改后的完整OnBnClickedButtonc函数
void CMFCApplication8Dlg::OnBnClickedButtonc() { CString A; CString B; double a1; double b1; GetDlgItemText(IDC_A, A); GetDlgItemText(IDC_B, B); a1 = _wtof(A); b1 = _wtof(B); double C1 = calchyp(a1, b1); CString result; result.Format(L"%4.2lf", C1); SetDlgItemText(IDC_C, result); history.push_back(result); // 修复历史记录显示的代码 CString historyStr; for (const auto& record : history) { historyStr += record; historyStr += _T("\r\n"); } SetDlgItemText(IDC_History, historyStr); }
这样修改后,编译器就不会报错了,你的历史记录也会一行一行清晰显示在IDC_History控件里~
内容的提问来源于stack exchange,提问作者Grilled_Cheese
相关产品推荐
相关产品推荐

