两个窗口之间的通信,你能想到什么

来源:互联网 发布:淘宝新买的牛仔裤超臭 编辑:程序博客网 时间:2024/04/29 14:17

我首先想到发消息,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);
}

原创粉丝点击