如何在 WM6 中创建圆角矩形按钮?

Posted

技术标签:

【中文标题】如何在 WM6 中创建圆角矩形按钮?【英文标题】:How Can I Create Rounded Rectangle Buttons in WM6? 【发布时间】:2008-12-04 00:05:25 【问题描述】:

是的,就像 iPhone 上那些漂亮的按钮一样。 ;)

我已经搜索和阅读了好几天,每次我找到能让我接近的东西(如 CreateRoundRectRgn),它就会爆炸,因为 Windows Mobile 6 GDI+ 不支持它。

我可以做整个所有者的绘画之类的事情。但是我如何弯曲那些硬角并重塑按钮? :/

可用的笔记工具:仅本机 Win32(无 MFC)


我有过这样的想法,但它留下了两个问题:

1) 带有圆边的位图不会让按钮的角仍然可见。

2) 位图非常适合固定屏幕尺寸。但是有多种分辨率,我的目标是在运行时在内存中动态创建按钮位图并以这种方式使用它。

我可以使用方形按钮。然而,我见过其他软件使用的圆角按钮。 必须有办法重塑按钮。

【问题讨论】:

【参考方案1】:

获得这样漂亮的按钮通常是通过制作一个完整的所有者绘制的按钮并绘制一个图形设计师为其创建的图像来完成的,而不是让 GDI 完成任何控件绘制。您只需要一个“向上”的图像和一个“按下”的图像。您可以手动绘制焦点或使用另一个带有 ROP 蒙版的图像将其绘制在按钮上。要获得漂亮的“圆角”效果,您只需使用背景颜色创建图像,然后将其用作透明颜色。

Tee 缩放问题在某种程度上是 WinMo 独有的,因为 iPhone 确实只有一种分辨率。如果您需要针对不同分辨率的 WinMo 设备,您可以执行以下两项操作之一(您使用的操作取决于您使用的图像)。 Eitehr 只是绘制缩放的图像,或者包含不同尺寸版本的图像,并在运行时根据屏幕分辨率决定使用哪个版本。

【讨论】:

【参考方案2】:

您可以使用 RoundRect GDI 函数在所有者绘制的控件上执行此操作。

//Set up a brush and pen
HBRUSH brush = CreateSolidBrush(RGB(255, 0, 0));
HPEN pen = CreatePen(PS_SOLID, 1, RGB(0, 255, 0));

//Select it
HGDIOBJ old_brush = SelectObject(hdc, brush);
HGDIOBJ old_pen = SelectObject(hdc, pen);

//Draw your rectangle
RoundRect(hdc, m_rect.left, m_rect.top, m_rect.right, m_rect.bottom, 10, 10);

//restore the old state of your HDC
SelectObject(hdc, old_brush);
SelectObject(hdc, old_pen);

//Clean up
DeleteObject(brush);
DeleteObject(pen);

如果您想做一些更高级的事情,比如用渐变填充它,您可以将渐变绘制到屏幕外缓冲区并使用 CreatePatternBrush 从中进行绘制。

【讨论】:

以上是关于如何在 WM6 中创建圆角矩形按钮?的主要内容,如果未能解决你的问题,请参考以下文章

MFC 画一个圆角的 矩形 我要的不是按钮注意 只是画图!

创建带有圆角矩形的进度指示器

MFC怎么绘制一个圆角矩形

在 Swift 中使用 UIRectCorner 的圆角矩形不起作用

摆脱圆形矩形按钮的圆角(MonoTouch)

如何在android中创建形状三角形