前面一段时间,一直在想怎么样实现在全局的线程函数中实现调用窗体的一些函数(比如说在线程里面调用按钮单击处理函数,以及窗体的一些操作)。最近在网络 闲逛中发现了实现的方法,特意贴出来(ps:以前经常看别人写的一些东西,感觉很受用,这里也贡献一下自己的东西,希望能够帮助到别人)
这里我用vc++6.0创建了一个名为Muti_Tread的对话框程序。
在Muti_ThreadDlg.h : header file 中添加
// Generated message map functions
//{{AFX_MSG(CMuti_ThreadDlg)
virtual BOOL OnInitDialog();
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);//添加的消息声明
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
在 Muti_ThreadDlg.cpp : implementation file中
首先定义
#define WM_MY_MESSAGE (WM_USER+100)//WM_USER 有一些控件也使用,因此这里要加上100
下一步 还是在Muti_ThreadDlg.cpp : implementation file中
BEGIN_MESSAGE_MAP(CMuti_ThreadDlg, CDialog)
//{{AFX_MSG_MAP(CMuti_ThreadDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)//添加.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
同时实现消息处理函数
LRESULT CMuti_ThreadDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
MessageBox("OnMyMessage!");
return 0;
}
这样完整的消息机制就建立了,这里是调用了MessageBox函数,其他的窗体函数以及按钮的消息响应函数也可以直接调用了。下面关键是在全局的函数中弹出消息,使得消息的响应函数OnMyMessage能够运行。翻阅了一些资料,总算给找到了
使用 ::PostMessage(AfxGetMainWnd()->m_hWnd,WM_MY_MESSAGE,NULL,NULL);
在全局函数中
void global()
{
::PostMessage(AfxGetMainWnd()->m_hWnd,WM_MY_MESSAGE,NULL,NULL);// 弹出消息
}
最后创建线程
HANDLE t_facedetect=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)global,NULL,0,0);//线程运行函数
到此 结束