109上位机VC MFC设备上下文CDC画山树叶
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>
复制代码
|