我用了一个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函数在程序运行中多次用到

解决方案 »

  1.   

     我需要设置透明呀,不然STATIC控件会将底图遮挡一部分的
      

  2.   

    在SetDlgItemText()设置控件文本之前,先强制刷新一下该区域即可InvalidateRect();
      

  3.   

    SetWindowText()函数在多线程之间调用的时候会出现调用 SetWindowText() 线程而不创建窗口中设置窗口的文本将无法显示新文本。具体原因:
    从代替 WM_SETTEXT 消息发送到相应的窗口过程的另一个线程调用 SetWindowText() 时被称为仅 DefWindowProc(),以便编辑和静态控件执行不绘制该控件适当地因为永远不会执行相应的代码,时使文字与屏幕上的会永远不会更新。也就调用 SetWindowText() 内部,更新缓冲区,但更改不会反映在屏幕上。解决方法:
    个明显的解决方法是尽可能避免从其他的线程的调用 SetWindowText()。 如果设计注意事项不允许执行此操作,请执行以下任一操作:
    将 WM_SETTEXT 消息直接发送到窗口或控件。
    在 SetWindowText() 后立即调用 InvalidateRect()。这适用于由于 DefWindowProc() 更新存储在文本缓冲区。
      

  4.   

    (m_sProgressShow是静态文本控件IDC_PROGRESS_SHOW的CString变量)
    第一次设置状态显示时:
            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);为啥还是叠加呢
      

  5.   

    SetWindowText()都是在MFC程序的消息函数中完成的