SetWindowText ()问题?

jszhuweiwei 2009-09-09 07:48:42
GetDlgItem(IDC_STATICNOTE)->SetWindowText ("当前播报已结束,如需播报请重新点击开始播报按钮" );
下次需要显示另外的文字如
GetDlgItem(IDC_STATICNOTE)->SetWindowText ("通话已经完成" );
发现两次的文字重叠,该怎么处理?
...全文
266 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ImJaden 2010-11-25
  • 打赏
  • 举报
回复
我遇到的情况是:createwindow("static"),setwindowtext();并设置static透明,
所以字体重叠了?有人指点一下吗?
ImJaden 2010-11-24
  • 打赏
  • 举报
回复

void YourDlg::RefreshControl(UINT uCtlID)
{
CRect rc;
GetDlgItem(uCtlID)->GetWindowRect(&rc);
ScreenToClient(&rc);
InvalidateRect(rc);
}


GetDlgItem(IDC_STATIC)->SetWindowText("your string");
GetDlgItem(IDC_STATIC)->GetParent()->RedrawWindow();
  • 打赏
  • 举报
回复
关注中
icefairy 2009-09-10
  • 打赏
  • 举报
回复
重绘下 就行了吧
xxfyath 2009-09-10
  • 打赏
  • 举报
回复

HBRUSH CDdddDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: Change any attributes of the DC here

if(nCtlColor == CTLCOLOR_STATIC)
{
pDC->SetBkMode(TRANSPARENT); //设置背景透明,这样,输出字符的时候就
//是所谓的空心字,而不是有白的底色
pDC->SetTextColor(RGB(255,255,255)); //改变字体的颜色
// return HBRUSH(GetStockObject(HOLLOW_BRUSH));
}


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


注意: 去掉 // return HBRUSH(GetStockObject(HOLLOW_BRUSH));
huqinglu123 2009-09-09
  • 打赏
  • 举报
回复
invalidate()更新一下
正常情况下应该是不会发生这种事的,我就没遇见过
oldjliang 2009-09-09
  • 打赏
  • 举报
回复
我以前也遇到过这种情况
当时感觉很莫名,我什么处理也没有做,更没有截断其他消息
就是所有后来Set的文字全部重叠了

后来随便试了试
先HIDE一下然后再SHOW
结果就正常了

当然可能不适用楼主的这种情况
只是在这里提一下……
BenzKuai 2009-09-09
  • 打赏
  • 举报
回复
这个问题是由于对话框的DC画刷被设置成了“空画刷”的原因。

这导致你的那个静态文本框所在区域不能刷新背景区域,所以产生重叠。解决这个问题就要使这个区域能够

及时刷新。

请注意:GetDlgItem(IDC_STATICNOTE)->invalidate(); 这个只能刷新文本窗口,你看到文本变了就说明了这点。然而文本的背景是透明的。

真正要填充背景的只能是对话框中的区域了。如何刷?InvalidateRect()。

细节:

CRect rect;
m_stcNote.GetWindowRect(&rect);
ScreenToClient(&rect);
InvalidateRect(&rect);
m_stcNote.SetWindowText("UOUOUOIUOIUOIUOUOUOU");


我测试过了。
------------------------------------------------------------------------
就是这么回事!
dbwizard 2009-09-09
  • 打赏
  • 举报
回复
加invalidate()
xylicon 2009-09-09
  • 打赏
  • 举报
回复
这个比较麻烦,之前有个人的问题和你的差不多,而我是让他重画一下背景,再输出文字。我也不知道有没有更好的解决方法。
http://topic.csdn.net/u/20090822/13/6f673727-93e0-4370-bdf1-cb78065f45c5.html

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);
yilingling 2009-09-09
  • 打赏
  • 举报
回复
是会重叠的,加invalidate()应该就行了吧
jszhuweiwei 2009-09-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xylicon 的回复:]
一般来说不会重叠的吧。除非你在OnCtlColor中截断绘制消息。
[/Quote]我确实在OnCtlColor中截断绘制消息了

if(nCtlColor == CTLCOLOR_STATIC)
{
pDC->SetBkMode(TRANSPARENT); //设置背景透明,这样,输出字符的时候就
//是所谓的空心字,而不是有白的底色
// pDC->SetTextColor(RGB(255,255,255)); //改变字体的颜色
return HBRUSH(GetStockObject(HOLLOW_BRUSH));
}
如果还想改变文字该怎么办?
vv1133 2009-09-09
  • 打赏
  • 举报
回复
GetDlgItem(IDC_STATICNOTE)->SetWindowText ("当前播报已结束,如需播报请重新点击开始播报按钮" );
GetDlgItem(IDC_STATICNOTE)->invalidate();
GetDlgItem(IDC_STATICNOTE)->SetWindowText ("通话已经完成" );
xylicon 2009-09-09
  • 打赏
  • 举报
回复
一般来说不会重叠的吧。除非你在OnCtlColor中截断绘制消息。
MoXiaoRab 2009-09-09
  • 打赏
  • 举报
回复
GetDlgItem(IDC_STATICNOTE)->SetWindowText ("当前播报已结束,如需播报请重新点击开始播报按钮" ); 
GetDlgItem(IDC_STATICNOTE)->SetWindowText ("" );
GetDlgItem(IDC_STATICNOTE)->SetWindowText ("通话已经完成" );
jszhuweiwei 2009-09-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dirdirdir3 的回复:]
重叠?什么意思.......在后面加空格?
[/Quote]
就是两次的文字都显示了,位置都是从static控件的开始位置开始显示的,效果就是你在文字上面再写文字的那种重叠效果
eagerle01 2009-09-09
  • 打赏
  • 举报
回复
先GetDlgItem(IDC_STATICNOTE)->invalidate()再设置文本试试
dirdirdir3 2009-09-09
  • 打赏
  • 举报
回复
重叠?什么意思.......在后面加空格?
采用MFC编程时,子对话框常常要向主窗口传递数据,获取主窗口的对象指针便显得非常重要了。 void CMyView::OnModel() //点击菜单,创建对话框的几种变量设置,总共是4种方法,模态的一种,非模态的三种 { // TODO: Add your command handler code here //CDialog modDlg(MAKEINTRESOURCE(IDD_MODEL),this); //modDlg.DoModal(); static bool num=0;//第一次执行第一段,以后再打开都执行第二段。 static CModDlg Dlgless(this);//将MyView指针传进去 if (0==num) { CModDlg mod(this);//将MyView指针传进去 //mod.SetWindowText("局部变量——模态对话框");不允许动态设置模态对话框标题?这句编绎会出错 mod.DoModal(); Dlgless.Create(IDD_MODEL);//重复执行会出错,要放到构造函数中好 Dlgless.ShowWindow(SW_SHOW); Dlgless.SetWindowText("局部静态变量——非模对话框"); m_dlgless.Create(IDD_MODEL,this);//重复执行会出错,要放到构造函数中好 m_dlgless.ShowWindow(SW_SHOW); m_dlgless.SetWindowText("成员非指针变量——非模对话框"); m_pDlgless=new CModDlg(this);//重复执行会出错,要放到构造函数中好, m_pDlgless->Create(IDD_MODEL);//重复执行会出错,要放到构造函数中好, m_pDlgless->ShowWindow(SW_SHOW); m_pDlgless->SetWindowText("成员指针变量——非模对话框"); num=1; } else { Dlgless.ShowWindow(SW_SHOW); m_dlgless.ShowWindow(SW_SHOW); m_pDlgless->ShowWindow(SW_SHOW); } }

15,979

社区成员

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

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