有两种方法:
由于产生的线程函数只能为类中的static函数或全局函数(这里假设线程函数为view类的static成员函数),由于线程函数为static,因此不能
直接访问view类的非static成员函数,也就不能用CClientDC之类的成员函数绘图,如果用全局的GetDC,也会同样不能用常规的方法取得
hwnd,这时可用办法:
CMainFrame *p=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CView *pv = (CView *)p->GetActiveView();
来取得指向view类的指针,所有问题可以解决了
方法一:
用上面提到的方法直接在线程函数中绘图,示例代码
//ThreadFunc为工作线程函数,其为view类的static成员函数 UINT CMltiThrdView::ThreadFunc(LPVOID ThreadArg) { CMainFrame *p=(CMainFrame*)AfxGetApp()->m_pMainWnd; CView *pv = (CView *)p->GetActiveView(); CClientDC dc(pv); dc.MoveTo(10,10); dc.LineTo(200, 200); return 0; }
方法二:
发送自定义消息:在工作线程中发送消息给view类,在view类的消息处理函数中画图
发送定义定消息的方法:
1、给自定义消息一个ID值:在WM_USER的基础加上一个整数,范围不能超过0X7FFFF
2、在view类的定义中,声明函数
3、添加消息映射
4、编写消息处理函数
示例代码://view类的头文件中定义的消息ID #define UM_THREAD WM_USER+1 //view类的定义中添加函数声明 //{{AFX_MSG(CTestView) afx_msg void OnResume(); //}}AFX_MSG afx_msg void DrawLine(); //添加的函数声明 DECLARE_MESSAGE_MAP() //源文件中添加消息映射 BEGIN_MESSAGE_MAP(CTestView, CView) //{{AFX_MSG_MAP(CTestView) ON_COMMAND(IDM_RESUME, OnResume) //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) ON_MESSAGE(UM_THREAD, DrawLine) //添加的消息映射 END_MESSAGE_MAP() //消息处理函数 void CTestView::DrawLine() { CClientDC dc(this); dc.MoveTo(0, 0); dc.LineTo(20, 20); } //线程函数 UINT CTestView::ThreadFunc(LPVOID ThreadArg) { CMainFrame * p = (CMainFrame *)AfxGetApp()->m_pMainWnd; CTestView * pv = (CTestView *)p->GetActiveView(); pv->SendMessage(UM_THREAD); return 0; }