求在vc中使用二维坐标的空间,能够放大缩小整个图片的控件或方法。 求一个能够根据一个2维数组的离散数据画出一个二维坐标的控件,控件能放大缩小里面图片,鼠标点到曲线上能够动态显示当前数据,谢谢了 最好是vc的,vs做也可以(一定要用c++)二维坐标 动态显示 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没有现成的你得自己做放大缩小用StretchBlt数据我没理解错的话就是描点绘图吧 StretchBlt的效果很差还是找一个图像放大缩小的算法吧 现在做出了画出坐标和曲线 问下怎么实现 显示坐标和 放大缩小 就是具体怎么写void Onmousemove 和OnMouseWheel()两个消息响应函数 CMypaintDlg::paint2(){ int width=500; int height=300; int m_rowX=0; //确定坐标图四周预留的空白大小 const int mytop=10; const int mybottom=40; const int myleft=60; const int myright=10; const int x_distance=15; //确定X,Y轴每单位显示宽度 float m_x_num=30,m_y_num=10,m_potY2=100; intervalX=(width-myleft-myright)/(m_x_num); intervalY=(height-mybottom-mytop)/(m_y_num); //确定显示刻度个数 float bottomY=0; float leftX=0; const int count_x=(int)m_x_num; const int count_y=(int)m_y_num; //确定每个显示刻度之间的宽度 float spaceX=(float)(width-myleft-myright)/count_x; float spaceY=(float)(height-mybottom-mytop)/count_y; CClientDC dc(this); CDC* pDC=&dc; //x轴 int o_x=myleft,o_y=height-mybottom; pDC->MoveTo(o_x,o_y);//原点 pDC->LineTo(int(width-myright),o_y); //Y轴 从图形区域最底端到最顶端 //电流坐标轴 兰 m_rowX = int(myleft+(leftX)*intervalX); CPen pen1(PS_SOLID,2,RGB(0,0,255)); CPen *pOldPen1=pDC->SelectObject(&pen1); pDC->MoveTo(o_x,o_y); pDC->LineTo(o_x,int(mytop)); pDC->SelectObject(pOldPen1); //绘制刻度和刻度值 CString str; //选择字体 CFont font; font.CreateFont(14,4,0,0,FW_REGULAR,FALSE,FALSE,0,ANSI_CHARSET,OUT_STROKE_PRECIS, CLIP_DEFAULT_PRECIS,PROOF_QUALITY,FIXED_PITCH | FF_MODERN,"Arial"); CFont* def_font=pDC->SelectObject(&font); //X轴 for(int i=0;i<=count_x;i++) { pDC->MoveTo(int(myleft+spaceX*i),int(height-(mybottom+(bottomY)*intervalY))); pDC->LineTo(int(myleft+spaceX*i),int(height-(mybottom+(bottomY)*intervalY+5))); str.Format("%d",i); pDC->TextOut(int(myleft+spaceX*i-3), int(height-(mybottom+(bottomY)*intervalY-5)),str); } //Y轴 CPen pen3(PS_SOLID,1,RGB(0,0,255)); CPen *pOldPen3=pDC->SelectObject(&pen3); for(i=0;i<=count_y;i++) { pDC->MoveTo(m_rowX,int(height-(mybottom+spaceY*i))); pDC->LineTo(m_rowX+5,int(height-(mybottom+spaceY*i))); str.Format("%d",i); pDC->TextOut(m_rowX-x_distance, int(height-(mybottom+spaceY*i+8)),str); } pDC->SelectObject(pOldPen3); //绘制网格 CPen pen6(PS_DOT,1,RGB(200,240,240)); CPen *pOldPen6=pDC->SelectObject(&pen6); for(i=1;i<=count_y;i++) { pDC->MoveTo(m_rowX+10,int(height-mybottom-i*spaceY)); pDC->LineTo(width,int(height-mybottom-i*spaceY)); } for(i=1;i<count_x;i++) { pDC->MoveTo(int(m_rowX+i*spaceX),int(height-mybottom)); pDC->LineTo(int(m_rowX+i*spaceX),mytop); } pDC->SelectObject(pOldPen6); //绘制X,Y轴的变量名 CFont font1; font1.CreateFont(15,6,0,0,FW_REGULAR,FALSE,FALSE,0,ANSI_CHARSET,OUT_STROKE_PRECIS, CLIP_DEFAULT_PRECIS,PROOF_QUALITY,FIXED_PITCH | FF_SWISS,"Arial"); CFont* def_font1=pDC->SelectObject(&font1); pDC->TextOut(width/2,height-20,"时间(s)"); pDC->TextOut(o_x-60,mytop,"(Value)"); pDC->SelectObject(def_font1); //绘制 曲线 int x_data[5]={2,6,8,14,17}; int data[5]={2,6,1,3,7}; CPen pendata(PS_DOT,1,RGB(255,0,0)); CPen *pOldPendata=pDC->SelectObject(&pendata); for (i=0;i<4;i++) { pDC->MoveTo(o_x+spaceX*x_data[i],o_y-spaceY*data[i]); pDC->LineTo(o_x+spaceX*x_data[i+1],o_y-spaceY*data[i+1]); }}void CMypaintDlg::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CMypaintDlg *pdlg=(CMypaintDlg*)AfxGetMainWnd(); float cur_x,cur_y; m_cur_x.Format("%f",cur_x); m_cur_y.Format("%d",cur_y); UpdateData(FALSE); CDialog::OnMouseMove(nFlags, point);}BOOL CMypaintDlg::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) { // TODO: Add your message handler code here and/or call default return CDialog::OnMouseWheel(nFlags, zDelta, pt);}} 对话框中的WSAAsyncSelect vs2010同vs6.0能不能兼容? 使用ado创建access数据库及表,谢谢了! 高手留步::没有头文件的情况下 如何实现一个接口? 可以多个线程同时插入纪录吗?access数据库 请教COM高手!!! 有谁比较了解青岛朗讯的? EXE的版本信息能修改吗?一个EXE的唯一标识是什么呢?可以以进程名为唯一标识吗? ■■■ ■■■好多好多问题快来拿分阿80呢 ■■■ ■■■ opencv处理灰度图时出现的问题 switch中没有case是怎么回事? MFC 沿着一个半径为R1的虚拟圆周,使用半径R2画圆 怎么实现??
你得自己做
放大缩小用StretchBlt
数据我没理解错的话就是描点绘图吧
还是找一个图像放大缩小的算法吧
CMypaintDlg::paint2()
{
int width=500;
int height=300;
int m_rowX=0;
//确定坐标图四周预留的空白大小
const int mytop=10;
const int mybottom=40;
const int myleft=60;
const int myright=10;
const int x_distance=15;
//确定X,Y轴每单位显示宽度
float m_x_num=30,m_y_num=10,m_potY2=100;
intervalX=(width-myleft-myright)/(m_x_num);
intervalY=(height-mybottom-mytop)/(m_y_num);
//确定显示刻度个数
float bottomY=0;
float leftX=0;
const int count_x=(int)m_x_num;
const int count_y=(int)m_y_num;
//确定每个显示刻度之间的宽度
float spaceX=(float)(width-myleft-myright)/count_x;
float spaceY=(float)(height-mybottom-mytop)/count_y;
CClientDC dc(this);
CDC* pDC=&dc;
//x轴
int o_x=myleft,o_y=height-mybottom;
pDC->MoveTo(o_x,o_y);//原点
pDC->LineTo(int(width-myright),o_y);
//Y轴 从图形区域最底端到最顶端
//电流坐标轴 兰
m_rowX = int(myleft+(leftX)*intervalX);
CPen pen1(PS_SOLID,2,RGB(0,0,255));
CPen *pOldPen1=pDC->SelectObject(&pen1);
pDC->MoveTo(o_x,o_y);
pDC->LineTo(o_x,int(mytop));
pDC->SelectObject(pOldPen1);
//绘制刻度和刻度值
CString str;
//选择字体
CFont font;
font.CreateFont(14,4,0,0,FW_REGULAR,FALSE,FALSE,0,ANSI_CHARSET,OUT_STROKE_PRECIS,
CLIP_DEFAULT_PRECIS,PROOF_QUALITY,FIXED_PITCH | FF_MODERN,"Arial");
CFont* def_font=pDC->SelectObject(&font);
//X轴
for(int i=0;i<=count_x;i++)
{
pDC->MoveTo(int(myleft+spaceX*i),int(height-(mybottom+(bottomY)*intervalY)));
pDC->LineTo(int(myleft+spaceX*i),int(height-(mybottom+(bottomY)*intervalY+5)));
str.Format("%d",i);
pDC->TextOut(int(myleft+spaceX*i-3), int(height-(mybottom+(bottomY)*intervalY-5)),str);
}
//Y轴
CPen pen3(PS_SOLID,1,RGB(0,0,255));
CPen *pOldPen3=pDC->SelectObject(&pen3);
for(i=0;i<=count_y;i++)
{
pDC->MoveTo(m_rowX,int(height-(mybottom+spaceY*i)));
pDC->LineTo(m_rowX+5,int(height-(mybottom+spaceY*i)));
str.Format("%d",i);
pDC->TextOut(m_rowX-x_distance, int(height-(mybottom+spaceY*i+8)),str);
}
pDC->SelectObject(pOldPen3);
//绘制网格
CPen pen6(PS_DOT,1,RGB(200,240,240));
CPen *pOldPen6=pDC->SelectObject(&pen6);
for(i=1;i<=count_y;i++)
{
pDC->MoveTo(m_rowX+10,int(height-mybottom-i*spaceY));
pDC->LineTo(width,int(height-mybottom-i*spaceY));
}
for(i=1;i<count_x;i++)
{
pDC->MoveTo(int(m_rowX+i*spaceX),int(height-mybottom));
pDC->LineTo(int(m_rowX+i*spaceX),mytop);
}
pDC->SelectObject(pOldPen6);
//绘制X,Y轴的变量名
CFont font1;
font1.CreateFont(15,6,0,0,FW_REGULAR,FALSE,FALSE,0,ANSI_CHARSET,OUT_STROKE_PRECIS,
CLIP_DEFAULT_PRECIS,PROOF_QUALITY,FIXED_PITCH | FF_SWISS,"Arial");
CFont* def_font1=pDC->SelectObject(&font1);
pDC->TextOut(width/2,height-20,"时间(s)");
pDC->TextOut(o_x-60,mytop,"(Value)");
pDC->SelectObject(def_font1);
//绘制 曲线
int x_data[5]={2,6,8,14,17};
int data[5]={2,6,1,3,7};
CPen pendata(PS_DOT,1,RGB(255,0,0));
CPen *pOldPendata=pDC->SelectObject(&pendata);
for (i=0;i<4;i++)
{
pDC->MoveTo(o_x+spaceX*x_data[i],o_y-spaceY*data[i]);
pDC->LineTo(o_x+spaceX*x_data[i+1],o_y-spaceY*data[i+1]);
}
}void CMypaintDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CMypaintDlg *pdlg=(CMypaintDlg*)AfxGetMainWnd(); float cur_x,cur_y;
m_cur_x.Format("%f",cur_x);
m_cur_y.Format("%d",cur_y);
UpdateData(FALSE);
CDialog::OnMouseMove(nFlags, point);
}BOOL CMypaintDlg::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
// TODO: Add your message handler code here and/or call default
return CDialog::OnMouseWheel(nFlags, zDelta, pt);
}
}