把DXUT用到控制項中

來源:互聯網
上載者:User

由於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()的第二個參數指定為本控制項的主視窗的視窗控制代碼,這樣就可以真正正常使用了。

 

不過,問題並沒有完全解決,還有控制項上的控制項訊息問題,特別是退出時會有問題,這會不按正常情況退出,此問題還沒有解決,先寫到這裡,以後有瞭解決方案,再進行回複。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.