静态文本背景透明,设置新的文本以后原来的字擦不掉

rienzi 2009-08-22 01:40:05
我现在用CStatic派生一个类,
在这个类中要令静态文本背景变为透明,
方法是重载=WM_CTLCOLOR消息的响应函数,
具体代码如下:


HBRUSH CLinkHandStatic::CtlColor(CDC* pDC, UINT nCtlColor)
{
// TODO: 在此更改 DC 的任何属性
if(CTLCOLOR_STATIC==nCtlColor)
{
if(m_bMouseOver)
{
pDC->SetTextColor(RGB(0,0,255)); //字体颜色设置为蓝色
if(m_fontUnderline.GetSafeHandle()==NULL)
{
LOGFONT lf;
m_font.GetLogFont(&lf);
lf.lfUnderline=TRUE; //加下划线
m_fontUnderline.CreateFontIndirect(&lf);
}
pDC->SelectObject(&m_fontUnderline);
}
else
{
pDC->SetTextColor(GetSysColor(COLOR_BTNTEXT)); //采用系统字体
pDC->SelectObject(&m_font);
}
}

// TODO: 如果不应调用父级的处理程序,则返回非空画笔
return (HBRUSH)::GetStockObject(NULL_BRUSH); //返回此画刷可以使静态文本透明
}




这个函数的作用是鼠标悬浮与文本上时令文本颜色变蓝并使其带有下划线,
鼠标没有悬浮其上时让静态文本字体恢复为原来状态,
现在我在程序中每次用SetWindowText 改变静态文本框中输出的文本,
基本上可以得到想要的效果, 不过有个大问题,


每次我用SetWindowText设置了一个比原来的文本短的文本以后,
原来的文本不能被擦去, 也就是说原来的文本比现在的文本长的部分会突出出来,
请问如何才能解决这个问题,多谢
...全文
486 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wu_qing_yun 2009-08-22
  • 打赏
  • 举报
回复
应该可以吧,楼上几位的方法
  • 打赏
  • 举报
回复
http://www.vckbase.com/document/viewdoc/?id=1412
rienzi 2009-08-22
  • 打赏
  • 举报
回复
楼上代码混乱了

设置一个整个对话框的成员变量, CDC memdc;
在对话框的OnInitDialog函数中
CClientDC dc(this);
memdc.CreateCompatibleDC(&dc);
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BKGROUNDBMP1);
memdc.SelectObject(&bitmap);


在重载的静态文本控件中也设置一个成员变量CDC memdc;
然后将对话框的memdc值传给重载的静态文本控件中的memdc以后,
在重载的静态文本控件代码中需要画图片的地方
CRect rc;
GetClientRect(&rc);
CDC *pDC;
pDC=GetDC();
pDC->BitBlt(0,0,rc.Width(),rc.Height(),&memdc,rc.left,rc.right,SRCCOPY);
rienzi 2009-08-22
  • 打赏
  • 举报
回复
怎么画?
设置一个整个对话框的成员变量, CDC memdc;
在对话框的OnInitDialog函数中

CClientDC dc(this);
CDC *pDC;
pDC=GetDlgItem(IDC_STATIC1)->GetDC();
memdc.CreateCompatibleDC(&dc);
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BKGROUNDBMP1);
memdc.SelectObject(&bitmap);


在重载的静态文本控件中也设置一个成员变量CDC memdc;
然后将对话框的memdc值传给重载的静态文本控件中的memdc以后
CRect rc;
GetDlgItem(IDC_STATIC1)->GetClientRect(&rc);
pDC->BitBlt(0,0,rc.Width(),rc.Height(),&memdc,rc.left,rc.right,SRCCOPY);
这样就算画上了?
fishion 2009-08-22
  • 打赏
  • 举报
回复
GetDlgItem(IDC_STATIC1)->ShowWindow(Sw_HIDE)再用SW_SHOW,效率不高但容易实现
fishion 2009-08-22
  • 打赏
  • 举报
回复
用ShowWindow的HIDES与HOW
xylicon 2009-08-22
  • 打赏
  • 举报
回复
图片也可以画,只是太麻烦了。

WM_CTLCOLOR 的这个问题还真麻烦。看看别人有没有更好的方法吧。
rienzi 2009-08-22
  • 打赏
  • 举报
回复
看来我可以考虑让我的背景为单色了,
有背景图片这种太难搞了……
rienzi 2009-08-22
  • 打赏
  • 举报
回复
楼上的路飞大人,
没法刷背景色啊,
我的背景是有图片的,
刷了就会出现一个单色的长方形,
我想让静态文本背景透明………………
xylicon 2009-08-22
  • 打赏
  • 举报
回复
TCHAR szText[MAX_PATH + 1] = {0};
GetDlgItemText( nCtlColor, szText, MAX_PATH );
CRect rc;
GetDlgItem(nCtlColor)->GetClientRect(rc);

pDC->FillRect(&rc, COLOR_BTNFACE); // 把COLOR_BTNFACE 改成你的背景色
pDC->DrawText(szText, -1, rc, DT_LEFT|DT_SINGLELINE|DT_END_ELLIPSIS);


直接在控件上刷一下背景,然后输入文字吧。
rienzi 2009-08-22
  • 打赏
  • 举报
回复
多谢两位,这两种方法我都试了,但是还是不行,问题依然如初,
怎么擦除以前的文本,或者我的代码本身有问题,还望指点,谢谢诸位
雪影 2009-08-22
  • 打赏
  • 举报
回复
在设置文本之前,现将控件的文本设置成空,然后刷新控件,最后设置正确的控件文本。
这样的效率不高,但是能满足要求
forimprove 2009-08-22
  • 打赏
  • 举报
回复
试试在SetWindowText后,RedrawWindow使控件重绘一下

15,979

社区成员

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

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