void CYcordWin::OnPaint() 
{
CPaintDC dc(this); // device context for painting
DrawCord(&dc);
}
//画Y坐标
void CYcordWin::DrawCord(CDC *pDC)
{
LOGFONT lf;
memset(&lf,0,sizeof(LOGFONT)); 
lf.lfHeight = -12; 
lf.lfWeight = FW_NORMAL; 
lf.lfClipPrecision = CLIP_LH_ANGLES; 
strcpy(lf.lfFaceName, "宋体");
lf.lfEscapement = 0;
CFont font;
font.CreateFontIndirect(&lf); 
CFont *pOldFont = pDC->SelectObject(&font); 
  pDC->SetBkMode(TRANSPARENT); float inter = abs(m_fMax-m_fMin);
CString szValue[11];
for(int i =0;i<11;i++)
{
pDC->MoveTo(41, i*16+3);
pDC->LineTo(50,i*16+3);
}
for(i = 0;i<20;i++)
{
pDC->MoveTo(46,i*8+3);
pDC->LineTo(50,i*8+3);
}
float val;
for(i = 0;i<11;i++)
{
if(inter>=1000)
szValue[i].Format("%5.3f",(m_fMax-inter/10*i)/1000); else if(inter>100)
szValue[i].Format("%5.1f",m_fMax-inter/10*i);
else if(inter>1)
szValue[i].Format("%5.2f",m_fMax-inter/10*i);
else
szValue[i].Format("%5.3f",m_fMax-inter/10*i);
  pDC->DrawText(szValue[i],CRect(0,i*16,41,i*16+10),DT_RIGHT|DT_SINGLELINE);
}
pDC->SelectObject(pOldFont); 
}
void  CYcordWin::SetMaxY(float max,float min)
{
m_fMax = max;
m_fMin = min;
if(this->m_hWnd!=NULL)
{
  InvalidateRect(NULL,1);
ShowWindow(SW_HIDE); //背景透明,没法刷新,只好如此解决,嘿嘿
ShowWindow(SW_SHOW);
}
}
我的Y坐标是生成的一个窗口,当我改变刻度重绘的时候,发现新刻度文字和老刻度文字重叠了,可能是因为设置背景透明SetBkMode(TRANSPARENT);,所以没有刷背景?该怎么处理?现在我用笨办法showwindow来暂时解决,但总感觉不爽啊

解决方案 »

  1.   

    InvalidateRect(NULL,1);
    UpdateWindow(); // 这样试试
      

  2.   

    CRect rect;
    GetClientRect(rect);
    InvalidateRect(&rect,1);
    刚才发现可能是InvalidateRect(NULL,1)有问题,如果改成这样则可以刷新,如果为NULL,则根本没有使客户区无效!MSDN还是函数有错误?:(
      

  3.   

    edwardsoft()你说的方法也有效,多谢两位,不过InvalidateRect(NULL,1)怎么就会没用呢?头痛!
      

  4.   

    我猜你的窗口类有问题。是不是WNDCLASS的hbrBackGround为NULL?
      

  5.   

    我没有注册新的窗口类啊
    BOOL CYcordWin::Create(LPCTSTR lpszCurveName,const RECT &rect, CWnd* pWndParent, UINT nID) 
    {
    ASSERT(nID != NULL);
    ASSERT(pWndParent != NULL);
      DWORD dwExStyle  = ~WS_EX_CLIENTEDGE  ;
    LPCTSTR lpszClassName = NULL;
    LPCTSTR lpszWindowName = lpszCurveName;
    DWORD dwStyle = WS_CHILD | WS_VISIBLE;
    dwStyle &=  ~WS_BORDER;
    const RECT& rc = rect;
    CWnd* pParentWnd = pWndParent;
    UINT nClientWndID = nID;
    LPVOID lpParam = NULL;
    BOOL b = CreateEx(NULL, lpszClassName, lpszWindowName, 
    dwStyle, rc, pParentWnd, nClientWndID, lpParam);
    return b;
    }
      

  6.   

    edwardsoft()的也没效果,偶刚才做试验忘记删除偶加的
    ShowWindow(SW_HIDE); 
    ShowWindow(SW_SHOW);
    了,:)