您的位置:首页 > 其它

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

2011-06-29 16:04 363 查看
有两种方法:

由于产生的线程函数只能为类中的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: