导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

MFC 静态文本框透明 但是动态改变文本后被覆盖

mingjiaoo415 2009-08-16 03:45:49
如题 各位帮忙 急用
...全文
1801 点赞 收藏 22
写回复
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
mingjiaoo415 2009-08-18
[Quote=引用 17 楼 tearywang 的回复:]
在这个文本框的父窗口中你实现了 ON_WM_ERASEBKGND 消息映射吧?那就在OnCtlColor中
pDC->SetBkMode(TRANSPARENT);  之前,调用一下这个OnEraseBkgnd(this->GetDC());应该就可以啦。

[/Quote]
楼上的具体一点 我没有实现ON_WM_ERASEBKGND 消息映射啊 具体一点
回复
gauldoth 2009-08-18
咋说呢,必须先把CStatic的背景手动刷一遍吧,不然的话写上文字,原来写的文字没有被擦掉..因为你把CStatic的背景去掉了..
回复
TearyWang 2009-08-18
十分抱歉,#19中的 class CWaitDlg 写错了,应该是 class CWaitDlg :public CDialog
回复
TearyWang 2009-08-18
我并不太清楚你希望的效果,但是这是我的意思:

静态文本框窗口,一定是有父窗口的,当然,这里所说有父窗口并不是桌面。那么文档框透明,就表示在文本框的区域需要显示的,除了本身的文字外,其余的就是父窗口的背景。但是当你在操作文本框的时候,因为设置了透明,所以文本框的背景不会被刷新。

父窗口中映射 ON_WM_ERASEBKGND 消息,主要是指定父窗口的背景刷新。在执行父窗口背景刷新的时候,子窗口亦被刷新。这样就把改变前的内容刷掉了。

在父窗口映射 ON_WM_ERASEBKGND 消息,你可以通过它,改变父窗口的背景,如加载一幅图片。这儿有一个有关界面美化的页面,或者对你有帮助http://vcer.net/1046595482643.html。

以下给你几行代码供参考:
.h中的部分代码:

class CWaitDlg {
protected:
CBitmap m_Back;
CStatic* pStInfo;
public:
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
};

.cpp文件中的部分代码:

BOOL CWaitDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// TODO: 在此添加额外的初始化
// IDC_STC_INFO 原来是一个IDC_STATIC控件,只是改了一下ID,因为其中的文字需要
// 动态显示,动态更新。
pStInfo = (CStatic*)this->GetDlgItem(IDC_STC_INFO);

m_Back.LoadBitmapW(IDB_BMP_WAIT_BK);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
HBRUSH CWaitDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
//HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: 在此更改 DC 的任何属性
OnEraseBkgnd(this->GetDC());
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)::GetStockObject(HOLLOW_BRUSH);

// TODO: 如果默认的不是所需画笔,则返回另一个画笔
//return hbr;
}

BOOL CWaitDlg::OnEraseBkgnd(CDC* pDC)
{
//return CDialog::OnEraseBkgnd(pDC);
CDC dc;
dc.CreateCompatibleDC(pDC);
dc.SelectObject(&m_Back);

//获取BITMAP对象
BITMAP hb;
m_Back.GetBitmap(&hb);

//获取窗口大小
CRect rt;
GetClientRect(&rt);
//显示位图
pDC->StretchBlt(0, 0, rt.Width(), rt.Height(),
&dc, 0, 0, hb.bmWidth, hb.bmHeight, SRCCOPY);

return TRUE;
}

消息映射如下:

//BEGIN_MESSAGE_MAP(CWaitDlg, CDialog)
ON_WM_CTLCOLOR()
ON_WM_ERASEBKGND()
//END_MESSAGE_MAP()
回复
HuWenjin 2009-08-18
直接用OnPain在要用到Static的地方输出一个outtext这样更简单

用Static,要更新的话,就需要重绘背景,这要确定你的背景是在哪里绘的。有些作法是重载Static保存对应位置的位图,先刷新该位图再显示

