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来暂时解决,但总感觉不爽啊
{
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来暂时解决,但总感觉不爽啊
UpdateWindow(); // 这样试试
GetClientRect(rect);
InvalidateRect(&rect,1);
刚才发现可能是InvalidateRect(NULL,1)有问题,如果改成这样则可以刷新,如果为NULL,则根本没有使客户区无效!MSDN还是函数有错误?:(
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;
}
ShowWindow(SW_HIDE);
ShowWindow(SW_SHOW);
了,:)