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

时间:2008-12-04 00:05:26

标签: c++ user-interface windows-mobile

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

我一直在寻找和阅读几天,每当我找到能让我接近的东西(比如CreateRoundRectRgn)时,它会爆炸,因为Windows Mobile 6 GDI +不支持它。

我可以做整个所有者画事物等。但是我如何弯曲那些硬角并重塑一个按钮呢? :/

注意可用工具:仅限本机Win32(无MFC)


这个想法发生在我身上,但它留下了两个问题:

1)带有圆边的位图是否仍然会使按钮的角落可见。

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

我使用方形按钮。但我见过其他软件使用的圆边按钮。 必须 才能重塑整个按钮。

2 个答案:

答案 0 :(得分:2)

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

Tee扩展问题对WinMo来说有点独特,因为iPhone确实只有一个分辨率。如果您需要针对不同分辨率的WinMo设备,您可以执行以下两项操作之一(您使用的内容取决于您正在使用的图像)。 Eitehr只是绘制缩放的图像,或包含不同大小的图像版本,并根据屏幕分辨率在运行时决定使用哪些。

答案 1 :(得分:1)

您可以使用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从中绘制。