1. 程式人生 > >MFC 編輯框輸出和執行緒操作及UpdateData()函式報錯

MFC 編輯框輸出和執行緒操作及UpdateData()函式報錯

很久沒有寫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);

}