有些是直接设置透明模式,设置值后要取该static的位置,在父窗口中InvalidateRect(TREU)重绘一次
回复
mingjiaoo415 2009-08-17
[Quote=引用 15 楼 wbrcqu 的回复:]
引用 14 楼 mingjiaoo415 的回复:
引用 13 楼 heksn 的回复:
你是这样设置透明的吗
OnCtlColor中 
if  (nCtlColor  ==  CTLCOLOR_STATIC)
  pDC->SetBkMode(TRANSPARENT); 
   
 


恩 是这样 不过改变文本时 旧的没有消除 新的文本覆盖了旧的文本上边 是乱码啊


在你覆盖新的文本前 先得到旧的句柄 然后 updatedata(true) 再赋值 试试看~
[/Quote] 这个方法我也试了 还是不行 不过我把程序改了改 是下一次赋值前重绘窗口 RedrawWindow(); 可是有闪屏 谁有个好的方法啊
回复
wbrcqu 2009-08-17
[Quote=引用 14 楼 mingjiaoo415 的回复:]
引用 13 楼 heksn 的回复:
你是这样设置透明的吗
OnCtlColor中 
if  (nCtlColor  ==  CTLCOLOR_STATIC)
  pDC->SetBkMode(TRANSPARENT); 
   
 


恩 是这样 不过改变文本时 旧的没有消除 新的文本覆盖了旧的文本上边 是乱码啊
[/Quote]

在你覆盖新的文本前 先得到旧的句柄 然后 updatedata(true) 再赋值 试试看~
回复
TearyWang 2009-08-17
在这个文本框的父窗口中你实现了 ON_WM_ERASEBKGND 消息映射吧?那就在OnCtlColor中
pDC->SetBkMode(TRANSPARENT); 之前,调用一下这个OnEraseBkgnd(this->GetDC());应该就可以啦。
回复
mingjiaoo415 2009-08-16
[Quote=引用 13 楼 heksn 的回复:]
你是这样设置透明的吗
OnCtlColor中 
if  (nCtlColor  ==  CTLCOLOR_STATIC)
  pDC->SetBkMode(TRANSPARENT); 
   
 

[/Quote]
恩 是这样 不过改变文本时 旧的没有消除 新的文本覆盖了旧的文本上边 是乱码啊
回复
你是这样设置透明的吗
OnCtlColor中
if (nCtlColor == CTLCOLOR_STATIC)
pDC->SetBkMode(TRANSPARENT);


回复
mingjiaoo415 2009-08-16
[Quote=引用 6 楼 x22ray 的回复:]
引用 4 楼 mingjiaoo415 的回复:
就是在对话框建立一个静态文本控件  整个对话框有背景 为了让静态文本透明 显示文本框的背景 但是试了很多法都不行 透明后 改变静态文本的内容后  新的文本覆盖了旧的文本

你到底是想显示哪个的背景色或图呢。。
[/Quote]
显示对话框的背景啊
回复
klkvc386 2009-08-16
up
回复
I_NBFA 2009-08-16
???是XX看不到图.
回复
mingjiaoo415 2009-08-16
回复
mingjiaoo415 2009-08-16
[img=
回复
mingjiaoo415 2009-08-16

回复
x22ray 2009-08-16
[Quote=引用 4 楼 mingjiaoo415 的回复:]
就是在对话框建立一个静态文本控件  整个对话框有背景 为了让静态文本透明 显示文本框的背景 但是试了很多法都不行 透明后 改变静态文本的内容后  新的文本覆盖了旧的文本
[/Quote]
你到底是想显示哪个的背景色或图呢。。
回复
I_NBFA 2009-08-16
=.=还是没看懂......要能截个图就帅了.....
回复
mingjiaoo415 2009-08-16
就是在对话框建立一个静态文本控件 整个对话框有背景 为了让静态文本透明 显示文本框的背景 但是试了很多法都不行 透明后 改变静态文本的内容后 新的文本覆盖了旧的文本
回复
lexdene 2009-08-16
没明白问题是什么意思。
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……