我用了一个STATIC控件显示程序运行实时状态,却出现了新字符串与原来字符串叠加显示问题,我在SetWindowText之前调用Invalidate()重绘STATIC控件所在区域,为啥还是叠加,请大神指点:
部分重绘代码如下:
BOOL CUpgrade_TestDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值 //创建位图
CBitmap bitmap;
bitmap.LoadBitmap(IDB_PNG_MAIN);
//创建兼容DC
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);
//将位图选入DC中
dcCompatible.SelectObject(&bitmap); CRect rect;
GetWindowRect(&rect);
ScreenToClient(&rect);
pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &dcCompatible, 0, 0, SRCCOPY); return TRUE;
}HBRUSH CUpgrade_TestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: 在此更改 DC 的任何特性
switch(nCtlColor)
{
case CTLCOLOR_STATIC:
{
pDC->SetBkMode(TRANSPARENT); //设置背景为透明
pDC->SetTextColor(RGB(255,255,0)); //设置字体颜色
return (HBRUSH)GetStockObject(NULL_BRUSH);
}
} // TODO: 如果默认的不是所需画笔,则返回另一个画笔
return hbr;
}SetWindowText函数在程序运行中多次用到
部分重绘代码如下:
BOOL CUpgrade_TestDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值 //创建位图
CBitmap bitmap;
bitmap.LoadBitmap(IDB_PNG_MAIN);
//创建兼容DC
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);
//将位图选入DC中
dcCompatible.SelectObject(&bitmap); CRect rect;
GetWindowRect(&rect);
ScreenToClient(&rect);
pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &dcCompatible, 0, 0, SRCCOPY); return TRUE;
}HBRUSH CUpgrade_TestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: 在此更改 DC 的任何特性
switch(nCtlColor)
{
case CTLCOLOR_STATIC:
{
pDC->SetBkMode(TRANSPARENT); //设置背景为透明
pDC->SetTextColor(RGB(255,255,0)); //设置字体颜色
return (HBRUSH)GetStockObject(NULL_BRUSH);
}
} // TODO: 如果默认的不是所需画笔,则返回另一个画笔
return hbr;
}SetWindowText函数在程序运行中多次用到
解决方案 »
- 保存位图代码的一个疑问
- sdi 如何不让框架窗口中有 文档名字呢。
- mfc中怎么在分割窗口中显示不同的类容
- 如何延时,请高手
- 各位帮忙看看这段代码的意思
- 用CreateProcess执行一个dos程式序,若使用管道操作会出现无法输出信息在dos窗口的问题
- 调用一个类的方法是不是class->method(),是不是用->的,还是“.”,->是什么意思?
- 工具栏上加combox一问
- 高分求《VC++技术内幕》第四版随书CDROM里的程序!
- 我建议大家悠着一点,弄不好到时候csdn也被封了
- VC编译器可以链接Unix风格的,COFF和ELF格式的中间代码吗?
- Microsoft Rich Textbox Control 6.0 sp6 控件怎么自定义右键
从代替 WM_SETTEXT 消息发送到相应的窗口过程的另一个线程调用 SetWindowText() 时被称为仅 DefWindowProc(),以便编辑和静态控件执行不绘制该控件适当地因为永远不会执行相应的代码,时使文字与屏幕上的会永远不会更新。也就调用 SetWindowText() 内部,更新缓冲区,但更改不会反映在屏幕上。解决方法:
个明显的解决方法是尽可能避免从其他的线程的调用 SetWindowText()。 如果设计注意事项不允许执行此操作,请执行以下任一操作:
将 WM_SETTEXT 消息直接发送到窗口或控件。
在 SetWindowText() 后立即调用 InvalidateRect()。这适用于由于 DefWindowProc() 更新存储在文本缓冲区。
第一次设置状态显示时:
m_sProgressShow = _T("正在登陆FTP服务器……");
SetDlgItemText(IDC_PROGRESS_SHOW,m_sProgressShow);
第二次设置状态显示时:
m_sProgressShow.Empty();
CRect rect;
GetDlgItem(IDC_PROGRESS_SHOW)->GetWindowRect(rect);
ScreenToClient(rect);
InvalidateRect(&rect,TRUE);
m_sProgressShow = "test2……";
SetDlgItemText(IDC_PROGRESS_SHOW,m_sProgressShow);为啥还是叠加呢