求高手写个MFC最简单的对话框中加个工作线程的小程序
具体就是在一个对话框中:一选中checkbox然后对话框中的文本编辑框内容自动刷新要求传递消息和获取窗口指针来刷新编辑框两种形式的!因为这两种我在网上都看了,但就是没有一...
具体就是在一个对话框中:一选中checkbox然后对话框中的文本编辑框内容自动刷新
要求传递消息和获取窗口指针来刷新编辑框两种形式的!
因为这两种我在网上都看了,但就是没有一个实实在在的例子,所以自己也无从下手,请高手帮帮忙,谢谢了!
如果写的例子让我能立马看懂,如何自己下手我再加50分!例子越简单越好能立马看懂
我的邮箱是:vcttyys@126.com 展开
要求传递消息和获取窗口指针来刷新编辑框两种形式的!
因为这两种我在网上都看了,但就是没有一个实实在在的例子,所以自己也无从下手,请高手帮帮忙,谢谢了!
如果写的例子让我能立马看懂,如何自己下手我再加50分!例子越简单越好能立马看懂
我的邮箱是:vcttyys@126.com 展开
1个回答
展开全部
MFC中开线程确实是个麻烦的问题,最大的问题在于开出来的线程函数不能直接使用MFC的一些机制,比如一个基于对话框工程,dlg cpp中写了一个线程函数,那么这个函数不能使用当前dlg类的所有成员,函数,所以直接调用控件变量是不行的,另外获取指针的方法也不行,只有在MFC类的成员函数中才能使用GetDlgItem( IDC_EDIT1 ),在其他函数中只能使用HWND GetDlgItem(HWND hDlg,int nIDDlgItem),使用后GetDlgItem( NULL,IDC_EDIT1 )->只弹出一个unused
当然办法还是有的,思路是先全局定义一些变量,在工作者线程中去不断改变变量的值,把变量值反馈给对话框的任务交给OnTimer(),因为你的要求是自动刷新,那么也就是每隔一定时间刷新,那么OnTimer()就必不可少了。
我给你个例子,要写的代码非常少就不发工程了,步骤如下
建一个基于对话框工程,添加一个按钮,一个editbox,editbox绑定一个control变量c_edit
然后在oninitdialog中加int iInstallResult;
iInstallResult=SetTimer(1,1,NULL);
同样是这个cpp文件中的开头加int num=0;(全局)
再在全局位置添加线程函数
UINT fun(LPVOID pParam)
{
while(1)
{
++num;
if(num>=1000) num=0;
}
return 0;
}
为按钮添加单击事件,加入代码AfxBeginThread(fun,NULL);
最后为对话框添加OnTimer事件,代码如下
CString s;
s.Format(_T("%d"),num);
c_edit.SetWindowTextW(s);
CDialog::OnTimer(nIDEvent);
这个程序运行后OnTimer就已经启动,会不断把num值写入editbox,点击按钮后,fun线程启动,不断累加num,直到1000时归零,也就是editbox不断在0-1000之间滚动
其实想想工作者线程中也并不需要MFC机制,能处理一些数据就可以了,标准cc++的库还是可以正常使用的,当然至于不能使用MFC的机制估计很有可能是我没发现用法,比如获取指针那里虽然只弹出一个unused,但是毕竟有这个函数有它的作用的,只不过我不知道用法而已,另外发送消息机制我是实在不会,也不知道能不能正常使用,不过不出意外估计也是不能直接拿来用的,不像mfc那么方便
这是开线程的一种思路,我也不知道一般软件开发这种情况是用的什么技术,至于怎么在线程中使用MFC机制,就看你有没有这个兴趣往那个方向去研究了
当然办法还是有的,思路是先全局定义一些变量,在工作者线程中去不断改变变量的值,把变量值反馈给对话框的任务交给OnTimer(),因为你的要求是自动刷新,那么也就是每隔一定时间刷新,那么OnTimer()就必不可少了。
我给你个例子,要写的代码非常少就不发工程了,步骤如下
建一个基于对话框工程,添加一个按钮,一个editbox,editbox绑定一个control变量c_edit
然后在oninitdialog中加int iInstallResult;
iInstallResult=SetTimer(1,1,NULL);
同样是这个cpp文件中的开头加int num=0;(全局)
再在全局位置添加线程函数
UINT fun(LPVOID pParam)
{
while(1)
{
++num;
if(num>=1000) num=0;
}
return 0;
}
为按钮添加单击事件,加入代码AfxBeginThread(fun,NULL);
最后为对话框添加OnTimer事件,代码如下
CString s;
s.Format(_T("%d"),num);
c_edit.SetWindowTextW(s);
CDialog::OnTimer(nIDEvent);
这个程序运行后OnTimer就已经启动,会不断把num值写入editbox,点击按钮后,fun线程启动,不断累加num,直到1000时归零,也就是editbox不断在0-1000之间滚动
其实想想工作者线程中也并不需要MFC机制,能处理一些数据就可以了,标准cc++的库还是可以正常使用的,当然至于不能使用MFC的机制估计很有可能是我没发现用法,比如获取指针那里虽然只弹出一个unused,但是毕竟有这个函数有它的作用的,只不过我不知道用法而已,另外发送消息机制我是实在不会,也不知道能不能正常使用,不过不出意外估计也是不能直接拿来用的,不像mfc那么方便
这是开线程的一种思路,我也不知道一般软件开发这种情况是用的什么技术,至于怎么在线程中使用MFC机制,就看你有没有这个兴趣往那个方向去研究了
追问
网上说可以用SetWindowText(); 或者AfxGetMainWnd()->UpdateData(TRUE); 我不知道这么实现,最好有例子然后发我邮箱我自己运行下看下
追答
这些确实用不了的,这个问题我也研究很久了,后来才想出上面的方法,换种思路也能达到你想要的目的的
如果你真想必须用MFC的机制,恐怕就不是分能解决问题的了,毕竟我也请教过别人的
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |