1.对消息的响应主要是通过消息映射MESSAGE_MAP里面的宏找到对应的处理消息的函数对消息进行处理。
2.利用OnPaint函数对WM_PAINT消息进行处理,在OnPaint函数中设定相应直方图和饼图的各项参数,执行程序的时候直接在显示的窗口上绘制直方图和饼状图。
函数功能说明:
1. OnPaint():主要是对WM_PAINT消息的相应,在OnPaint函数中可以设定直方图和饼状图的各项参数,包括坐标系,颜色,宽度,比例等的设计,以完成相应消息的时候直接无需其他操作直接在窗口部分显示直方图和饼状图。
2. GetClientRect(LPRECT lpRect):函数主要是通过指针指向Rect设定显示窗口客户区的大小。其中lpRect是一个指向RECT类型的rectangle结构的指针。
3. SetViewportOrg( int x, int y ):函数主要用于设置逻辑坐标的原点。其中X,Y是视图的初始坐标,要求其设定的坐标值必须是在设备坐标系统的范围之内。
4. SetMapMode(HDC hdc, int fnMapMode):函数用于设定设备环境的映射方式,将逻辑坐标转换为设备坐标,同时制定设备坐标中X,Y的坐标轴方向。其中hdc为指向设备环境的句柄。
5. MoveTo(int x,int y):函数用来实现位置的移动,移动到函数指定的x,y坐标处。
6. LineTo(int X, int Y, ):函数用于划线,起点是当前位置,终点为函数指定的x,y位置。
7. ZeroMemory( PVOID Destination,SIZE_T Length ):函数用于将指定的内存区域清零。其中Destination表示指定区域的开始地址,Length指定了需要清零的内存区域的大小。
8. CreateFontIndirect(CONST LOGFONT *lplf):函数用来创建一种可以在后面应用中被使用的逻辑字体。
9. TextOut(HDC hdc,int nXStart, int nYStart,LPCTSTR lpString,int cbString ):函数用于写字符串,同时可以使写入的字符串按照规定的字体,背景颜色和字体颜色显示。
程序设计步骤:
创建的工程类型:MFC CWnd
核代码:
void CChildView::OnPaint()
{
float stu[4]={0.2,0.2,0.4,0.2};//人数百分比
int witch=40,zbwitch=5,i=70,data[4],max=400;
float rad[4];
for(int t=0;t<4;t++)
{data[t]=int(max*stu[t]);rad[t]=2*3.14f*stu[t];}
CPaintDC dc(this); // device context for painting
CRect clirec;
GetClientRect(clirec);
dc.SetMapMode(MM_LOMETRIC);//设置映像模式
dc.SetViewportOrg(0,clirec.Height());
CPoint oxy(300,300);//坐标原点
//坐标轴
CPen pen1(PS_SOLID,5,RGB(0,0,0)),*oldpen1;
oldpen1=dc.SelectObject(&pen1);
dc.MoveTo(oxy);//画纵轴
dc.LineTo(oxy.x+500,oxy.y);
dc.LineTo(oxy.x+480,oxy.y+20);
dc.MoveTo(oxy.x+500,oxy.y);
dc.LineTo(oxy.x+480,oxy.y-20);
dc.MoveTo(oxy);//画横轴
dc.LineTo(oxy.x,oxy.y+500);
dc.LineTo(oxy.x-20,oxy.y+480);
dc.MoveTo(oxy.x,oxy.y+500);
dc.LineTo(oxy.x+20,oxy.y+480);
for(t=1;t<6;t++)
{
dc.MoveTo(oxy.x,oxy.y+max/5*t);
dc.LineTo(oxy.x+zbwitch,oxy.y+max/5*t);
}
dc.SelectObject(&oldpen1);
CString num[2]={"学生分类","百分比"};
LOGFONT nflog;
ZeroMemory(&nflog,sizeof(nflog));
nflog.lfHeight=25;
nflog.lfWeight=FW_BOLD;
nflog.lfCharSet=GB2312_CHARSET;
for(t=0;t<2;t++)
{
strcpy(nflog.lfFaceName,num[t]);
}
CFont font;
font.CreateFontIndirect(&nflog);
dc.SelectObject(&font);
dc.TextOut(oxy.x+520,oxy.y,num[0]);
dc.TextOut(oxy.x-30,oxy.y+530,num[1]);
CString str[4]={"博士","硕士","本科","专科"};
LOGFONT flog;
ZeroMemory(&flog,sizeof(flog));
flog.lfHeight=25;
flog.lfWeight=FW_BOLD;
flog.lfCharSet=GB2312_CHARSET;
for(t=0;t<4;t++)
{
strcpy(flog.lfFaceName,str[t]);
CFont font;
font.CreateFontIndirect(&flog);
dc.SelectObject(&font);
dc.ExtTextOut(oxy.x+i*(t+1)-20+witch*t,oxy.y-20,ETO_OPAQUE,NULL,str[t],NULL);
}
CString ctr[5]={"20","40","60","80","100"};
LOGFONT flog1;
ZeroMemory(&flog1,sizeof(flog1));
flog1.lfHeight=25;
flog1.lfWeight=FW_BOLD;
flog1.lfCharSet=GB2312_CHARSET;
for(t=0;t<5;t++)
{
strcpy(flog.lfFaceName,ctr[t]);
CFont font;
font.CreateFontIndirect(&flog1);
dc.SelectObject(&font);
dc.SetTextAlign(TA_RIGHT);
dc.TextOut(oxy.x-20,oxy.y+85*(t+1),ctr[t]);
}
//直方图
CPen pen(PS_SOLID,1,RGB(0,0,0)),*oldpen;
oldpen=dc.SelectObject(&pen);
for(t=0;t<4;t++)
{
CBrush brush1(RGB(255-t*140,t*200,255-t*100)),*oldbrush1;
oldbrush1=dc.SelectObject(&brush1);
dc.Rectangle(oxy.x+i*(t+1)+witch*t,oxy.y+data[t],oxy.x+i*(t+1)+witch*(t+1),oxy.y);
dc.SelectObject(&oldbrush1);
}
dc.SelectObject(&oldpen);
//饼状图
CPoint rec_beg(1500,650),rec_end(1900,250),
hu_beg(0,0),hu_end(0,0);
float sum=0,pi=3.14f,angle=0;
hu_beg.x=rec_end.x;
hu_beg.y=rec_beg.y-200;
for(t=0; t<4; t++)
{
CBrush brush2(RGB(255-t*140,t*200,255-t*100)),*oldbrush2;
oldbrush2=dc.SelectObject(&brush2);
sum+=stu[t];
if(sum < 0.125)
{
angle = sum*2*pi;
hu_end.x = rec_end.x;
hu_end.y = rec_end.y+200+200*tan(angle);
dc.Pie(rec_beg.x, rec_beg.y, rec_end.x, rec_end.y, hu_beg.x, hu_beg.y, hu_end.x, hu_end.y);
hu_beg.x = hu_end.x;
hu_beg.y = hu_end.y;
}
else if(sum >= 0.125 && sum < 0.25)
{
angle = pi/2 - sum*2*pi;
hu_end.x = rec_beg.x+200+200*tan(angle);
hu_end.y = rec_beg.y;
dc.Pie(rec_beg.x, rec_beg.y, rec_end.x, rec_end.y, hu_beg.x, hu_beg.y, hu_end.x, hu_end.y);
hu_beg.x = hu_end.x;
hu_beg.y = hu_end.y;
}
else if(sum >= 0.25 && sum < 0.375)
{
angle = sum*2*pi - pi/2;
hu_end.x = rec_beg.x+200-200*tan(angle);
hu_end.y = rec_beg.y;
dc.Pie(rec_beg.x, rec_beg.y, rec_end.x, rec_end.y, hu_beg.x, hu_beg.y, hu_end.x, hu_end.y);
hu_beg.x = hu_end.x;
hu_beg.y = hu_end.y;
}
else if(sum >= 0.375 && sum < 0.5)
{
angle = pi - sum*2*pi;
hu_end.x = rec_beg.x;
hu_end.y = rec_end.y+200+200*tan(angle);
dc.Pie(rec_beg.x, rec_beg.y, rec_end.x, rec_end.y, hu_beg.x, hu_beg.y, hu_end.x, hu_end.y);
hu_beg.x = hu_end.x;
hu_beg.y = hu_end.y;
}
else if(sum >= 0.5 && sum < 0.625)
{
angle = sum*2*pi - pi;
hu_end.x = rec_beg.x;
hu_end.y = rec_end.y+200-200*tan(angle);
dc.Pie(rec_beg.x, rec_beg.y, rec_end.x, rec_end.y, hu_beg.x, hu_beg.y, hu_end.x, hu_end.y);
hu_beg.x = hu_end.x;
hu_beg.y = hu_end.y;
}
else if(sum >= 0.625 && sum < 0.75)
{
angle = 1.5*pi - sum*2*pi;
hu_end.x = rec_beg.x + 200 - 200*tan(angle);
hu_end.y = rec_end.y;
dc.Pie(rec_beg.x, rec_beg.y, rec_end.x, rec_end.y, hu_beg.x, hu_beg.y, hu_end.x, hu_end.y);
hu_beg.x = hu_end.x;
hu_beg.y = hu_end.y;
}
else if(sum >= 0.75 && sum < 0.875)
{
angle = sum*2*pi - 1.5*pi;
hu_end.x = rec_beg.x+200+200*tan(angle);
hu_end.y = rec_end.y;
dc.Pie(rec_beg.x, rec_beg.y, rec_end.x, rec_end.y, hu_beg.x, hu_beg.y, hu_end.x, hu_end.y);
hu_beg.x = hu_end.x;
hu_beg.y = hu_end.y;
}
else
{
angle = 2*pi - sum*2*pi;
hu_end.x = rec_end.x;
hu_end.y = rec_end.y+200-200*tan(angle);
dc.Pie(rec_beg.x, rec_beg.y, rec_end.x, rec_end.y, hu_beg.x, hu_beg.y, hu_end.x, hu_end.y);
hu_beg.x = hu_end.x;
hu_beg.y = hu_end.y;
}
dc.SelectObject(&oldbrush2);
}