mfc中tab的控件处理事件触发view类的函数

遇到的问题:

在mainframe中动态创建了一个tab控件,tab控件上拖放了一个控件(待会处理的就是这个控件的事件),此时,我用classwizard添加事件处理程序,开始,想直接把事件处理程序添加到view类中,classwizard可以帮助添加代码,但是添加进去后,在运行的时候,完全不能进入这个函数。。。。(在此狂烈鄙视微软的平台)。。。

我左看右看,我的类被我加入了消息映射网啊,为什么呢,为什么呢???为什么view类不接受呢 。哇靠。。。

首先说下,我的tab控件中添加的属性页是CMyDlg,继承于CDialog。然后CDialog上放的是一个我自己编写的控件(CGLClock,一个表盘控件,用于控制高炉剖面的角度<我的项目是一个高炉...哈哈>,这个控件我写了一个事件,当角度发生变化的时候会触发该事件)。于是乎,我设了两个全局变量,m_oldangle,m_newangle,先让m_oldangle=m_newangle.设为全局变量主要是为了便于我在view类中能够共享。。知道了吧。。。(没有办法的办法)。

然后我在view类的precreatewindow中创建了一个线程。用这个线程来监听这两个变量的值。。。这样的确可以达到我想要的结果(当这两个变量不一样时,马上触发view类的ondraw函数),但是不足的是我不能做成socket编程中的那个listen函数那样(在此像ms的工作人员致敬),这里我又采取了两种方法:

开始的时候,我在线程函数中,进入线程函数我立马又创建了一个线程,判断条件是否满足,如果不满足,当前线程结束。于是又可以用新创建的线程来进行监听。。。。子子孙孙,无穷尽也。。。(幸亏TMD生育能力不错),但是发现我电脑的cpu要爆炸了,都达到了90%以上,不行,这绝对不能容忍的,这么小的功能占用这么多的cpu,我还怎么听歌呢。。。哈哈

分析了一下 ,是这样的。。。为什么回有这么多的cpu占用呢,源码摆出来吧还是:

precreatewindow中的代码为:

HANDLE hThread = CreateThread(...func);CloseHandle(hThread);

DWORD WINAPI func()

{

      HANDLE hThread=CreateThread(..func);

      CloseHandle(hThread);

      if(m_oldangle != m_newangle){pview->RedrawWindow();}

}

一看就知道了。。。我的线程一直在和所有的进程为敌。

然后我又改呀改。。。cpu最少都还占用60%。。头疼啊。。。

行了,不罗嗦了。。。。

真相如下:

我是这样实现的:

由于我的控件的事件唯一可以处理的是CMyDlg,于是我就让他处理吧,谁让你抢着要处理的呢。。。这个时候我突然想起可爱的theApp变量来了,平时都不怎么用的,关键时候还是你好啊。我用它获得了当前程序的view。。。爽。

代码如下:

CBFengineView* pView = (CBFEngine)((CMainFrame*)theApp.mPmainWnd)->GetActiveView();

pView->RedrawWindow();

哦。。。。大功告成。。。哇靠。。。好累。。

 

posted @ 2011-04-11 21:19  luck_net  阅读(364)  评论(0编辑  收藏  举报