有关控件背景透明问题???

zhanghk 2005-01-22 06:50:04
对话框背景是用BitBlt在OnPaint时画上去的,里面的控件背景是灰的,我想让背景是透明的,所以在OnCtrlColor里这样写:
HBRUSH CTabPageParam::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: Change any attributes of the DC here
pDC->SetBkMode(TRANSPARENT);

// TODO: Return a different brush if the default is not desired
return hbr;
}

加了一句:pDC->SetBkMode(TRANSPARENT);

实际上只有STATIC背景变透明了(还要在设计时选上sample属性,不知为何,高人指点。)

对话框里的还有以下几种控件:
Slider,radio都没变,应该怎么做啊。
...全文
1376 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
red-fly 2005-02-04
  • 打赏
  • 举报
回复
哎,我没有更好的方法了,只好继承并重载OnPaint了
chuanke 2005-02-03
  • 打赏
  • 举报
回复
对 搂住都已经注意到了 “因为对话框的背景不是纯色”
chuanke 2005-02-03
  • 打赏
  • 举报
回复
如果控件不被重绘的话,不能解决根本性的问题,采用OnCtlColor的话只有近似的选取颜色来掩盖背景
eachout 2005-02-03
  • 打赏
  • 举报
回复
补充一下,空刷子和空EreaseBKnd的方法还有一个办法可以解决刷新的问题,就是在所有有可能导致背
景刷新的消息处理中手动刷新控件,比如Invalidate()。
eachout 2005-02-03
  • 打赏
  • 举报
回复
空刷子和EreaseBknd两个方法都有一个共同的问题,就是不刷新背景。
因此resize等等操作,原来前景画有东西的都不会被擦掉。
还有一个典型的例子,就是edit控件的编辑会一团浆糊,根本看不清。
总结一下,就是这两种方法的缺点是控件一定不能动。因为他的背景不是动态更新的。
如果想要动态刷新背景,我现在找到的最好办法就是取得子窗口下面的背景的DC,然后自己刷到自己的
DC上来。
简而言之,就是用动态读取父窗口的背景,用来作子窗口背景,看起来就是透明的了。
zhanghk 2005-02-03
  • 打赏
  • 举报
回复
我好像试过把子窗口背景也画成跟他的父窗口一样,好像也不行,我再研究一下这个问题,最好有好的解决方案和大家交流。
zhanghk 2005-02-02
  • 打赏
  • 举报
回复
现在又有个问题,改了一下,是一个OwnerDraw的TabCtrl,在EraseBknd时画的背景,在上面创建了几个对话框(用来在TabChange时切换不同的窗口),这个TabCtrl的View是一个SpliterWnd(切分窗口的一个窗口),这了这个View的OnSize,用来改变TabCtrl的大小和居中TabCtrl中的对话框窗口,有个问题出现了,因为TabCtrl的居中是要减去TabCtrl中的那几个Tab的高度和的(我的TabCtrl是多行的),所以我算了一下这个高度和,结果在OnSize的时候有时会在窗口中出现一条竖痕,不计算这个高度时(就是调用了TabCtrl的GetItemRect和GetRowCount),就没有这个问题,太奇怪了,有没有人知道怎么回事?请高人出手相助啊!!!
zhanghk 2005-01-24
  • 打赏
  • 举报
回复
因为它的父窗口是个TabCtrl,这个TabCtrl里我也写了OnPaint和EraseBknd等,可能是这个原因吧
fanqing 2005-01-24
  • 打赏
  • 举报
回复
你是怎么刷新的.
zhanghk 2005-01-24
  • 打赏
  • 举报
回复
To vcleaner(我没做大哥已经很久了.......) :谢谢,我不想通过重载来做,实在没辙在这么做。
zhanghk 2005-01-24
  • 打赏
  • 举报
回复
// TODO: Change any attributes of the DC here
if (nCtlColor == CTLCOLOR_STATIC)
{
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)::GetStockObject(NULL_BRUSH);
}

我试着又加了这句:return (HBRUSH)::GetStockObject(NULL_BRUSH);
这回Static和Radio的背景是透明的,可Slider的背景变黑了。
zhanghk 2005-01-24
  • 打赏
  • 举报
回复
To jszj(老板说mis部不是赚钱的部门...) : 我的透明一项是都选了的,查过帖子,不行的。
To fanqing(火影忍者+20%) :试过用WM_ERASEBKND直接返回TRUE,但实际上我的这个对话框是一个child对话框,又是创建在一个OwnerDrow的TabCtrl上的,可能跟这个有关系,所以用WM_ERASEBKND直接返回TRUE时,里面的背景是透明的了,可Edit又会有时有,有时没有(闪一下就没了)我没试过单独的对话框,我想单独的对话框很可能没这个问题,这个问题可能跟我刷新它的父窗口有关系。
ewing1203 2005-01-24
  • 打赏
  • 举报
