由于DXUT中用到了很多的全局变量,所以把DXUT用到控件中之后,如果上层程序用到了多个使用了DXUT的控件,则这些控件中的全局变量就会互相冲突导致只有一个控件可以正常使用而其它的控件不能使用。
为了解决此问题,把DXUT中的全局变量全部收集起来,然后通过增加接口来由控件主动调用以达到动态生成这些原来的全局变量的目的。这样,每个控件中都有一套自己的全局变量(被收集起来之后的全局变量),然后对DXUT的接口需要增加参数,以说明其操作的对像是处于哪个全局变量之中。
有类似如下的代码结构:
// DXUT中收集起来的全局变量
class CDXUTObject
{
public:
// 把DXUT中的所有全局变量放到这里来
};
然后在DXUT中增加两个接口:
unsigned long CreateDXUT()
{
CDXUTObject *p = new CDXUTObject();
return (unsigned long)p;
}
void DestroyDXUT( unsigned long lDXUT )
{
CDXUTObject *p = (CDXUTObject*)lDXUT;
delete p;
}
在DXUT的接口中都增加一个参数 unsigned long lDXUT,然后在用到原来的全局变量的地方这样使用:
CDXUTObject *p = (CDXUTObject*)lDXUT;
p->全局变量名称
在控件中,需要先通过CReateDXUT()来分配全局变量,然后在调用接口时,把它的反回值传入到每个DXUT接口中即可。
通过以上的修改之后,就可以把有多个用到了DXUT的控件用到一个程序中了。但是,还有以下问题。
由于在DXUTMainLoop()中用到了PeekMessage(),而且它的第二个参数(窗口句柄)为NULL,所以在一个控件中的此函数会截获所有控件中的消息,从而导致只有一个控件可以正常使用,而其它控件不能显示。为了解决此问题,需要把PeekMessage()的第二个参数指定为本控件的主窗口的窗口句柄,这样就可以真正正常使用了。
不过,问题并没有完全解决,还有控件上的控件消息问题,特别是退出时会有问题,这会不按正常情况退出,此问题还没有解决,先写到这里,以后有了解决方案,再进行回复。