扩展了一个Static类,来控制颜色什么的,一个Dialog里面放几个CRxStatic,在Ontimer里刷新内容,刷新方法  m_CtrlGroupCaPa.ShowWindow(SW_HIDE);
  m_nGroupCameras = m_arrayGroupCamera.size();
  m_nGroupPanes = m_arrayGroupPane.size();
  strInfo.Format("等待中暗警:%2d||可用窗格:%2d",m_nGroupCameras,m_nGroupPanes);
  m_CtrlGroupCaPa.SetWindowText(strInfo);
  m_CtrlGroupCaPa.ShowWindow(SW_SHOW);
  m_CtrlGroupCaPa.UpdateWindow();这个程序在Debug下运行,没有问题,在Release下,看不到Static,是什么原因呢,有知道的吗CRxStatic::CRxStatic()
{
 m_lpFont="宋体";
 m_nSize=9;
 m_FontColor=RGB(0,0,0);
 m_BkColor=CLARITY;
 m_bItalic=false;
 m_bBold=false;
 m_bUnderline=false;
 m_dwCharacter=CHINESE;
 m_bIsShadow=false;
 m_ShadowColor=RGB(32,32,32);
 m_nInterval=3;
 m_nAngle=45;}CRxStatic::~CRxStatic()
{
}
BEGIN_MESSAGE_MAP(CRxStatic, CStatic)
//{{AFX_MSG_MAP(CRxStatic)
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CRxStatic message handlersvoid CRxStatic::OnPaint() 
{
CPaintDC dc(this); // device context for painting

CFont font;
int nBold;
if(m_bBold==true)
nBold=FW_BOLD;
else
nBold=FW_NORMAL;
LOGFONT lgFont;
lgFont.lfCharSet=(BYTE)m_dwCharacter;
lgFont.lfClipPrecision=0;
lgFont.lfEscapement=0;
strcpy_s(lgFont.lfFaceName,m_lpFont);
lgFont.lfHeight=m_nSize+3;
lgFont.lfItalic=m_bItalic;
lgFont.lfOrientation=0;
lgFont.lfOutPrecision=0;
lgFont.lfPitchAndFamily=2;
lgFont.lfQuality=0;
lgFont.lfStrikeOut=0;
lgFont.lfUnderline=m_bUnderline;
lgFont.lfWeight=nBold;
lgFont.lfWidth=0;
font.CreateFontIndirect(&lgFont);
CFont* pFont;
pFont=dc.SelectObject(&font);
CString sCaption;
CRect rcWnd;
this->GetClientRect(&rcWnd);
this->GetWindowText(sCaption);
DWORD dwStyle,dwDCStyle;
dwStyle=this->GetStyle();
if ((dwStyle&SS_CENTER)==SS_CENTER )//居中显示
dwDCStyle=DT_CENTER;
if ((dwStyle&SS_SIMPLE) ==SS_SIMPLE)   //单行
dwDCStyle=dwDCStyle|DT_SINGLELINE|DT_VCENTER;
if(m_bIsShadow==true)  //阴影
{
//根据角度计算出阴影位置
float fx=cos((float)m_nAngle)*m_nInterval;
float fy=sin((float)m_nAngle)*m_nInterval;
CRect rcShadow;
rcShadow=rcWnd;
rcShadow.left=(LONG)((float)rcShadow.left+fx);
rcShadow.right=(LONG)((float)rcShadow.right+fx);
rcShadow.top=(LONG)((float)rcShadow.top+fy);
rcShadow.bottom=(LONG)((float)rcShadow.bottom +fy);
dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(m_ShadowColor);
dc.DrawText(sCaption,rcShadow,dwDCStyle);
}
dc.SetBkMode(OPAQUE);
if(m_BkColor==CLARITY)
dc.SetBkMode(TRANSPARENT);
else
dc.SetBkColor(m_BkColor);
dc.SetTextColor(m_FontColor);
dc.DrawText(sCaption,rcWnd,dwDCStyle);
font.DeleteObject();
dc.SelectObject(pFont);
// Do not call CStatic::OnPaint() for painting messages
}void CRxStatic::SetFont(CString sFontName,DWORD lpLanguage)
{
m_lpFont=sFontName;
m_dwCharacter=lpLanguage;
}void CRxStatic::SetFontSize(int nSize)
{
m_nSize=nSize;
}void CRxStatic::SetTextColor(COLORREF dwColor)
{
m_FontColor=dwColor;
}void CRxStatic::SetBkColor(COLORREF dwColor)
{
m_BkColor=dwColor;
}void CRxStatic::SetFontStyle(bool bItalic,bool bBold,bool bUnderline)
{
m_bItalic=bItalic;
m_bBold=bBold;
m_bUnderline=bUnderline;
}void CRxStatic::SetShadow(bool bShadow,COLORREF cShadowColor,int nInterval,int nAngle)
{
m_bIsShadow=bShadow;
m_ShadowColor=cShadowColor;
m_nInterval=nInterval;
m_nAngle=nAngle;
}void CRxStatic::Redraw()
{
  Invalidate();
}

解决方案 »

  1.   

    执行到了 ,timer中其他的处理正常,就文字刷新不可以,但在测试人员电脑里 是正常的  难道是环境哪里的原因
      

  2.   

    定时周期是多少?另外OnTimer中只需要SetWindowText,不要ShowWindow。
      

  3.   

    UpdateWindow(); 是消息驱动的并且只有在有更新区域的才能被发送(比如遮盖..),是被动的
    如果想主动的刷新可以调用 Invalidate如果比较频繁,应该调使用目标DC 直接画
      

  4.   

    我重载DrawItem  就可以显示了  看来 Opaint里面  还是不够稳定