【LibUIDK界面庫系列文章】Edit控件在不同操作系統及編譯環境下的區別

作者:劉樹偉


在Windows7下:
  加上WS_BORDER風格後,Edit周圍有一個一像素寬的邊框,輸入區域的左上右下Margin都是2。
  不加WS_BORDER風格創建,Edit無邊框,輸入區域的左上右下Margin都是0。

  不論是否有WS_BORDER風格,Edit的尺寸都是創建時指定的尺寸,並且使用GetWindowRect和GetClientRect得到的長和寬,都是相同的,Client尺寸並不比Window尺寸小。

  由於Edit的Window區域的大小與Client區域的大小相同,所以Edit無非客戶區,如果要繪製Edit的邊框,只需要處理WM_PAINT消息即可,不需要處理WM_NCPAINT(包含WS_EX_CLIENTEDGE風格的Edit控件除外,包含WS_EX_CLIENTEDGE風格的Edit控件,仍然包含常規的非客戶區邊框)。

在動態創建CEdit時,如果指定了WS_BORDER風格,創建成功之後,使用GetWindowLong得到的風格值,並不包含WS_BORDER,目前,沒有常規方法判斷CEdit是否包含WS_BORDER屬性。並且,使用SetWindowLong,也不能修改Edit控件的邊框屬性。
對於自己寫的Edit類,可又Hook Edit的創建過程,來保存窗口風格是否有WS_BORDER。通過Create接口來保存是否包含WS_BORDER是不可靠的,因爲用戶可能重寫虛函數PreCreateWindow,來修改Edit風格屬性。
對於第三方的Edit類,目前沒有好的方法可又判斷是否有邊框。

這種無法通過GetWindowLong來判斷控件是否有邊框是Edit特有的。經測試CListCtrl,仍然可以通過GetWindowLong來判斷是否有邊框。


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