MFC 编辑框输出和线程操作及UpdateData()函数报错

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/guanyuqiu/article/details/79708381

很久没有写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);

}


猜你喜欢

转载自blog.csdn.net/guanyuqiu/article/details/79708381
今日推荐