如何使用Visual C++和Win32 API创建圆形按钮

5

我有一个使用Visual C++编写的Window(Win32 API)应用程序,没有使用MFC。 我需要创建一个带有位图图像的圆形按钮。我的应用程序具有皮肤视图。 有人可以帮我完成这个任务吗?


2
新的那个因为完全重复而被关闭了。这一个应该不应该因为重复的原因而被关闭。 - Philip Rieck
Ravi,你是说你的主窗口是一个皮肤窗口吗?这与绘制圆形按钮有什么关系? - AlanKley
3个回答

3
按钮是窗口。您可以使用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

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

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

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

要将位图呈现为非矩形,您需要提供一个与您希望为其呈现按钮的位图大小相同的1位掩码位图。掩码在您希望在屏幕上设置按钮位图像素的位置设置了位。不显示的按钮位图中的像素需要是黑色的。使用AND运算符将您的掩码位图位块传输到屏幕上,然后将OR应用于按钮位图。当然,您需要考虑各种按钮状态(通常推按钮只有两种状态)。

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

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

希望这可以帮助您。


0

您可以通过谷歌搜索使用内存DC和各种ROP2设置的BitBlting图像技术来实现遮罩效果。代表按钮的圆形图像将使用特定颜色表示透明度。我手头没有具体的代码,但这并不是一件简单的事情。


0

你需要知道的关键API调用是SetWindowRgn。这是告诉Windows窗口不是矩形而是不规则区域的调用。如果你在谷歌上搜索,你会发现很多示例代码。

一个有前途的例子是this project。它确实依赖于MFC,但你可以使用它来学习你需要以什么顺序调用来获得所需效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接