MFC中在工作线程下画图(自定义消息的发送)

来源:互联网 发布:java socket 发送byte 编辑:程序博客网 时间:2024/05/16 04:38

有两种方法:

 

由于产生的线程函数只能为类中的static函数或全局函数(这里假设线程函数为view类的static成员函数),由于线程函数为static,因此不能

 

直接访问view类的非static成员函数,也就不能用CClientDC之类的成员函数绘图,如果用全局的GetDC,也会同样不能用常规的方法取得

 

hwnd,这时可用办法:

 

CMainFrame *p=(CMainFrame*)AfxGetApp()->m_pMainWnd;

 

CView *pv = (CView *)p->GetActiveView();

 

来取得指向view类的指针,所有问题可以解决了

 

方法一:

 

用上面提到的方法直接在线程函数中绘图,示例代码

 

[cpp] view plaincopy
  1. //ThreadFunc为工作线程函数,其为view类的static成员函数  
  2. UINT CMltiThrdView::ThreadFunc(LPVOID ThreadArg)  
  3. {  
  4.     CMainFrame *p=(CMainFrame*)AfxGetApp()->m_pMainWnd;  
  5.     CView *pv = (CView *)p->GetActiveView();  
  6.     CClientDC dc(pv);  
  7.     dc.MoveTo(10,10);  
  8.     dc.LineTo(200, 200);  
  9.     return 0;  
  10. }  

 

方法二:

 

发送自定义消息:在工作线程中发送消息给view类,在view类的消息处理函数中画图

 

发送定义定消息的方法:

 

1、给自定义消息一个ID值:在WM_USER的基础加上一个整数,范围不能超过0X7FFFF

 

2、在view类的定义中,声明函数

 

3、添加消息映射

 

4、编写消息处理函数

 

示例代码:

[cpp] view plaincopy
  1. //view类的头文件中定义的消息ID  
  2. #define UM_THREAD   WM_USER+1  
  3. //view类的定义中添加函数声明  
  4. //{{AFX_MSG(CTestView)  
  5. afx_msg void OnResume();  
  6. //}}AFX_MSG  
  7. afx_msg void DrawLine();  //添加的函数声明  
  8. DECLARE_MESSAGE_MAP()  
  9. //源文件中添加消息映射  
  10. BEGIN_MESSAGE_MAP(CTestView, CView)  
  11.     //{{AFX_MSG_MAP(CTestView)  
  12.     ON_COMMAND(IDM_RESUME, OnResume)  
  13.     //}}AFX_MSG_MAP  
  14.     // Standard printing commands  
  15.     ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)  
  16.     ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)  
  17.     ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)  
  18.     ON_MESSAGE(UM_THREAD, DrawLine)  //添加的消息映射  
  19. END_MESSAGE_MAP()  
  20. //消息处理函数  
  21. void CTestView::DrawLine()  
  22. {  
  23.     CClientDC dc(this);  
  24.     dc.MoveTo(0, 0);  
  25.     dc.LineTo(20, 20);  
  26. }  
  27. //线程函数  
  28. UINT CTestView::ThreadFunc(LPVOID ThreadArg)  
  29. {  
  30.     CMainFrame * p = (CMainFrame *)AfxGetApp()->m_pMainWnd;  
  31.     CTestView * pv = (CTestView *)p->GetActiveView();  
  32.     pv->SendMessage(UM_THREAD);  
  33.     return 0;  
  34. }  

复制搜索
原创粉丝点击