Windows API 關於控件的自繪——文本顏色、背景顏色、字體

首先要將控件設置爲可以自畫,例如:要自畫一個按鈕,在窗口的WM_CREATE中創建類名爲“BUTTON”的子窗口,風格必須包含BS_OWNERDRAW。然後在父窗口的WM_DRAWITEM中編寫自畫按鈕的樣式,可以包含字體,背景,文本顏色等。

 

由查詢MSDN中WM_DRAWITEM可知,該消息包含兩個參數:控件id以及自畫信息,自畫信息爲一個自畫結構體,該結構體包含自畫需要的各種信息,通過強制轉換lParam可以得到。代碼:LPDRAWITEMSTRUCT lpDis = (LPDRAWITEMSTRUCT)lParam;

 

要先畫出按鈕以後再設置文本,否則按鈕會將文本覆蓋。

 

按鈕:如果控件類型爲ODT_BUTTON,即該控件爲按鈕,則繪製按鈕。

按鈕樣式:DFCS_BUTTONPUSH與DFCS_PUSHED。

當正常狀態下爲DFCS_BUTTONPUSH風格,當鼠標按下時,按鈕狀態改變,爲DFCS_PUSHED風格。因此注意要進行判斷,切換按鈕狀態。

根據觀察,當按鈕按下時,按鈕上的文本有隨着按鈕的按下稍微有所移動,因此定義一個矩形,初始化爲lpDis->rcItem,當按鈕按下,該矩形左上角向右下移動兩個像素點,右下角不變

繪製按鈕需要用到DrawFrameControl函數,該函數原型爲:BOOL DrawFrameControl(HDC hdc, LPRECT lprc, UINT uType, UINT uState);其中hdc,lprc都可以從結構體中獲得。

代碼:      RECT rt = lpDis->rcItem;

                UINT uState = DFCS_BUTTONPUSH;

                if (uState & ODS_SELECTED)
                {
                    uState |= DFCS_PUSHED;
                    rt.left += 2;
                    rt.top += 2;
                }
 

                DrawFrameControl(lpDis->hDC, &rt, DFC_BUTTON, uState);//畫控件

 

接下來就是改變按鈕字體:首先要創建一個字體,然後選擇該字體,最後輸出的字體就是選擇好的字體了。

字體:創建字體函數爲CreateFont函數,選擇字體用SelectObject函數。具體函數參數以及參數取值查詢MSDN,由於CreateFont參數較多,就不一一詳述了。代碼如下:

HFONT hFont = CreateFont(16, 0, 0, 0, FW_DONTCARE, 0, 0, 0, GB2312_CHARSET,

                                                OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,

                                                DEFAULT_PITCH|FF_DONTCARE, "微軟雅黑");//創建字體

SelectObject(lpDis->hDC, hFont);//選擇字體

 

文本顏色:獲取按鈕上的文本(使用GetWindowText函數,參數爲控件句柄,文本緩存區,以及最大緩存),設置文本輸出的顏色(使用SetTextColor函數,參數爲設備上下文,顏色),然後將文本輸出到按鈕(使用DrawText函數而不是TextOut函數,因爲要設置文本單行居中)。其中控件句柄,設備上下文都可以從自畫結構體中直接獲得。

代碼如下:char szBuf[50];
                GetWindowText(lpDis->hwndItem,szBuf, 50);//獲取控件中文本

                SetTextColor(lpDis->hDC, RGB(0,0,255));//設置文本顏色

                SetBkColor(lpDis->hDC, RGB(255,255,0));//設置文本背景

              DrawText(lpDis->hDC, szBuf, strlen(szBuf), &rt, DT_SINGLELINE | DT_CENTER | DT_VCENTER);//輸出文本到控件

 

最後運行結果如下:

 

如果使用的資源文件直接拖進去的控件,在屬性中選擇自畫風格,後面操作相同。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章