Win32为按钮设置颜色

时间:2014-07-31 07:26:32

标签: winapi button colors

作为Win32的初学者,我需要创建一个带按钮的网格。因此,基本上对于网格中的每个单元格,我都在创建按钮,如下所示:

DrawFrameControl(gdc,&rect,DFC_BUTTON,DFCS_BUTTONPUSH|DFCS_FLAT);

现在我需要为按钮设置颜色。我怎么做。

1 个答案:

答案 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。