绘制坐标轴刻度不符问题。

时间:2021-08-13 09:44:27
如下是我绘制坐标轴代码,鼠标十字线移动显示值与刻度不符,而右上角点坐标是设定好的【40,520】请各位帮小弟看看,小弟那里错了。拜谢!
void  CDataShow::Draw_Axis(CDC*pDC)
{

pDC->SetTextColor(text_color);
pDC->SelectObject(&m_pdc_axis.new_pen);
CRect rect;
SetDataRect();
rect=m_dataRect;
CString str;
int i;
int m_left,m_top,m_right,m_bottom;
    m_left = rect.left;
m_top = rect.top;
m_right = rect.right;
m_bottom = rect.bottom;
double m_Interval_x = (m_right - m_left)/20;
double m_Interval_y = (-m_top+m_bottom)/10;

// 选中当前红色画笔,并保存以前的画笔
// CGdiObject* pOldPen = pDC->SelectObject(pPenRed);

// 绘制坐标轴
pDC->MoveTo(m_left,m_top-10);

// 垂直轴
pDC->LineTo(m_left,m_bottom);

// 水平轴
pDC->LineTo(m_right+10,m_bottom);
//原点坐标显示位置
m_pOrth.x=m_left;
m_pOrth.y=m_bottom;

// 写X轴刻度值
for(i=0;i<20;i++)
{
//str.Format(_T("%d"),m_Min+i*m_Interval);
str.Format(_T("%.1f"),GetAxisPosition(i,"x"));
pDC->TextOut(m_left+double(i*m_Interval_x),m_bottom+3,str);
}
//str.Format(_T("%d"),m_Max);
str.Format(_T("%.1f"),m_x_end);
pDC->TextOut(m_left+20*m_Interval_x,m_bottom+3,str);
//////////////////////////////////////////////////////////////////

// 绘制X轴刻度
for (i = 1; i <= 40; i ++)
{
if ((i%2) == 0)
{
// 10的倍数
pDC->MoveTo(i*m_Interval_x/2 + m_pOrth.x, m_bottom);
pDC->LineTo(i*m_Interval_x/2 + m_pOrth.x, m_bottom+8);
}
else
{
// 10的倍数
pDC->MoveTo(i*m_Interval_x/2 +m_pOrth.x, m_bottom);
pDC->LineTo(i*m_Interval_x/2 + m_pOrth.x, m_bottom+3);
}
}

// 绘制X轴箭头
pDC->MoveTo(m_right+5,m_bottom-5);
pDC->LineTo(m_right+10,m_bottom);
pDC->LineTo(m_right+5,m_bottom+5);

// 绘制Y轴箭头
pDC->MoveTo(m_left-5,m_top-5);
pDC->LineTo(m_left,m_top-10);
pDC->LineTo(m_left+5,m_top-5);


//////////////////////////////////////////////////////////////////
    //数组赋值

    //m_Interval = (m_High - m_Low)/20-2;
//m_Interval=(-m_Bottom+m_Top)/10-4;
//m_dnum_top_bottom=m_Interval;//Interval为间隔
CFont* pFont = pDC->GetCurrentFont();
LOGFONT logFont ;
pFont->GetLogFont(&logFont);
logFont.lfEscapement = 900 ;//900/10 = 90
HFONT   hFont=CreateFontIndirect(&logFont);   
pDC->SelectObject(hFont);
// 写y轴刻度值
for(i=0;i<10;i++)
{
//str.Format(_T("%d"),m_Min+i*m_Interval);
str.Format(_T("%.1f"),GetAxisPosition(i,"y"));
pDC->TextOut(m_pOrth.x-20,m_pOrth.y-(i)*m_Interval_y+10,str);
}
str.Format(_T("%.1f"),m_y_end);
pDC->TextOut(m_pOrth.x-20,m_pOrth.y-10*m_Interval_y+10,str);
    

// 绘制y轴刻度
for (i=1;i<=20;i++)
{
if (i%2 == 0)
{
// 10的倍数
pDC->MoveTo(m_pOrth.x, m_pOrth.y-i*m_Interval_y/2);
pDC->LineTo(m_pOrth.x-8, m_pOrth.y-i*m_Interval_y/2);
}
else
{

pDC->MoveTo(m_pOrth.x, m_pOrth.y-i*m_Interval_y/2);
pDC->LineTo(m_pOrth.x-5, m_pOrth.y-i*m_Interval_y/2);
}
}

DeleteObject(hFont);
pDC->SelectObject(pFont);
pFont->DeleteObject();


}
运行界面图如下:
绘制坐标轴刻度不符问题。

7 个解决方案

#1


问题没 看明白

#2


估计还是坐标关系没有搞清楚

#3


应该是 误差 ,就 像用秤车重的地磅 秤人体重

#4


您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法

#5


自己绘制需要处理很多细节,容易出错,用控件吧。

#6


就这东西你用得着自己绘制吗?让美工给你做张图,肯定比你这漂亮多了,边距什么的都规定好了,然后贴到DC上,之后你就可以在DC上绘制了!

#7


引用 5 楼 baita96 的回复:
自己绘制需要处理很多细节,容易出错,用控件吧。

有图有真相
绘制坐标轴刻度不符问题。
http://blog.csdn.net/baita96/

#1


问题没 看明白

#2


估计还是坐标关系没有搞清楚

#3


应该是 误差 ,就 像用秤车重的地磅 秤人体重

#4


您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法

#5


自己绘制需要处理很多细节,容易出错,用控件吧。

#6


就这东西你用得着自己绘制吗?让美工给你做张图,肯定比你这漂亮多了,边距什么的都规定好了,然后贴到DC上,之后你就可以在DC上绘制了!

#7


引用 5 楼 baita96 的回复:
自己绘制需要处理很多细节,容易出错,用控件吧。

有图有真相
绘制坐标轴刻度不符问题。
http://blog.csdn.net/baita96/