很久没有写MFC,最近在写MFC的时候遇到了很多问题,把这次遇见的问题及解决方法整理如下,以便下一次用的时候查阅。
编辑框输出
编辑框输出有多种方法,按照以前的方法在vs2010运用时居然没有显示,把这次的代码做为示例以便下次用时查阅。
CString str;
str.Format(pName);
m_strHshow += str;
str.Format("\r\n");
m_strHshow += str;
UpdateData(FALSE);
UpdateWindow();
m_ctrlShow.SetSel(-1);
其中
m_strHshow
是编辑框关联的CString类型的变量,关联方法为右键编辑框选择Add Variable,Control ID为编辑框的ID,Category选择value,Variable type选
择CString,varible name输入m_strshow.
m_ctrlShow
是编辑框关联的控制变量,关联方法为右键编辑框选择Add Variable,Control ID为编辑框的ID,Category选择Control,varible name输入m_ctrlshow.
按照上面的方式写会报错:error C2664: “void ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>::Format(UINT,...)”: 无法将参数 1 从“char *”转换为“const wchar_t *”
1>
更改为:
CString str;
str.Format(_T(pName));
m_strHshow += str;
str.Format(_T("\r\n"));
m_strHshow += str;
UpdateData(FALSE);
UpdateWindow();
m_ctrlShow.SetSel(-1);
—_T在tchar.h中定义。
但在vs2015的程序中还是不行,最后更改为:
USES_CONVERSION;
CString str;
str.Format(A2W(pName));
m_strHshow += str;
str.Format(_T("\r\n"));
m_strHshow += str;
UpdateData(FALSE);
UpdateWindow();
m_ctrlShow.SetSel(-1);
添加windows.h的头文件
线程操作
MFC线程操作有很多种,我选择的这种方式是较简单的一种,主要方便在线程中调用对话框类中的函数及类成员变量。首先类中定义线程函数
static UINT ThreadFunction(LPVOID pParam);
定义必须这样写,返回值如果不写成UINT会报错。
UINT CDlg_EXEDlg::ThreadFunction(LPVOID pParam)
{
CDlg_EXEDlg *pdlg = (CDlg_EXEDlg*)pParam;
pdlg->UpDateEdit(pName); //类成员函数
return 0;
}
调用该线程的方法为:
void CDlg_EXEDlg::OnBnClickRun()
{
AfxBeginThread(ThreadFunction,this);
}
UpdateData(FALSE)报错
上面的MFC在vs2010 Release x86下能够正常运行,但移植到vs2015,x64下报错,这个问题折磨了我一天,唉。
报错
原因是由于在线程中调用而出错,如果在非线程中调用一切正常。解决方法:
Cutton_DlgDlg.h : 头文件中定义
#define WM_UPDATEDATA WM_USER+5
类中定义函数
LRESULT OnUpdateData(WPARAM wParam,LPARAM lParam);
做映射 Cutton_DlgDlg.cpp : 实现文件中
BEGIN_MESSAGE_MAP(CCutton_DlgDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_UPDATEDATA,OnUpdateData)
END_MESSAGE_MAP()
函数定义
LRESULT CCutton_DlgDlg::OnUpdateData(WPARAM wParam, LPARAM lParam)
{
UpdateData(wParam);
return 0;
}
调用函数
void CCutton_DlgDlg::UpdateEidt(char *pName)
{
//USES_CONVERSION;
CString str;
str.Format(_T(pName));
m_strHshow += str;
str.Format(_T("\r\n"));
m_strHshow += str;
SendMessage(WM_UPDATEDATA,FALSE);
//UpdateData(FALSE);
UpdateWindow();
m_ctrlShow.SetSel(-1);
}