社区
界面
帖子详情
画图老是出错!求教
spritegg
2003-05-06 11:32:33
我编了一个仿真程序,在对话框中绘图。
开始设定仿真时间(也就是横轴)为10s,仿真步长为0.02s时程序运行很正常,没有问题,但是如果把仿真时间改成20s或更大,或者把步长变小的时候,画图程序就出现问题了,经常画了一半左右的时候图形就从对话框跑到屏幕上去了,在屏幕上他还能继续向前走。那位有过累死的经验,快帮我看看!!!
...全文
91
4
打赏
收藏
画图老是出错!求教
我编了一个仿真程序,在对话框中绘图。 开始设定仿真时间(也就是横轴)为10s,仿真步长为0.02s时程序运行很正常,没有问题,但是如果把仿真时间改成20s或更大,或者把步长变小的时候,画图程序就出现问题了,经常画了一半左右的时候图形就从对话框跑到屏幕上去了,在屏幕上他还能继续向前走。那位有过累死的经验,快帮我看看!!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
spritegg
2003-05-07
打赏
举报
回复
void CHss1Dlg1::drawfig(int left, int top, int right, int bottom,double *Ylmt)
{ int width,high,x0,y0,a;
int i,j,num;
// float t,HV=1.,HA=0.,y=0.;
/*HV.HA: 容积和转子的动态时间常数
y:信号叠加系数*/
// double z[6],s[6],h[5];
//double k[6][5];
// int tt[6],yy[6];
//int cr[6]={0,WHITE,DARKGRAY,GREEN,RED,LIGHTMAGENTA};
//float Ylmt[6]={0,0.2,1.5,1.5,1.5,1.5};
char ch[8];
char *zch[6]={"","ψ(r/min)","ρ","ξ","σ","μ"};
char *zp[6]={""," ψ转速","ρ蒸汽室压力","ξ调速器位移",
" σ滑阀位移","μ油动机位移"};
//int calculate;/*calculate:实时模式计算进行标志 1:进行*/
// float int_tmp;/*中断间隔时间 0.065536/1.193=1/18.2秒*/
// FILE *fd_temp;
int j_temp=15;
// long int b_pos;
num=5;
width=right-left;
high=bottom-top;
x0=left;
y0=top+high/2;
HWND hwnd=GetSafeHwnd();
mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,RGB(0,0,0));
CDC dc;
// CMemDC1 dc1(&dc);
// CString string;
// string="the SGA For Vane Setting";
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);
//画表格边框
dc.MoveTo(left,top);
dc.LineTo(left,bottom);
dc.MoveTo(left,bottom);
dc.LineTo(right,bottom);
dc.MoveTo(right,bottom);
dc.LineTo(right,top);
dc.MoveTo(right,top);
dc.LineTo(left,top);
dc.MoveTo(x0,y0);
dc.LineTo(x0+width,y0);
//画横坐标刻度
CString str;
//设置字体
CFont font;
font.CreateFont(-12, //字体字符的逻辑高度
0, //字符平均宽度取默认值
0, //文本行角度为0,水平
0, //字符角度为0,正立
FW_NORMAL, //正常字体
FALSE, //不倾斜
FALSE, //不加下划线
FALSE, //不加删除线
ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_MODERN,
"Times New Roman");
CFont *oldFont=dc.SelectObject (&font);
// dc1.SelectObject(oldFont);
COLORREF crColor=GetSysColor(COLOR_BTNFACE);
dc.SetBkColor(crColor);
for(i=0;i<51;i++)/*时间轴:0-Tend (秒)*/
{
a=x0+f_int(i/50.0*width);
dc.MoveTo(a,bottom);
dc.LineTo(a,bottom-2);
if(i%10==0)
{
dc.MoveTo(a,bottom);
dc.LineTo(a,bottom-5);
gcvt(dd.Tend/50.0*i,2,ch);
//str.Format("%6.2f",dd.Tend/50.0*i);
dc.TextOut(a-3,y0+high/2+5,ch);
}
}
dc.TextOut(x0+width-5,y0+high/2+18,"t(s)");
for(j=-30;j<=30;j++)/*转速轴:2400-3600 (r/min)*/
{
a=y0-f_int(j/30.0*high/2.0);
//line(x0,a,x0+2,a);
dc.MoveTo(x0,a);
dc.LineTo(x0+2,a);
if(j%5==0)
{
//line(x0,a,x0+4,a);
dc.MoveTo(x0,a);
dc.LineTo(x0+5,a);
gcvt((Ylmt[1]*(j/30.0)+1)*3000,4,ch);
dc.TextOut(x0-35,a-6,ch);
}
}
for(j=-15;j<=15;j++)/*其它轴:-1.5 - +1.5 (相对量)*/
{
a=y0-f_int(j/15.0*high/2.0);
//line(x0+width,a,x0+width-2,a);
dc.MoveTo(x0+width,a);
dc.LineTo(x0+width-2,a);
if(j%5==0)
{
//line(x0+width,a,x0+width-4,a);
dc.MoveTo(x0+width,a);
dc.LineTo(x0+width-5,a);
gcvt(Ylmt[2]*(j/15.0),4,ch);
dc.TextOut(x0+width+4,a-8,ch);
}
}
mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,RGB(0,0,255));
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);
dc.SetBkColor(crColor);
dc.SelectObject (&font);
dc.SetTextColor(m_colors[0]);
dc.MoveTo(40,428);
dc.LineTo(77,428);
dc.TextOut(42,433,"ψ转速");
dc.TextOut(40,20,"ψ(r/min)");
mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,RGB(255,0,0));
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);
dc.SetBkColor(crColor);
dc.SelectObject (&font);
dc.SetTextColor(m_colors[1]);
dc.MoveTo(145,428);
dc.LineTo(185,428);
dc.TextOut(135,433,"ρ蒸汽室压力");
dc.TextOut(535,20,"ρ");
mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,RGB(0,128,0));
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);
dc.SetBkColor(crColor);
dc.SelectObject (&font);
dc.SetTextColor(m_colors[2]);
dc.TextOut(262,433,"ξ调速器位移");
dc.TextOut(545,20,"ξ");
dc.MoveTo(270,428);
dc.LineTo(315,428);
mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,RGB(0,0,0));
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);
dc.SetBkColor(crColor);
dc.SelectObject (&font);
dc.SetTextColor(m_colors[3]);
dc.TextOut(390,433,"σ滑阀位移");
dc.TextOut(555,20,"σ");
dc.MoveTo(395,428);
dc.LineTo(440,428);
mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,m_colors[4]);
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);
dc.SetBkColor(crColor);
dc.SelectObject (&font);
dc.SetTextColor(m_colors[4]);
dc.TextOut(492,433,"μ油动机位移");
dc.TextOut(565,20,"μ");
dc.MoveTo(500,428);
dc.LineTo(540,428);
}
void CHss1Dlg1::OnPaint()
{ int i;
CPaintDC dc(this); // device context for painting
double Ylmt[6]={0,0.2,1.5,1.5,1.5,1.5};
// TODO: Add your message handler code here
CRect rectClip;
if(dc.GetClipBox(&rectClip)!=NULLREGION&&mflag==1)
{ //AfxMessageBox("adafd");
HWND hwnd=GetSafeHwnd();
drawfig(60,45,555,400,Ylmt);
mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,m_colors[0]);
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);
for(i=0;i<f_int(dd.Tend/dd.H)-1;i++)
{dc.MoveTo(ttemp0[i]);
dc.LineTo(ttemp0[i+1]);}
mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,m_colors[1]);
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);
for(i=0;i<f_int(dd.Tend/dd.H)-1;i++)
{dc.MoveTo(ttemp1[i]);
dc.LineTo(ttemp1[i+1]);}
mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,m_colors[2]);
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);
for(i=0;i<f_int(dd.Tend/dd.H)-1;i++)
{dc.MoveTo(ttemp2[i]);
dc.LineTo(ttemp2[i+1]);}
mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,m_colors[3]);
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);
for(i=0;i<f_int(dd.Tend/dd.H)-1;i++)
{dc.MoveTo(ttemp3[i]);
dc.LineTo(ttemp3[i+1]);}
mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,m_colors[4]);
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);
for(i=0;i<f_int(dd.Tend/dd.H)-1;i++)
{dc.MoveTo(ttemp4[i]);
dc.LineTo(ttemp4[i+1]);}
}
// Do not call CDialog::OnPaint() for painting messages
}
spritegg
2003-05-07
打赏
举报
回复
下面是我得三个主要函数的代码,simu仿真函数,包括仿真计算及画图在内,OnPaint()重画函数,drawfig()函数主要是画表格边框。高手帮我看看,谢了!
void CHss1Dlg1::simu(int flag,int simu_mode)
/*flag: 0 只画坐标系 1 仿真
simu_mode: 0 实时模式 1仿真模式
*/
{ int i,j,num,lk=0;
int left,right,top,bottom,width,high,x0,y0;
double t,HV=1.,HA=0.,y=0.;
/*HV.HA: 容积和转子的动态时间常数
y:信号叠加系数*/
double z[6],s[6],h[5],k[6][5];
// int a,
int tt[6],yy[6];
// int cr[6]={0,BLACK,GREEN,BROWN,RED,LIGHTMAGENTA};
double Ylmt[6]={0,0.2,1.5,1.5,1.5,1.5};
// char ch[8];
char *zch[6]={"","ψ(r/min)","ρ","ξ","σ","μ"};
char *zp[6]={""," ψ转速","ρ蒸汽室压力","ξ调速器位移",
" σ滑阀位移","μ油动机位移"};
// int calculate;/*calculate:实时模式计算进行标志 1:进行*/
// double int_tmp;/*中断间隔时间 0.065536/1.193=1/18.2秒*/
//FILE *fd_temp;
int j_temp=15;
// long int b_pos;
mflag=0;
qingping();
num=5;
drawfig(60,45,555,400,Ylmt); //画表格边框,代码在后面
mflag=1;
left=60;
right=555;
top=45;
bottom=400;
width=right-left;
high=bottom-top;
x0=left;
y0=top+high/2;
HWND hwnd=GetSafeHwnd();
mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,RGB(0,0,0));
CDC dc;
// CMemDC1 dc1(&dc);
// CString string;
// string="the SGA For Vane Setting";
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);
/*变量初始化*/
for(i=0;i<=num;i++)
{
for(j=0;j<=4;j++) k[i][j] = 0.;
s[i] = 0.; z[i] = 0.;
}
h[1]=0.; h[2]=h[3]= dd.H/2.; h[4]=dd.H;
//dc.MoveTo(x0,y0);
/*画图中间变量f_int(dd.Tend/dd.H)+5*/
temp0=new double[f_int(dd.Tend/dd.H)+5];
temp1=new double[f_int(dd.Tend/dd.H)+5];
temp2=new double[f_int(dd.Tend/dd.H)+5];
temp3=new double[f_int(dd.Tend/dd.H)+5];
temp4=new double[f_int(dd.Tend/dd.H)+5];
temp5=new double[f_int(dd.Tend/dd.H)+5];
ttemp0=new CPoint[f_int(dd.Tend/dd.H)+5];
ttemp1=new CPoint[f_int(dd.Tend/dd.H)+5];
ttemp2=new CPoint[f_int(dd.Tend/dd.H)+5];
ttemp3=new CPoint[f_int(dd.Tend/dd.H)+5];
ttemp4=new CPoint[f_int(dd.Tend/dd.H)+5];
for(i=1;i<=num;i++) { tt[i]=x0; yy[i]=y0; }
t=0; /*从0秒开使仿真*/
do
{
t=t+dd.H;
z[3]=fd(z[3],dd.Vd,1);/*滑阀死区:dd.Vd*/
z[4]=fd(z[4],dd.Rd,1);/*油动机死区:dd.Rd*/
//CString str;
// str.Format("%f,%f",z[3],z[4]);
// AfxMessageBox(str);
for(j=1;j<=4;j++)
{
for(i=1;i<=num;i++) s[i]=z[i]+h[j]*k[i][j-1] ;
/*某全液压钻孔泵系统*/
/*转 子dψ/dt [2] */ k[1][j] = (s[2]-HA*s[1]+dd.LOAD/100.0)/dd.TA;
/*蒸汽室dρ/dt [1] */ k[2][j] = (s[5]-HV*s[2])/dd.TV;
/*调速器dξ/dt [3] */ k[3][j] = (s[1]/dd.dtsp-s[3]-dd.Z1)/dd.TR;
/*滑 阀dσ/dt [4] */ k[4][j] = -(y*s[1]+s[3]+s[5]+s[4])/dd.TB;
/*油动机dμ/dt [5] */ k[5][j] = s[4]/dd.TS;
}
temp0[lk]=lk*dd.H;
for(i=1;i<=num;i++)
{z[i] = z[i] +dd.H/6.*(k[i][1] +2.*k[i][2] +2.*k[i][3] +k[i][4]);
if(i==1)
temp1[lk]=z[i];
if(i==2)
temp2[lk]=z[i];
if(i==3)
temp3[lk]=z[i];
if(i==4)
temp4[lk]=z[i];
if(i==5)
temp5[lk]=z[i];
}
z[4]=limit(z[4],dd.V2,dd.V1,1);/*滑阀限幅:dd.V2到dd.V1*/
z[5]=limit(z[5],dd.R2,dd.R1,1);/*油动机限幅:dd.R2到dd.R1*/
temp4[lk]=z[4];
temp5[lk]=z[5];
//Again:
for(i=1;i<=num;i++)
{mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,m_colors[i-1]);
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);
//setcolor(cr[i]);
//if(paint[i]!=1) continue;
if(i==1)
{ttemp0[lk].x=tt[i];
ttemp0[lk].y=yy[i];}
if(i==2)
{ttemp1[lk].x=tt[i];
ttemp1[lk].y=yy[i];}
if(i==3)
{ttemp2[lk].x=tt[i];
ttemp2[lk].y=yy[i];}
if(i==4)
{ttemp3[lk].x=tt[i];
ttemp3[lk].y=yy[i];}
if(i==5)
{ttemp4[lk].x=tt[i];
ttemp4[lk].y=yy[i];}
dc.MoveTo(tt[i],yy[i]);
tt[i]=f_int((t/dd.Tend)*width)+x0;
yy[i]=y0-f_int(z[i]*high/2/Ylmt[i]);
dc.LineTo(tt[i],yy[i]);
}
lk++;
if(simu_mode==0){
Sleep(25);}
}while((t<=dd.Tend)&&(tt[1]<=(x0+width)));
}
林仪明
2003-05-07
打赏
举报
回复
9494
shilong
2003-05-06
打赏
举报
回复
贴点源码...
你画图用的是哪个DC?
vb与matlab混合编程的三种方式,[MATLAB混合编程]
求教
vb与matlab的混合编程
求教
vb与matlab的混合编程 matlab程序已经写出,但是在与vb混合编程的时候卡住了,搞得焦头烂额,主要是想实现在vb界面上输入参数和显示最后
画图
,在此请教各位了,如能赐教,不胜感激,matlab程序如下k=1.0,ds=0.6,...
CSDN回帖得分大全(近两年)
√vs2005调用dll的时候Initialize()函数返回错误 [VC/MFC 基础类] 40 ylongwu 05-21 20:486 ylongwu06-28 13:42管理√为什么我创建登陆框之后,然后获取登陆框的数据时候总是出现非法操作! [VC/MFC 界面] 40 ...
我在CSDN参与的3000个帖子
求教
:如何在vb中结合sql语句实现对于access中表的复杂查询.最好还能让查询结果输出为excel 14: VBA请教怎样得知 某个宏里具体实现了那些操作? 15: 一道数学题,忘了算法,请各位大哥教我! 16: ...
基础
GetWindowNext怎么
老是
返回NULL? 别人的一个问题,大家来讨论讨论! 如何实现树形目录的多选? 在vc里如何直接调用access里做好的Form,Report? 这个问题难煞我了。不要担心分,不够我可以加给你。 怎样在VC中得到...
iphone开发每日一练【2011-11-2】
请大家帮我看看
出错
原因~~~有两个警告啊 关于UIView 滚动条的问题,在线等啊 ipad发布程序问题 新手求助 点击UISearchBar时,如何才能不覆盖上方的navigation 如何让button按钮变成透明 最简单的...
界面
15,979
社区成员
115,896
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章