您的位置:首页 > 其它

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

2012-06-05 21:54 741 查看
有两种方法:

 

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

 

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

 

hwnd,这时可用办法:

 

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

 

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

 

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

 

方法一:

 

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

 

[cpp] view
plaincopy

//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、编写消息处理函数

 

示例代码:

[cpp] view
plaincopy

//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;  

}  

复制搜索

复制搜索
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息