工控编程吧
标题:
109上位机VC MFC设备上下文CDC画山树叶
[打印本页]
作者:
qq263946146
时间:
2015-12-20 22:33
标题:
109上位机VC MFC设备上下文CDC画山树叶
(, 下载次数: 3)
上传
点击文件名下载附件
109上位机VC
MFC设备上下文CDC画山树叶
功能展示
设备上下文CDC可以画线,画圆,画曲线,还可以画山,画水,画树,我们当前例程通过CDC类的SetPixel()函数实现树叶及山峰的绘制,效果如图;
要点提示
山还是水的绘制都是通过逐点绘制的,我们当前实现了32000个点用于绘制山与叶,再结合SetPixel ()函数将每个点逐一描绘到窗口上;
实现功能
1.新建基于对话框的应用程序
2.定义一个点的数组变量 CPointm_PointArray[32000];
自定义一个函数 void IniPointArray(UINT nIndex=0);用于点数组的赋值,
自定义一个函数 void DrawPointArray(UINT nIndex=0);用于将点数组绘制到窗口中
3.添加两按钮,实现山与树叶的绘制,四个函数代码如下
void CGkbc8Dlg::OnDraw() { IniPointArray(1); DrawPointArray(1);
}
void CGkbc8Dlg::OnButton1() { IniPointArray(); DrawPointArray();
}
void CGkbc8Dlg::DrawPointArray(UINT nIndex)
{
COLORREF color=RGB(0,0,182);
if(0 == nIndex)//页
color = RGB(0,255,0);
if(1 == nIndex)
color = RGB(182,182,182);
CDC *pDC = GetDC();
for(int i=0;i<32000;i++)
{
if(m_PointArray[i].x != -65535)
pDC->SetPixel(m_PointArray[i].x,m_PointArray[i].y,color);
}
ReleaseDC(pDC);
}
复制代码
void CGkbc8Dlg::IniPointArray(UINT nIndex)
{
double a[],b[8],c[8],d[8],e[8],f[8],p[8];
int stepx ,stepy ;
if(0 == nIndex)//页
{
stepx=15; stepy=15;
a[0]=0.0;a[1]=0.85;a[2]=0.2;a[3]=-0.15;
b[0]=0;b[1]=0.04;b[2]=-0.26;b[3]=0.28;
c[0]=0;c[1]=-0.04;c[2]=0.23;c[3]=0.26;
d[0]=0.16;d[1]=0.85;d[2]=0.22;d[3]=0.24;
e[0]=0;e[1]=0;e[2]=0;e[3]=0;
f[0]=0;f[1]=1.6;f[2]=1.6;f[3]=0.44;
p[0]=0.01;p[1]=0.85;p[2]=0.07;p[3]=0.07;
}
else if(1 == nIndex)//山
{
stepx=3; stepy=3;
a[0]=0.7;a[1]=0.5;a[2]=-0.4;a[3]=-0.5;
b[0]=0.0;b[1]=0;b[2]=0;b[3]=0;
c[0]=0;c[1]=0;c[2]=1;c[3]=0;
d[0]=0.8;d[1]=0.5;d[2]=0.4;d[3]=0.5;
e[0]=0;e[1]=2;e[2]=0;e[3]=2;
f[0]=0;f[1]=0;f[2]=1;f[3]=1;
p[0]=0.25;p[1]=0.25;p[2]=0.25;p[3]=0.25;
}
else
return;
int nTotalSteps=32000;
int i,k;
int N =4;
int MaxY=400;
for(i=1;i<N;i++)
{
p[i]=p[i]+p[i-1];
}
复制代码
double x=0,y=0;
float xj,m;
srand(unsigned(time(NULL)));
for(i=0;i<nTotalSteps;i++)
{
m=float(rand());
xj=float(m/RAND_MAX);
if(xj<=p[0]) k=0;
if((xj>p[0])&&(xj<=p[1])) k=1;
if((xj>p[1])&&(xj<=p[2])) k=2;
if((xj>p[2])&&(xj<=p[3])) k=3;
if((xj>p[3])&&(xj<=p[4]))k=4;
if((xj>p[4])&&(xj<=p[5])) k=5;
if((xj>p[5])&&(xj<=p[6]))k=6;
if((xj>p[6]) &&(xj<=p[7]))k=7;
x=a[k]*x+b[k]*y+e[k];
y=c[k]*x+d[k]*y+f[k];
if(i>10)
{
m_PointArray[i].x = int(MaxY*x/stepx+MaxY/2 );
m_PointArray[i].y = MaxY-int(MaxY*y/stepy+30)-100;
}
else
{
m_PointArray[i].x=m_PointArray[i].y=-65535;//后面调用进行判断用
}
}
}
<div style="text-align: center;"><span style="line-height: 1.5;"><font size="4">我们来演示功能实现过程</font></span></div>
复制代码
[iqiyi]http://player.video.qiyi.com/9a4841188d154f48d41b8eea836bbb22/0/0/w_19rt7a3gfx.swf-albumId=5063486609-tvId=5063486609-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 1)
上传
点击文件名下载附件
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4