【问题标题】:How to create a resizable window with rounded-corners in win32如何在win32中创建一个带有圆角的可调整大小的窗口
【发布时间】:2010-02-04 16:27:03
【问题描述】:

我正在尝试创建一个 Win32 窗口,它具有圆角并且可以在水平和垂直方向上调整大小。我的第一种方法是创建圆角矩形的 BITMAP 并将其绘制到屏幕上,同时将窗口样式设置为 WS_EX_LAYERED 并将透明度键设置为圆角矩形的外部颜色。

这可行,但只有当窗口是固定大小时才看起来不错。如果我允许用​​户调整窗口大小并同时拉伸位图,圆角看起来也被拉伸了。有没有办法创建一个具有漂亮、光滑圆角并且在窗口中可调整大小的窗口?最后,我还想在窗口中添加阴影。

【问题讨论】:

  • 只是不要拉伸角落位图,只在角落使用它们。拉伸 hor/ver 位图不是问题。

标签: c++ winapi window rounded-corners resizable


【解决方案1】:

我会尝试混合使用 Windows API 函数 CreateRoundRectRgnSetWindowRgn。一个非常简单的例子可以在pInvoke.net web site.找到。

【讨论】:

    【解决方案2】:

    您可以创建一个没有任何框架的窗口,使用 WS_EX_LAYERED 获得透明度,然后在 WM_PAINT 中“通常”绘制包含自定义框架的窗口,或者您组成一个离屏位图,并使用 UpdateLayeredWindow(后者方法更有效)。

    当然,您必须将绘制的内容调整为窗口的当前大小。通常,您会从不同的元素组成它 - 例如使用四个“角”位图(或椭圆函数)绘制角,然后绘制边框等。

    此外,您可以处理 WM_NCHITTEST 将“标题”/“边框”/“角”功能(即移动和调整窗口大小)分配给窗口的任意区域。

    【讨论】:

    • 哈? WM_PAINT 不会与 WS_EX_LAYERED 一起触发。如果没有 WS_SIZEBOX/WS_THICKFRAME,则不会触发 WM_NCHITTEST。
    • 当您将 WS_EX_LAYERED 与 SetLayerdWindowAttributes 结合使用时,确实会调用 WM_PAINT。关于 WM_NCHITTEST 我很确定它确实会触发 - 我之前使用它来制作不可调整大小的非框架窗口可拖动
    • 哦,那么 WM_PAINT 在第一次调用 UpdateLayeredWindow 时就被禁用了?很高兴知道。您对 WM_NCHITTEST 的看法是正确的,我记错了,对噪音感到抱歉。
    • 是的,我现在记得:您确实得到了 WM_NCHITTEST,但如果您返回任何调整大小的常量,如 HTBOTTOMLEFT 等,它们会被忽略,如果您不指定 WS_THICKFRAME,则只有 HTCAPTION 和 HTCLIENT 真正有效。我刚刚测试了这个。
    【解决方案3】:

    您需要/需要以正确的形状绘制一个椭圆(或其他),而不是使用预先存在的位图绘制角,然后将其合成到屏幕上。例如,您可以选择一个椭圆,每个半径都是该方向上窗口大小的 5%。

    【讨论】:

      猜你喜欢
      • 2011-07-09
      • 2012-11-22
      • 2016-11-04
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      相关资源
      最近更新 更多