2015-02-23 198 views
4

在純WinAPI(沒有MFC)中實現EDIT控件的自定義圓角邊框的正確方法是什麼?我需要邊境像這樣的編輯:帶自定義邊框的WINAPI編輯控件

enter image description here

我應該繼承編輯控件並進行自定義畫WM_NCPAINT或類似的東西?

回答

2

我想你有兩個選擇:

  • 正如你所說,你可以子類並覆蓋WM_NCPAINT等提供自己的非客戶區
  • 或者,你可以簡單地關閉邊框樣式在編輯控件上,並使父窗口負責繪製框架。

對於選項#1,你需要重寫WM_NCCALCSIZE使編輯控件較大的非客戶區(即讓客戶面積),然後WM_NCPAINT呈現您的自定義框架。您可能還需要處理WM_NCHITTEST。當然,您需要使控制器本身體積更大,以應對額外的框架厚度。

這取決於您的應用程序設計以及您希望使用的此類控件的數量,但如果是我,我會選擇#2。修改系統控件的標準繪圖行爲,其中很多都有數十年累積的雜質和兼容性修補程序,通常並不像您期望的那麼容易。

如果確保WS_BORDERWS_EX_CLIENTEDGE樣式未在編輯控件上設置,則它將沒有自己的可見邊框。然後,只需處理WM_PAINT的父窗口,就可以在其中繪製框架。確保在父窗口上設置了WS_CLIPCHILDREN樣式,以便您的自定義繪圖不會覆蓋編輯控件。

任何一條路徑最終都可能工作,儘管如此,它取決於您的路線。

+3

不要忘記使用'SetWindowRgn()'給編輯控件的圓角邊緣。僅畫圓角邊緣是不夠的(這是HRWN可以幫助你做的),但是你必須實際確定編輯窗口的形狀。 – 2015-02-23 23:39:27

+0

謝謝你們,我跟着選項#2,但面臨問題:如果我刪除WS_EX_CLIENTEDGE標誌,文本變得垂直不對齊:http://gyazo.com/f125abcc5973cf537732eccd07481bda – mbg033 2015-02-24 19:18:33

+0

另外,我不能讓SetWindowRgn()帶有圓角區域和邊框繪畫代碼一起工作..我看到圓形編輯只有當我禁用邊框繪畫代碼http://gyazo.com/6b2d505b3b24882cb4d8c30fa9519345;如果繪製代碼啓用我看到這個:http://gyazo.com/5cbd8bd9537c93c12e00fdc2568d222d;代碼:https://gist.github.com/mbg033/91e262dfd5798f62000d – mbg033 2015-02-24 20:44:02