【问题标题】:how to create a round/circular button in win32 API using visual c++如何使用 Visual C++ 在 Win32 API 中创建圆形/圆形按钮
【发布时间】:2009-11-12 14:53:26
【问题描述】:

我有一个 Visual c++ 中的 Window (win32 API) 应用程序。我没有使用 MFC。我必须用位图图像创建一个圆形/圆形按钮。我的应用程序有一个皮肤视图。任何人都可以帮助我完成这项任务。提前致谢。

【问题讨论】:

  • 较新的已作为完全重复的副本关闭。出于欺骗的原因,这个可能不应该关闭。
  • Ravi,您是说您的主窗口是蒙皮窗口吗?这与必须绘制圆形按钮有什么关系?

标签: api visual-c++ winapi


【解决方案1】:

按钮是窗口。您可以使用 CreateWindow 或 CreateWindowEx 调用来创建按钮:

-http://msdn.microsoft.com/en-us/library/ms632680(VS.85).aspx

当您创建按钮窗口时,请确保您传递了 BS_OWNDERDRAW 样式:

-http://msdn.microsoft.com/en-us/library/bb775951(VS.85).aspx

这将告诉按钮将 WM_DRAWITEM 消息发送到按钮的 WNDPROC:

-http://msdn.microsoft.com/en-us/library/bb775923(v=VS.85).aspx

在按钮的 WNDPROC 中,您将处理 WM_DRAWITEM 消息并根据作为 lParam 中的指针接收的 DRAWITEMSTRUCT 中的信息绘制按钮。

要将位图渲染为除矩形之外的任何内容,您需要提供与您希望为按钮渲染的位图大小相同的 1 位位掩码位图。位掩码设置了您希望在屏幕上设置按钮位图中的像素的位。按钮位图中不显示的像素必须是黑色的。使用 AND 运算符将您的位掩码位图 Bitblt 到屏幕,然后使用 OR 您的按钮位图。当然,您需要考虑各种按钮状态(通常一个按钮只有两种状态。)

我可能在上面的解释中混合了黑色/白色或设置/未设置位,但 AND / OR 按位 (SRCAND/SRCPAINT) 光栅操作是您想要实现的正确操作。

-http://msdn.microsoft.com/en-us/library/aa930997.aspx

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    您可以在 Google 上找到使用内存 DC 和各种 ROP2 设置来实现遮罩效果的 BitBlting 图像技术。代表按钮的圆形图像将使用特定颜色来表示透明度。我手头没有具体的代码,但它很重要。

    【讨论】:

      【解决方案3】:

      您需要知道的关键 api 调用是 SetWindowRgn。这就是您所说的告诉窗口窗口不是矩形而是不规则区域的方法。如果你用谷歌搜索,你会发现很多示例代码。

      一个有希望的例子是this project。它确实依赖于 MFC,但您可以使用它来了解您需要按什么顺序调用才能获得所需的效果。

      【讨论】:

        猜你喜欢
        • 2019-12-24
        • 2015-07-27
        • 2018-07-23
        • 1970-01-01
        • 2017-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-14
        相关资源
        最近更新 更多