CDesktop類的開工

2021-03-31 12:02:25 字數 1244 閱讀 9144

cdesktop類負責處理視窗們。當乙個視窗createwin以後,再在window上面add一些control,把它add到cdesktop裡面就算完事了。當然在add之前可以酌情保留其指標方便控制,也可以用cdesktop類的findwindow()函式查詢指定name的window,返回其指標再對其操作。而繪製桌面視窗的時候只需把desktop變數的指標傳遞給cgraph的renderdesktop()函式即可繪畫出所有的視窗及其子控制項。真是方便之極。難免自己要先陶醉一下。

在cdesktop裡面,我用到了stl,標準模板庫。

#include

using namespace std;

用了其中的list容器,來儲存add函式傳遞來的視窗控制代碼。

listm_pwinlist;

每當傳進新的視窗控制代碼,就把他壓入list容器的前面. (push_front)。

m_pwinlist.push_front(pnewwin);

先規範一下窗體處理的順序問題。

一般來說,繪畫窗體是按照窗體的zorder循序,處於最上層的視窗最後繪畫,以遮蓋下層的視窗。因此定義如下規則:

1. 最前的視窗處於list容器的前端( front, begin() )

2. 處理繪畫函式從list容器的後端開始逐個窗體繪畫.

// 繪畫所有視窗

bool cdesktop::draw(idirectdrawsu***ce * lpdds, lprect lprect)

while ( m_pwiniterator != m_pwinlist.begin() );

return true;

}3. 處理訊息函式從list容器的前端開始逐個測試傳遞.

因為把窗體初始化的**單獨拿了出來,所以要注意乙個問題:

當切換全屏/視窗模式的時候,會釋放掉舊的directdraw。那麼舊的directdraw所建立的su***ce同樣會失效。所以,desktop同樣要在切換模式之前執行釋放函式把所有的子窗體釋放掉,待重新初始化directdraw後再重新初始化窗體。否則,窗體所儲存的su***ce指標指向的將不會再是乙個有效的directdrawsu***ce。這個問題花了我幾乎乙個小時去debug。得益於遠端除錯,兩台機器並用能夠一邊看**一邊除錯,否則切換成全屏就不能看到**這個問題有排煩了。途中順便也把之前提到可能的訪問異常去掉了。原來csu***ce沒有把lpdds初始化為null而使到釋放巨集不能判斷指標的有效性,直接執行了乙個無效的release()操作。這是乙個低階的錯誤,sigh。

好,繼續完善。

辦理施工許可和開工報告的條件

施工許可的條件 1 辦理用地批准手續 獲取土地使用權 獲取施工許可 2 城鎮規劃區建立的工程需要獲取建設用地規劃許可,建設工程規劃許可 3 執行緒符合基本施工條件 三通一平 需要拆遷的,拆遷進度符合施工的要求 4 有符合工程的施工圖紙和技術資料,施工圖紙設計檔案已按規定審查 5 保證工程質量和安全的...

寫在新年開工前的一點感悟

過年假期已經結束,是時候調整好狀態開始新的一年的努力了!這個長假選擇響應國家號召 就地過年,也算是體驗了一回南方的過年。大致整理假期都做了哪些事情,如下 所以,這篇感悟就從上面內容說起。先說 山海情 這部劇,講述了當年寧夏西海固地區吊莊移民工程的歷史程序。展現了在那塊貧瘠的山溝溝裡,一些敢為人先,渴...

開工大吉!簡單的說說公司的開發規範

介面規範 1 在開發之前必須要先定義介面,定義介面就必須要思考你的需求,邏輯,在寫介面文件的時候其實你就已經在你的大腦中實現了一遍你的需求了。2 你定義的介面也是要有標準的,包括不包含多餘的字段,正式環境和測試環境的資料格式必須一致,文件與真實開發出來的介面必須一致等等。3 在開發的過程中,如果介面...