MFC 編輯框輸出和執行緒操作及UpdateData()函式報錯
阿新 • • 發佈:2018-12-24
很久沒有寫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);
其中
是編輯框關聯的CString型別的變數,關聯方法為右鍵編輯框選擇Add Variable,Control ID為編輯框的ID,Category選擇value,Variable type選m_strHshow
擇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的程式中還是不行,最後更改為:
新增windows.h的標頭檔案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);
執行緒操作
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);
}