當微軟把作業系統從 Dos 轉換成 Windows 後,過場的 Win3.1 就不說了,在 Win95 的年代裡就讓我頭痛的
不得了,想要用 Win 32 API 來寫視窗程式就是找不到方法,現在終於有了網路協助,才讓我燃起一絲絲希望。
可是在這一段時間裡讓我很難體會的就是微軟定義了許多的視窗訊息和資料結構,我們暫時放下視窗訊息先不管,
先看一下上一回有使用到的 PAINTSTRUCT ps 的資料結構吧。
在 winuser.h
typedef struct tagPAINTSTRUCT {
HDC hdc;
WINBOOL fErase;
RECT rcPaint;
WINBOOL fRestore;
WINBOOL fIncUpdate;
BYTE rgbReserved[32];
} PAINTSTRUCT,*PPAINTSTRUCT,*NPPAINTSTRUCT,*LPPAINTSTRUCT;
結構內的成員:
HDC hdc
輸出裝置資料結構之指引碼
WINBOOL fErase
是否刪除背景。
如果應用程式應擦除背景,則此值為非零。
如果建立視窗類時沒有背景畫筆,應用程式負責擦除背景。
有關詳細資訊,請參閱 WNDCLASS結構的 hbrBackground成員的說明。
呵呵!這微軟的說明書還真會扯,還要去看WNDCLASS結構的 hbrBackground成員的說明,為什麼就不一次說明。
好吧,就轉台看一下 hbrBackground又有什麼花樣。
在上一篇我們的設定是這樣的:
wndclass.hbrBackground = GetSysColorBrush(COLOR_3DFACE)
docs.microsoft.com 是這麼說著
hbrBackground
型態: HBRUSH
類背景畫筆的指引碼。此成員可以是用於繪製背景的畫筆的指引碼,也可以是顏色值。
顏色值必須是以下標準系統顏色之一(必須將值 1 添加到所選顏色中)。
如果給定顏色值,則必須將其轉換為以下HBRUSH 類型之一:
COLOR_ACTIVEBORDER。
COLOR_ACTIVECAPTION。
COLOR_APPWORKSPACE。
COLOR_BACKGROUND。
COLOR_BTNFACE。
COLOR_BTNSHADOW。
COLOR_BTNTEXT。
COLOR_CAPTIONTEXT。
COLOR_GRAYTEXT。
COLOR_HIGHLIGHT。
COLOR_HIGHLIGHTTEXT。
COLOR_INACTIVEBORDER。
COLOR_INACTIVECAPTION。
COLOR_MENU。
COLOR_MENUTEXT。
COLOR_SCROLLBAR。
COLOR_WINDOW。
COLOR_WINDOWFRAME。
COLOR_WINDOWTEXT。
咦!怎麼沒有COLOR_3DFACE這個選項,莫非 docs.microsoft.com 失靈了?
在winuser.h再查函數GetSysColor。
DWORD GetSysColor(
int nIndex
);
docs.microsoft.com 上是這麼說的
參數
nIndex
型態: int
要檢索其顏色的顯示元素。此參數可以是以下值之一。
參數值 意義
COLOR_3DDKSHADOW。
21 用於三維顯示元素的暗影。
COLOR_3DFACE。
15 3D 顯示元素和對話框背景的面色。
COLOR_3DHIGHLIGHT。
20 高亮顯示 3D 顯示元素的顏色(用於面向光源的邊緣)。
COLOR_3DHILIGHT。
20 高亮顯示 3D 顯示元素的顏色(用於面向光源的邊緣)。
COLOR_3DLIGHT。
22 三維顯示元素的淺色(用於面向光源的邊緣)。
COLOR_3DSHADOW。
16 三維顯示元素的陰影顏色(用於面向遠離光源的邊)。
COLOR_ACTIVEBORDER。
10 活動視窗邊框。
COLOR_ACTIVECAPTION。
2 活動視窗標題列。
關聯的前景顏色為COLOR_CAPTIONTEXT。
如果啟用漸變效果,則指定活動視窗標題列的顏色漸變中的左側顏色。
COLOR_APPWORKSPACE。
12 多重文件介面 (MDI) 應用程式的背景顏色。
COLOR_BACKGROUND。
1 桌面。
COLOR_BTNFACE。
15 3D 顯示元素和對話框背景的面色。關聯的前景顏色為COLOR_BTNTEXT。
COLOR_BTNHIGHLIGHT。
20 高亮顯示 3D 顯示元素的顏色(用於面向光源的邊緣)。
COLOR_BTNHILIGHT。
20 高亮顯示 3D 顯示元素的顏色(用於面向光源的邊緣)。
COLOR_BTNSHADOW。
16 三維顯示元素的陰影顏色(用於面向遠離光源的邊)。
COLOR_BTNTEXT。
18 按鈕上的文字。關聯的背景色COLOR_BTNFACE。
COLOR_CAPTIONTEXT。
9 標題、大小框和滾動條箭頭框中的文本。關聯的背景色
COLOR_ACTIVECAPTION。
COLOR_DESKTOP。
1 桌面。
COLOR_GRADIENTACTIVECAPTION。
27 作用視窗標題列的顏色漸變中的右方顏色。COLOR_ACTIVECAPTION指定
左側顏色。
使用SPI_GETGRADIENTCAPTIONS系統參數資訊函數來確定是否啟用漸變
效果。
COLOR_GRADIENTINACTIVECAPTION。
28 非活動視窗標題列的顏色漸變中的右側顏色。COLOR_INACTIVECAPTION
指定左側顏色。
COLOR_GRAYTEXT。
17 灰色(已禁用)文本。如果當前顯示驅動程式不支援純灰色,
此顏色設置為 0。
COLOR_HIGHLIGHT。
13 在控件中選擇的專案。關聯的前景顏色COLOR_HIGHLIGHTTEXT。
COLOR_HIGHLIGHTTEXT。
14 控制項選取的項目的文字。關聯的背景色COLOR_HIGHLIGHT。
COLOR_HOTLIGHT。
26 超連結或熱跟蹤項目的顏色。關聯的背景色COLOR_WINDOW。
COLOR_INACTIVEBORDER。
11 非活動視窗邊框。
COLOR_INACTIVECAPTION。
3 非活動視窗標題。
關聯的前景顏色COLOR_INACTIVECAPTIONTEXT。
如果啟用漸變效果,則指定非活動視窗標題列的顏色漸變中的左側顏色。
COLOR_INACTIVECAPTIONTEXT。
19 非活動標題中文字的顏色。關聯的背景色COLOR_INACTIVECAPTION。
COLOR_INFOBK。
24 工具提示控制項的背景顏色。關聯的前景顏色為COLOR_INFOTEXT。
COLOR_INFOTEXT。
23 工具提示控制項的文字顏色。關聯的背景色COLOR_INFOBK。
COLOR_MENU。
4 功能表背景。關聯的前景顏色COLOR_MENUTEXT。
COLOR_MENUHILIGHT。
29 當功能表顯示為平面功能表時用於突出顯示功能表項的顏色
(請參閱SystemParametersInfo)。突出顯示的功能表項與
COLOR_HIGHLIGHT。
視窗 2000:不支援此值。
COLOR_MENUBAR。
30 功能表顯示為平面功能表時功能表欄的背景顏色
(請參閱SystemParametersInfo)。
但是COLOR_MENU,將繼續指定功能表彈出視窗的背景顏色。
視窗 2000:不支援此值。
COLOR_MENUTEXT。
7 選單中的文字。關聯的背景色COLOR_MENU。
COLOR_SCROLLBAR。
0 滾動條灰色區域。
COLOR_WINDOW。
5 視窗背景。關聯的前景顏色為 COLOR_WINDOWTEXT COLOR_HOTLITE。
COLOR_WINDOWFRAME。
6 視窗框架。
COLOR_WINDOWTEXT。
8 視窗中的文字。關聯的背景色COLOR_WINDOW。
RECT rcPaint
擬進行塗繪之矩形。
RECT結構,指定請求繪畫的矩形的左上角和右下角,以相對於工作區左上角的設備單位為單位。
WINBOOL fRestore
往下三個成員保留只限系統使用。
WINBOOL fIncUpdate
BYTE rgbReserved[32]
好了,終於有看到 COLOR_3DFACE,各位看倌可以試著把各個參數代入
wndclass.hbrBackground = GetSysColorBrush(COLOR_3DFACE) 一下,你可以看到
Ellipse (hdc,100,100,200,200);
Ellipse (hdc,250,200,350,250);
Rectangle(hdc,10,10,150,150); 等等的變化,我就不再貼圖了,讓各位看倌自個兒動手了。
延伸閱讀
.