由於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()的第二個參數指定為本控制項的主視窗的視窗控制代碼,這樣就可以真正正常使用了。
不過,問題並沒有完全解決,還有控制項上的控制項訊息問題,特別是退出時會有問題,這會不按正常情況退出,此問題還沒有解決,先寫到這裡,以後有瞭解決方案,再進行回複。