解碼gdi物件控制代碼
今天都是在探索gdi內部的結構,在微軟的文件中並沒有系統的記載,雖然我覺得很有道理,但到底是不是這樣只有微軟自己知道了
(1)先看一下gdi控制代碼的定義,如hpen是這樣定義的
如果strict已經被定義了
struct hpen_ ;
typedef struct hpen_ * hpen;
如果strict沒有定義,hpen是這樣定義的
typedef void * handle;
typedef handle hpen;
坦白的說,如果定義了strict巨集,hpen是指向有單個未使用欄位的結構的指標,否則hpen是空指標。
。。。。。。。。然後本書作者經過一系列的探索,利用了乙個複雜的程式,列出的gdi中部分控制代碼的一些資訊,如記憶體位址,函式
名和序列。。。。。。
總之,最後得出了一些結論(根據記憶體位址)
32位的gdi控制代碼由8位未知的高位、1位堆物件標記、7位物件型別資訊和高4位是0的16位索引組成。借助7位物件型別資訊,可以確定
裝置上下文、區域、位圖、調色盤、字型、畫刷、加強型圖元檔案、畫筆和擴充套件畫筆。
如下圖
Effective C 讀書筆記 5
條款5 了解c 默默編寫並呼叫哪些函式 預設的函式包括 建構函式 copy建構函式 copy賦值運算子和析構函式,所有這些函式都是public且inline。這些函式僅當被呼叫的時候才會被編譯器建立出來。除非這個class的base class自身宣告有virtual析構函式,則這個class的析構...
《C Primer》讀書筆記 5
1.switch語句,有時我們可以故意不使用break語句,達到想要的效果。但是遇到這種情況最好要寫一段注釋,說明一下。正常情況下還是要寫break語句的,漏寫會引發很嚴重的後果。2.區域性靜態變數,在函式內部定義乙個static變數,函式終止之後,這個區域性的靜態變數仍然有效。靜態變數如果不初始化...
Effective cpp 讀書筆記5
切記將成員變數宣告為private。這可賦予客戶訪問資料的一致性 可細微劃分訪問控制 允諾約束條件或的保證,並提供class作者以充分的實現彈性 protected並不比public更具封裝性 這樣做可以增加封裝性 包裹彈性和技能擴充性 目的是為了保證函式一致性。典型例子是過載類的運算子operat...