在vc++中利用MFC建立了一个对话框式的软件界面,如何在坐标轴显示刻度值的大小?

坐标轴已经建立好了,就是刻度没有不会标上去,需要能根据坐标轴中的图像结合坐标轴刻度能读出图形的相关数据(如电流)

修改一下这个函数就可以了

//用以绘制坐标刻度
void CCoordinates::DrawCoordinate(HDC hDC)
{
int nIndex =0;
int nCount=0;

CPen pen(PS_SOLID,1,RGB(0,0,255));
HGDIOBJ hOldPen = SelectObject(hDC,pen.m_hObject);
char szDigi[64];

//画水平坐标系
{
//画水平线
MoveToEx(hDC,m_nXOffset,m_nYOffset,NULL);
LineTo(hDC,m_nHLength+m_nXOffset,m_nYOffset);
nCount = m_nHLength/10;

//画刻度,间隔10像素一个小刻度,每50一个中刻度,100一个大刻度
for(nIndex=0;nIndex<nCount;nIndex++)
{
if(nIndex%10==0) //大刻度高15像素
{
MoveToEx(hDC,m_nXOffset+nIndex*10,m_nYOffset,NULL);
LineTo(hDC,m_nXOffset+nIndex*10,m_nYOffset-15);

sprintf(szDigi,"%d",nIndex*10);
TextOut(hDC,m_nXOffset+nIndex*10-10,m_nYOffset+5,szDigi,strlen(szDigi));
}
else if(nIndex%5==0)//中刻度高10像素
{
MoveToEx(hDC,m_nXOffset+nIndex*10,m_nYOffset,NULL);
LineTo(hDC,m_nXOffset+nIndex*10,m_nYOffset-10);

sprintf(szDigi,"%d",nIndex*10);
TextOut(hDC,m_nXOffset+nIndex*10-10,m_nYOffset+5,szDigi,strlen(szDigi));
}
else //小刻度高5像素
{
MoveToEx(hDC,m_nXOffset+nIndex*10,m_nYOffset,NULL);
LineTo(hDC,m_nXOffset+nIndex*10,m_nYOffset-5);
}

}

}

//画垂直坐标系
{
//画垂直线
MoveToEx(hDC,m_nXOffset,m_nYOffset,NULL);
LineTo(hDC,m_nXOffset,0);//m_nVLength+m_nYOffset);
nCount=m_nVLength/10;

//画刻度,间隔10像素一个小刻度,每50一个中刻度,100一个大刻度
for(nIndex=0;nIndex<nCount;nIndex++)
{
if(nIndex%10==0) //大刻度高15像素
{
MoveToEx(hDC,m_nXOffset,m_nYOffset-nIndex*10,NULL);
LineTo(hDC,m_nXOffset+15,m_nYOffset-nIndex*10);

if(0!=nIndex)
{
sprintf(szDigi,"%d",nIndex*10);
TextOut(hDC,m_nXOffset-25,m_nYOffset-nIndex*10-5,szDigi,strlen(szDigi));
}
}
else if(nIndex%5==0)//中刻度高10像素
{
MoveToEx(hDC,m_nXOffset,m_nYOffset-nIndex*10,NULL);
LineTo(hDC,m_nXOffset+10,m_nYOffset-nIndex*10);

sprintf(szDigi,"%d",nIndex*10);
TextOut(hDC,m_nXOffset-25,m_nYOffset-nIndex*10-5,szDigi,strlen(szDigi));
}
else //小刻度高5像素
{
MoveToEx(hDC,m_nXOffset,m_nYOffset-nIndex*10,NULL);
LineTo(hDC,m_nXOffset+5,m_nYOffset-nIndex*10);
}

}
}

SelectObject(hDC,hOldPen);
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-04-20
以下是一段参考代码,具体数值你自己改。
void CDrawDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
CDC *pDC;
pDC=GetDC();
CPen pen,pen1;
pen.CreatePen(PS_SOLID,3,RGB(200,0,0));
pen1.CreatePen(PS_SOLID,1,RGB(0,0,0));
pDC->SelectObject(&pen);
pDC->SetViewportOrg(margin,margin);
pDC->SetMapMode(MM_TEXT);
pDC->Rectangle(0,0,500,500);
pDC->SelectObject(&pen1);

//draw coordinate scale line
int Xlenth=0;
for (int X=0;X<10,Xlenth<=500;X++)
{
pDC->MoveTo(Xlenth,500);
pDC->LineTo(Xlenth,510);
Xlenth+=50;
}
int Xilenth=0;
for (int Xi=0;Xi<100,Xilenth<=500;Xi++)
{
pDC->MoveTo(Xilenth,500);
pDC->LineTo(Xilenth,505);
Xilenth+=5;
}
int Ylength=0;
for (int Y=0;Y<10,Ylength<=500;Y++)
{
pDC->MoveTo(-10,Ylength);
pDC->LineTo(0,Ylength);
Ylength+=50;
}
int Yilength=0;
for (int Yi=0;Yi<100,Yilength<=500;Yi++)
{
pDC->MoveTo(-5,Yilength);
pDC->LineTo(0,Yilength);
Yilength+=5;
}
pen.DeleteObject();
pen1.DeleteObject();
// Do not call CDialog::OnPaint() for painting messages
DrawCoordinate();//此函数绘制刻度的值
}
以下是DrawCoordinate()函数部分代码
{
. ......
//刻度Y轴
int Ylength=0;
int posY=Ymin;
for (int Y=0;Y<10,Ylength>=-canvas,posY<=Ymax;Y++)
{
pDC->MoveTo(-10,Ylength);
pDC->LineTo(0,Ylength);
char str[20];
sprintf(str,"%d", posY);
int nBkMode = pDC->SetBkMode(TRANSPARENT);
pDC->TextOut(-60,Ylength,str); //这里输出在Y轴方向具体的刻度值
pDC->SetBkMode(nBkMode);
posY=(int)((Ymax-Ymin)/10+posY);
Ylength-=50;
}

VC++MFC问题,怎样在按下按钮后,已文本形式保存指定编辑框中的内容
如果是对话框中的编辑框的话,可以在资源中找到该对话框的资源,打开后应该有对话框的界面。添加一个该对话框的类,如果有的话就可以跳过这个步骤。方法是在该界面中不是控件的区域上单击右键->添加类,然后你可以根据情况选择你需要的建立的类的名字等等的信息,一般建议不做更改。创建好类以后你就能...

【VC++】如何最大化对话框
资源视图,选中你的对话框,在修改外观的Title Bar为False,这一步是去掉对话框的标题栏以及关闭按钮;然后进入类视图,选中要执行最大化的对话框类,为其重载OnInitDialog函数,在该函数中增加语句ShowWindow(SW_MAXIMIZE);(要保证在return语句之前)。如果这个对话框是用mfc向导建立的主对话框,那么可能...

VC++ MFC在对话框上画图问题
1、如何在新建的一个dialog中添加onpaint()函数?例如你新建了一个dialog,类名为test22(添加类是双击新建那个窗口),接着找到这个类的头文件test22.h,在其中的protected中添加一行afx_msg void OnPaint();这样就可以在test22.cpp中用onpaint()函数了,添加void test22::OnPaint(){}就可以了:...

VC++中如何统一对话框的大小
在VC++6.0中,你可以在资源编辑器列表中(左侧Resource页)右键点击已经建立的对话框,选择“Insert Copy”就可以建立大小完全相同,并且控件都复制过来的对话框。复制过程中要注意,你需要先添加一个Condition(随便输入英文字母),然后再右键复制好的对话框,将对话框ID修改为不重复的新对话框ID,再去掉...

VC++的mfc窗口大小问题
在视图类的OnInitialUpdate函数中,有:CSize sizeTotal;sizeTotal.cx = sizeTotal.cy = 100;SetScrollSizes(MM_TEXT, sizeTotal);。你在视图类的其他地方也可以用这样写。通过改变sizeTotal.cx 和 sizeTotal.cy 的值,改变窗口的大小。注意:要有滚动条,试图类的基类要是CScrollView。

vc++中,先建立了一个对话框1,又建立了一个对话框2,数据实时交换的问题...
新建mfc对话框工程 默认对话框 为对话框1 资源插入 对话框2 用类向导给 对话框2 创建 类 在对话框2 上 放一个 文本框控件 用来显示 坐标 字符串 给对话框1的类 的头文件 include上对话框2 的类的头文件 对话框1的类的头文件中添加 对话框2的类的指针 (为了建立对话框2类的 非模态的...

VC++有关MFC" 基于对话框" 中如何将vector中的元素进行排序?
可以的,使用STL提供的sort方法就可以,包含<algorithm> sort(vec.begin(), vec.end(), cmp);bool cmp(const CRoomInfo& room1, const CRoomInfo& room2){ return room1.roomnum < room2.roomnum;}

MFC,基于对话框的,想在对话框中的某一区域画带刻度的坐标轴
\/\/我们指定一个范围,只要用户点在鼠标线附近都算作点击到了鼠标 intm_nCaptureRange;\/\/用以绘制坐标文本 void DrawDigi(HDC hDC);\/\/用以绘制坐标线 void DrawLines(HDC hDC);\/\/用以绘制坐标刻度 void DrawCoordinate(HDC hDC);};可以单点某根坐标线 ,也可以点交叉点 点击被捕获后坐标变虚线,...

MFC中如何调整运行时对话框弹出的优先级
首先你要清楚APP才是MFC程序的造物主,它控制着整个程序的生死 它总是最先运行的 在APP的实现(.cpp)文件中,InitInstance这个函数下,它会现场构造一个你的MFC对话框主程序,然后DoModal它 你可以在它构造主对话框之前让它构造你的对话框,然后DoModal,既然你做的是登陆界面,那么返回值就会有IDOK(...

VC++基于对话框的画图程序:怎么在对话框窗口中绘图??
1、右上部分您可以用任何控件,譬如:CButton,假设其ID号:ID_BUTTON1;2、CWnd *pi=GetDlgItem(ID_BUTTON1);---注意:GetDlgItem是Cwnd类中函数,在此格式是继承;3、CDC *dc=pi->GetDC();dc->Rectangle(...);\/\/可以做任何图了,但一般用RECT rec;及GetClientRect(&rec);保证在控件..\/...

相似回答