设置窗口背景色

本文详细介绍了在MFC中如何通过处理WM_ERASEBKGND消息来改变CView、CFrameWnd或CWnd对象的背景颜色,并解释了OnEraseBkgnd与OnCtlColor的区别及其与OnPaint的关系。

若要改变CView,CFrameWnd或CWnd对象的背景颜色需要处理WM_ERASEBKGND消息

WM_ERASEBKGND


Return Values
An application should return nonzero if it erases the background; otherwise, it should return zero.

true表示已处理背景刷新

false表示需要在OnPaint里处理

示例:

[cpp]  view plain copy
  1. BOOL CImgView::OnEraseBkgnd(CDC* pDC)  
  2. {  
  3.     // TODO: Add your message handler code here and/or call default  
  4.   
  5.   
  6.   
  7.   
  8.     CRect rc;  
  9.     pDC->GetClipBox(&rc);  //获得包含当前可见区域的最小矩形  
  10.   
  11.     CBrush *pOldBrush=pDC->SelectObject(&m_backBrush); //背景画刷  
  12.     //pDC->Rectangle(rc);  //不能使用这个函数,有窗口遮盖时,会有实线留下  
  13.     pDC->PatBlt(rc.left,rc.top,rc.Width(),rc.Height(),PATCOPY); //使用当前刷子绘制给定矩形  
  14.     pDC->SelectObject(pOldBrush);  
  15.     return TRUE;  //表示已处理背景刷新  
  16.   
  17. }  


Q:OnEraseBkgnd和CtlColor有什么区别?

A:   OnEraseBkgnd是在窗口大小发生改变等情况下发生的,它将绘制窗口背景;

      而OnCtlColor是当窗口的控件需要绘制时发生的,它将绘制窗口的控件。
 

Q:OnEraseBkgnd、OnPaint、OnCtlColor关系


A:
OnEraseBkgnd :在窗口背景需要重绘时调用.
OnPaint : 此时OnEraseBkgnd已经调用过了,所以在此响应函数体内对背景进行的操作将覆盖OnEraseBkgnd中所做的操作.
OnCtlColor : 有于在窗口将要被(第一次)绘制时响应,子窗口可以通过发关WM_CTLCOLOR请求父窗口传来一个HBRUSH.



转自:http://blog.youkuaiyun.com/shuilan0066/article/details/8735104


<think>好的,用户想知道如何在QWidget中设置窗口背景颜色。我之前有回答过类似的问题,现在需要参考提供的引用内容,综合给出解决方案。首先,我需要回忆Qt中设置背景颜色的几种方法。根据引用内容,主要有三种方式:使用QPalette、样式表以及处理透明背景和边框的情况。 用户的问题是设置窗口背景颜色,所以需要明确回答不同的方法,并指出它们的优缺点。根据引用2,样式表是比较简单和灵活的方法,直接设置窗口的样式表为"background-color: red;"就可以生效。但引用1提到,对于顶级QWidget,使用QPalette可能无效,这时候可能需要用样式表或者确保调用了setAutoFillBackground。此外,引用4提到子控件可能继承父控件的样式,需要注意样式的作用范围。 接下来要整理步骤,确保每个方法都正确。例如,使用QPalette时,必须启用setAutoFillBackground(true),否则可能无效。而样式表的方法更直接,但可能会影响子控件,需要特别处理。另外,透明背景的情况可能需要设置Qt::WA_TranslucentBackground属性,但可能涉及窗口标志的调整。 需要检查每种方法的代码示例是否正确。比如,引用2中的样式表示例是正确的,引用1中的QPalette方法在顶级窗口可能有问题,但如果是子窗口可能有效。引用3提到设置透明度的方法,但用户的问题可能不需要透明,不过可以作为补充信息。 还要注意用户可能遇到的常见问题,比如背景颜色不生效的原因,如没有调用setAutoFillBackground,或者样式被继承,或者需要重写paintEvent。引用4中提到的这些问题都需要在回答中提及,帮助用户避免踩坑。 最后,确保回答结构清晰,分点说明每种方法,并提供代码示例,同时附上注意事项和常见问题。这样用户可以根据自己的情况选择合适的方法,并解决可能遇到的问题。</think>在 Qt 中为$QWidget$设置窗口背景颜色有以下三种常用方法,具体选择取决于需求场景: ### 一、使用样式表(推荐) ```cpp QWidget window; window.setStyleSheet("background-color: red;"); // 设置背景为红色 window.setAutoFillBackground(true); // 确保填充生效 ``` **优势**:代码简洁,支持CSS语法扩展样式[^2] **注意**:子控件会继承父控件样式,可通过指定子控件类型规避: ```cpp window.setStyleSheet("QWidget { background: red; } QPushButton { background: white; }"); ``` ### 二、通过调色板(QPalette) ```cpp QPalette pal = widget->palette(); pal.setColor(QPalette::Window, Qt::red); // 设置窗口背景色 widget->setAutoFillBackground(true); // 必须启用自动填充 widget->setPalette(pal); ``` **适用场景**:需要动态修改颜色时 **注意**:顶级窗口可能需要配合`setAttribute(Qt::WA_StyledBackground)`才能生效[^1] ### 三、透明背景+边框颜色 ```cpp widget->setAttribute(Qt::WA_TranslucentBackground); // 设置透明 widget->setStyleSheet("background-color: rgba(255,0,0,150); border: 2px solid blue;"); ``` **效果**:实现半透明红色背景+蓝色边框[^3] ### 常见问题解决 1. **颜色未生效**:检查是否遗漏`setAutoFillBackground(true)`或未调用`update()`重绘 2. **子控件染色**:在样式表中为子控件单独设置样式[^4] 3. **窗口穿透问题**:透明背景需配合`Qt::FramelessWindowHint`属性使用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值