2015-02-23 201 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