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;
}
复制搜索
复制搜索
由于产生的线程函数只能为类中的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;
}
复制搜索
复制搜索
相关文章推荐
- MFC中在工作线程下画图(自定义消息的发送)
- 在MFC中从一个线程工作函数中向窗口发送消息(this指针的妙用) .
- 不知道在MFC中如何从线程工作函数中向窗口发送消息?用好一个指针就够了
- 在MFC中从一个线程工作函数中向窗口发送消息以及窗口到窗口消息传送方法
- 工作线程调用sendmessage()向主对话框发送自定义消息遇到的问题以及解决
- 在MFC中从一个线程工作函数中向窗口发送消息(this指针的妙用) .
- 在MFC中从一个线程工作函数中向窗口发送消息(this指针的妙用)
- MFC如何自定义消息与在线程中向主窗体控件发送数据
- 在MFC中从一个线程工作函数中向窗口发送消息(this指针的妙用)
- 在MFC中从一个线程工作函数中向窗口发送消息(this指针的妙用)
- MFC发送自定义消息-PostMessage和SendMessage
- MFC使用SendMessage()发送自定义消息实现进程间通信
- MFC 向指定窗口发送自定义消息
- MFC自定义控件如何向父窗口发送自定义消息
- Looper机制:主线程中利用handler向工作线程发送消息
- 在MFC中,发送并处理自定义消息
- MFC使用SendMessage()发送自定义消息实现进程间通信
- 使用PostThreadMessage向工作线程发送消息
- MFC开发实用教程2:发送自定义消息
- MFC中创建工作线程,进行消息传递