首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >更改使用CreateWindow在vc++中创建的静态控件文本的背景色

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

Stack Overflow用户
提问于 2013-11-20 11:19:29
回答 2查看 1.3K关注 0票数 1

我正在VC++中处理一个开源项目,并希望更改静态控件的背景色。

代码语言:javascript
代码运行次数:0
运行
复制
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);

此控件的父控件为

代码语言:javascript
代码运行次数:0
运行
复制
 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"));

那么如何改变静态控件的背景色。

我搜索它并得到相同的答案使用

代码语言:javascript
代码运行次数:0
运行
复制
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++上工作

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-20 13:47:07

我从sourceforge下载了OBS源代码。

窗口Proc是位于WindowStuff.cpp中的OBS::RenderFrameProc。

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

代码语言:javascript
代码运行次数:0
运行
复制
else if(message == WM_CTLCOLORSTATIC ) {
    // HERE YOUR CODE
}

编辑:更改按钮背景

首先,一个建议是:“不要那样做”。按钮是windows中非常重要和常见的组件,它们的外观和感觉在所有应用程序中都应该是一致的。用户可以从整体上对桌面进行定制,这包括“可访问性”问题和行为。想要用自己的“特殊方式”去做的应用程序只会带来问题。

第二,尝试下面的代码来更改“设置.”按钮背景到难看的绿色:在交换机(WParam)中的OBS::OBSProc中的WM_NOTIFY消息处理中添加一个大小写

代码语言:javascript
代码运行次数:0
运行
复制
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;             

另一种选择,具有更标准的边界:

代码语言:javascript
代码运行次数:0
运行
复制
         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
EN

Stack Overflow用户

发布于 2013-11-20 12:01:14

你需要把这段代码放到窗口程序中。窗口过程如下所示:

代码语言:javascript
代码运行次数: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。如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
SetWindowLongPtr(hwndRenderMessage, GWLP_WNDPROC, (LONG_PTR)RenderMessageWndProc);

如果您不知道窗口过程是什么或子类是什么,那么您确实需要退一步学习一些基础知识。例如,Petzold的经典书籍编程Windows仍然是一个极好的起点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20094483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档