Winapi Win32设置按钮的颜色

Winapi Win32设置按钮的颜色,winapi,button,colors,Winapi,Button,Colors,作为Win32的初学者,我需要创建一个带有按钮的网格。所以基本上,对于网格中的每个单元格,我创建的按钮如下所示: DrawFrameControl(gdc,&rect,DFC_BUTTON,DFCS_BUTTONPUSH|DFCS_FLAT); 现在我需要设置按钮的颜色。如何操作。使用DrawFrameControl无法执行此操作。它总是使用系统颜色绘制。当然,它们可以由用户在个性化控制面板中进行配置,但默认情况下设置为灰色 更糟糕的是,DrawFrameControl是一个不考虑主题

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

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

现在我需要设置按钮的颜色。如何操作。

使用
DrawFrameControl
无法执行此操作。它总是使用系统颜色绘制。当然,它们可以由用户在个性化控制面板中进行配置,但默认情况下设置为灰色

更糟糕的是,
DrawFrameControl
是一个不考虑主题化(也称为“视觉样式”)的旧API。它绘制的按钮看起来像Windows95中的经典按钮控件。您必须使用其中一个来选择这些样式

为了获得自定义颜色,您需要自己处理所有图形。没有捷径可走

如果需要实际的按钮控件,可以使用
button
窗口类和
BS_OWNERDRAW
窗口样式创建一个新窗口。这将导致button控件向其父窗口发送
WM_DRAWITEM
消息,您将在父窗口中编写所有自定义绘图代码

如果你只是想要一个看起来像按钮的东西(这就是你在这里想要的),你不需要创建实际的控件。您只需处理父窗口的
WM_PAINT
消息并绘制伪按钮。我想这就是您使用
DrawFrameControl
所要做的。但正如我所提到的-
DrawFrameControl
总是使用自己的颜色绘制,并且在善意的评论者建议您首先绘制的彩色框的顶部绘制。您可以使用来模拟
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;
}
结果:


它可以工作,但不美观,因为它不尊重系统主题。你需要有足够的时间。还有更多的时间来学习视觉风格API

HBRUSH-HBRUSH=::CreateSolidBrush(…)
后接
::FillRect(&rect,HBRUSH)
::SetBkColor(…)
后接
::ExtTextOut(…)
。第二个选项性能更好,但不太容易理解。请尝试。。。HBRUSH HBRUSH=CreateSolidBrush(RGB(102255192));FillRect(gdc,&rect,hBrush);DrawFrameControl(gdc、&rect、DFC_按钮、DFCS_按钮推压、DFCS_平面);不工作。-1“不工作”不够好。如果你不能清楚地展示你所做的尝试,并且详细解释它是如何无法满足你的期望的,那么没有人能帮助你。:)我正在使用这个示例创建一个网格,现在在BabyGrid.cpp的DisplayColumn(…)中,它正在使用DrawFrameControl创建按钮(gdc,&rect,DFC_按钮,DFCS_按钮push | DFCS_FLAT);(改为按钮)。现在根据上面的建议:我尝试了…HBRUSH HBRUSH=CreateSolidBrush(RGB(102255192));FillRect(gdc,&rect,hBrush);后跟DrawFrameControl(…)。但是按钮的颜色没有改变,仍然是灰色的。。。现在还有什么其他选项(我只使用Win32)…通过上面建议的另一种方式,SetBkColor(…)后跟ExtTextOut(…),我需要ExtTextOut(…)的X,Y坐标,按照文档[Link]()。我需要在网格的单元格中画一个按钮。通过LVITEMA的子项,我如何获得每个子项的X/Y坐标。让我试试,我有一些周末的学习材料(DrawThemeEdge)。非常感谢,这是一个解决方案。