回复
jszj(老板说mis部不是赚钱的部门...) 说的方法是很基本的,但不是什么时候都好用的,程序嘛,毕竟不是人,还是要程序设置一下的好>
fanqing 2005-01-24
  • 打赏
  • 举报
回复
要控件背景透明最简单是子类化,其背景刷新消息WM_ERASEBKND对应函数直接返回true就可以了.

使用这个方法控件透明部分会以对话框的背景颜色为控件背景色
red-fly 2005-01-24
  • 打赏
  • 举报
回复
我想vcleaner(我没做大哥已经很久了.......)说的不是楼主想要的
楼主是想在对话框里一次性(这样是为了简单)把它们都弄成透明的


其实,可以在每个控件的属性里,选中透明一项即可,这是最简单的,不用一个代码
xuzheng318 2005-01-24
  • 打赏
  • 举报
回复
帮楼主顶,学习!
老夏Max 2005-01-24
  • 打赏
  • 举报
回复
/*===========================================================================
==== ====
==== File name : StaticTrans.cpp ====
==== Creation date : 7/10/2001 ====
==== Author(s) : Dany Cantin ====
==== ====
===========================================================================*/

#include "stdafx.h"
#include "StaticTrans.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CStaticTrans

CStaticTrans::CStaticTrans()
{
m_TextColor = RGB(0, 0, 0);
m_BackColor = TRANS_BACK;
}

CStaticTrans::~CStaticTrans()
{
}


BEGIN_MESSAGE_MAP(CStaticTrans, CStatic)
//{{AFX_MSG_MAP(CStaticTrans)
ON_WM_CTLCOLOR_REFLECT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CStaticTrans message handlers

HBRUSH CStaticTrans::CtlColor(CDC* pDC, UINT nCtlColor)
{
m_Brush.DeleteObject();

if (m_BackColor == TRANS_BACK) {
m_Brush.CreateStockObject(HOLLOW_BRUSH);
pDC->SetBkMode(TRANSPARENT);
}
else {
m_Brush.CreateSolidBrush(m_BackColor);
pDC->SetBkColor(m_BackColor);
}

pDC->SetTextColor(m_TextColor);

return (HBRUSH)m_Brush;
}

void CStaticTrans::UpdateCtrl()
{
CWnd* pParent = GetParent();
CRect rect;

GetWindowRect(rect);
pParent->ScreenToClient(rect);
rect.DeflateRect(2, 2);

pParent->InvalidateRect(rect, FALSE);
}



老夏Max 2005-01-24
  • 打赏
  • 举报
回复
参考例子:
/*===========================================================================
==== ====
==== File name : StaticTrans.h ====
==== Creation date : 7/10/2001 ====
==== Author(s) : Dany Cantin ====
==== ====
===========================================================================*/

#ifndef STATICTRANS_H
#define STATICTRANS_H

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


/////////////////////////////////////////////////////////////////////////////
// CStaticTrans window

#define TRANS_BACK -1

class CStaticTrans : public CStatic
{
// Construction
public:
CStaticTrans();

private:
COLORREF m_TextColor;
COLORREF m_BackColor;
CBrush m_Brush;

// Operations
public:
void SetTextColor(COLORREF col) { m_TextColor = col;
UpdateCtrl(); }
void SetBackColor(COLORREF col) { m_BackColor = col;
UpdateCtrl(); }

private:
void UpdateCtrl();

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CStaticTrans)
//}}AFX_VIRTUAL

// Implementation
public:
virtual ~CStaticTrans();

// Generated message map functions
protected:
//{{AFX_MSG(CStaticTrans)
afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
//}}AFX_MSG

DECLARE_MESSAGE_MAP()
};


#endif // STATICTRANS_H
red-fly 2005-01-24
  • 打赏
  • 举报
回复
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: Change any attributes of the DC here
pDC->SetBkMode(TRANSPARENT);

这两句换一下位置 如何?
zhanghk 2005-01-24
  • 打赏
  • 举报
回复
先谢谢各位,实际上用我题目中说的方法,STATIC已经是透明的了,就是其它几个控件不是,因为对话框的背景不是纯色,所以不能把控件的背景设成某个颜色,只好是透明的。
加载更多回复(6)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