更改在vc ++中使用CreateWindow创建的静态控件文本的背景颜色

时间:2013-11-20 11:19:30

标签: visual-studio-2010 winapi visual-c++

我正在VC++开发一个开源项目,想要更改静态控件的背景颜色。

hwndRenderMessage = CreateWindow(TEXT("STATIC"), Str("MainWindow.BeginMessage"),
    WS_CHILDWINDOW|WS_VISIBLE|WS_CLIPSIBLINGS|SS_CENTER,
    0, 0, 0, 0, hwndRenderFrame, NULL, hinstMain, NULL);

SendMessage(hwndRenderMessage, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE);

并且该控件的父控件是

 hwndRenderFrame = CreateWindow(OBS_RENDERFRAME_CLASS, NULL,
    WS_CHILDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN,
    0, 0, 0, 0,
    hwndMain, NULL, hinstMain, NULL);
if(!hwndRenderFrame)
    CrashError(TEXT("Could not create render frame"));

那么如何更改静态控件的背景颜色..

我谷歌并获得相同的答案使用

case WM_CTLCOLORSTATIC:
{
HDC hdcStatic = (HDC) wParam;
SetTextColor(hdcStatic, RGB(0,0,0));
SetBkColor(hdcStatic, RGB(230,230,230));
return (INT_PTR)CreateSolidBrush(RGB(230,230,230));
}

但文件中没有切换案例那么该怎么办? 实际上我在c#上工作,但这是第一次使用vc ++

Button image

2 个答案:

答案 0 :(得分:1)

我从sourceforge下载了OBS源代码。

Window Proc是位于WindowStuff.cpp

中的OBS :: RenderFrameProc

在proc的底部(但在“return”之前),添加:

else if(message == WM_CTLCOLORSTATIC ) {
    // HERE YOUR CODE
}

编辑:更改按钮背景

首先,建议:“不要那样做”。按钮是Windows GUI非常重要和常见的组件,它们的外观应该在所有应用程序中保持一致。用户可以通过各种方式为桌面自定义内容,这包括“可访问性”问题和行为。想要以“自己的特殊方式”进行的应用程序只会带来问题。

其次,尝试使用此代码将“Setting ...”按钮背景更改为丑陋的绿色:在交换机(wParam)中的OBS :: OBSProc中的WM_NOTIFY消息处理中添加一个案例

case ID_SETTINGS:
   if(nmh.code == NM_CUSTOMDRAW)
   {
      LPNMCUSTOMDRAW  lpcd = (LPNMCUSTOMDRAW)lParam;
      if (lpcd->dwDrawStage == CDDS_PREPAINT )
      {
         SetDCBrushColor(lpcd->hdc, RGB(0, 255, 0));
         SelectObject(lpcd->hdc, GetStockObject(DC_BRUSH));
         LONG lBorders = 0;
         LONG lElipse = 5;
         RoundRect(lpcd->hdc, lpcd->rc.left + lBorders, lpcd- rc.top + lBorders,
                   lpcd->rc.right - lBorders, lpcd->rc.bottom - lBorders, lElipse, lElipse);
         return CDRF_NOTIFYPOSTPAINT;
       }
    }
    break;             

另一种选择,具有更多标准边框:

         SetDCBrushColor(lpcd->hdc, RGB(0, 255, 0));
         SetDCPenColor(lpcd->hdc, RGB(0, 255, 0));
         SelectObject(lpcd->hdc, GetStockObject(DC_BRUSH));
         SelectObject(lpcd->hdc, GetStockObject(DC_PEN));
         LONG lBorders = 3;

要完成,您可能需要检查lpcd的uItemState成员,以获取CDIS_HOT标志,相应地更改颜色。

答案 1 :(得分:0)

您需要将该代码放在窗口过程中。窗口过程如下所示:

LRESULT CALLBACK RenderMessageWndProc(HWND hWnd, UINT message, WPARAM wParam,
    LPARAM lParam)
{
    switch (message)
    {
    case WM_CTLCOLORSTATIC:
        // your code goes here
        return ....
    }
    return DefWindowProc(hWnd, message, wParam, lParam);
}

您需要对窗口进行子类化,以便它使用此WndProc。像这样:

SetWindowLongPtr(hwndRenderMessage, GWLP_WNDPROC, (LONG_PTR)RenderMessageWndProc);

如果您不知道窗口过程是什么,或者什么是子类,那么您真的需要退一步学习一些基础知识。例如,Petzold的经典着作“编程Windows”仍然是一个很好的起点。