我首先想到发消息,SendMessage也好,PostMessage也好。
还有什么呢,直接加个B类变量作为A的成员变量,之后进行操作。
还有一种方法,就是开个监听事件线程,以A实时响应B的操作为例:
A.h
protected:
HANDLE m_hListenCorrAnsThread;
static DWORD WINAPI ListenCorrAnswersThread(LPVOID lParam);
BOOL StartThreadListenCorrAnswer();
public:
static CEvent s_evtCorrAnswer; //用于监视学生答案是否提交
static CString s_sCorrAnswer;
static int s_nCorrPercent;
A.cpp
CString A::s_sCorrAnswer = "";
int A::s_nCorrPercent = 0;
CEvent A::s_evtCorrAnswer;
void A::OnInitialUpdate()
{
......
if (!StartThreadListenCorrAnswer())
{
MessageBox("开启正确答案监听线程失败!");
}
// TODO: Add your specialized code here and/or call the base class
}
/******************************************************************
* Function :开启监听正确答案线程
* Input Parameters :
* Output Parameters:
* Return Value :
* Created By :yal 2013.08.29
*******************************************************************/
BOOL A::StartThreadListenCorrAnswer()
{
LOG(_T("启动客观题统计监听正确答案线程!\n"));
CWinThread* hThread = ::AfxBeginThread((AFX_THREADPROC)A::ListenCorrAnswersThread, (LPVOID)this);
m_hListenCorrAnsThread = hThread->m_hThread;
return (m_hListenCorrAnsThread != NULL);
}
/******************************************************************
* Function :监听正确答案处理函数
* Input Parameters :
* Output Parameters:
* Return Value :
* Created By :yal 2013.08.29
*******************************************************************/
DWORD WINAPI A::ListenCorrAnswersThread(LPVOID lParam)
{
TRACE(_T("CObjectiveStatisticsView::ListenCorrAnswersThread\n"));
CObjectiveStatisticsView* pObjectView = (CObjectiveStatisticsView*)lParam;
while (TRUE)
{
if (WAIT_FAILED == ::WaitForSingleObject(s_evtCorrAnswer.m_hObject, INFINITE))
{
DWORD dError = ::GetLastError();
LOG("WaitForSingleObject函数出现错误,错误代码:%d,程序退出", dError);
return 1;
}
if(!s_sCorrAnswer.IsEmpty())
{
//得到正确率百分比区域
CDC* pDc = pObjectView->GetDlgItem(IDC_OBJECTIVE_PERCENTAGE_CORRECT)->GetDC();
CRect rect;
pObjectView->GetDlgItem(IDC_OBJECTIVE_PERCENTAGE_CORRECT)->GetClientRect(&rect);
pObjectView->InvalidateRect(&rect,TRUE);
pObjectView->UpdateWindow();
//设置字体
CFont m_Font;
m_Font.CreateFont(100,0,0,0,FW_NORMAL,FALSE,FALSE,0,
ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,FF_SWISS,"Arial");
//CFont *pOldFont = (CFont*)pDc->SelectObject(&m_Font);
pDc->SelectObject(&m_Font);
pDc->SetTextColor(RGB(94,179,19));
pDc->SetBkMode(TRANSPARENT);
//画百分比
CString sPercent;
sPercent.Format("%d",s_nCorrPercent);
if (s_nCorrPercent >= 100)
{
pDc->DrawText(sPercent, CRect(2,25,60,128), DT_NOCLIP);
}
else if (s_nCorrPercent >= 10)
{
pDc->DrawText(sPercent, CRect(25,25,60,128), DT_NOCLIP);
}
else
{
pDc->DrawText(sPercent, CRect(50,25,60,128), DT_NOCLIP);
}
}
}
return 0;
}
B.cpp
void B::OnEnKillfocusEditAnswer()
{
// TODO: Add your control notification handler code here
SetEvent(A::s_evtCorrAnswer);
}