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);
}