作为Win32的初学者,我需要创建一个带按钮的网格。因此,基本上对于网格中的每个单元格,我都在创建按钮,如下所示:
DrawFrameControl(gdc,&rect,DFC_BUTTON,DFCS_BUTTONPUSH|DFCS_FLAT);
现在我需要为按钮设置颜色。我怎么做。
答案 0 :(得分:1)
您无法使用DrawFrameControl
执行此操作。它总是使用系统颜色绘制。当然,它们可以由用户在Personalization控制面板中配置,但默认情况下它们设置为单调灰色。
更糟糕的是,DrawFrameControl
是一个旧的API,不考虑主题(也称为“视觉样式”)。它绘制的按钮看起来像Windows 95中的经典按钮控件。您必须使用其中一个theming APIs来获取这些样式。
为了获得自定义颜色,您需要自己处理所有绘图。没有捷径。
如果您想要实际按钮控件,则可以使用BUTTON
窗口类和BS_OWNERDRAW
窗口样式创建一个新窗口。这将导致按钮控件将WM_DRAWITEM
消息发送到其父窗口,您可以在其中编写所有自定义绘图代码。
如果您只想要一些看起来的东西,就像一个按钮(这就是您想要的),您不需要创建实际的控件。您只需处理父窗口的WM_PAINT
消息并绘制伪按钮即可。我认为这是你试图用DrawFrameControl
做的事情。但是 - 正如我所提到的那样 - DrawFrameControl
总是用自己的颜色绘制,并且在彩色框的顶部绘制,好心的评论者建议你首先绘制。您可以做的是使用DrawEdge
function模拟DrawFrameControl
的效果。这基本上只是绘制按钮的边框,让你用你想要的任何东西填充中间 - 颜色,图案,图像等。示例代码:
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint(hWnd, &ps);
RECT rcButton;
rcButton.left = 50;
rcButton.top = 50;
rcButton.right = rcButton.left + 75;
rcButton.bottom = rcButton.top + 23;
// Set the DC's background color to whatever color we want the button to be.
// In this case, we use a nice orange. You can use anything you want.
// Or even fill the background with an image.
COLORREF clrOriginal = SetBkColor(ps.hdc, RGB(255, 128, 0));
if (clrOriginal != CLR_INVALID)
{
// Fill the button's rectangle with a solid color.
ExtTextOut(ps.hdc, 30, 30, ETO_OPAQUE, &rcButton, NULL, 0, NULL);
// Draw the button's border.
DrawEdge(ps.hdc, &rcButton, EDGE_RAISED, BF_TOPLEFT | BF_BOTTOMRIGHT);
// Restore the DC's original background color.
SetBkColor(ps.hdc, clrOriginal);
}
EndPaint(hWnd, &ps);
break;
}
结果:
它有效,但它并不漂亮,因为它不尊重系统主题。你需要DrawThemeEdge
function。并且很多有更多时间来投资学习Visual Styles API。