MFC繪制直方圖和餅圖


轉載原文: 使用Win32API 編程方法編寫一個程序繪制直方圖和餅圖

 

MFC 工程中的代碼

 void CChildView::OnPaint() 
{
    CPaintDC dc(this); // device context for painting
//  改字體
    LOGFONT log;
    CFont font;
    log.lfHeight=0;
    log.lfEscapement=0;
    log.lfItalic=0;
    log.lfUnderline=0;
    log.lfStrikeOut=0;

//    dc.SelectObject(&font); 
    font.CreateFontIndirect(&log);
    //畫筆
    CPen pen(PS_SOLID,1,RGB(0,0,0));         
    dc.SelectObject(&pen); 
//    *OldPen = dc.SelectObject(&pen);//舊畫筆


    //邏輯坐標
    SetViewportOrgEx(dc,50,500,NULL);
    dc.SetMapMode(MM_LOMETRIC);//0.1毫米
   
    //縱坐標
    dc.MoveTo(0,0);
    dc.LineTo(0,1000);//高1000
    dc.LineTo(-10,980);
    dc.MoveTo(0,1000);
    dc.LineTo(10,980);
  //縱坐標循環
    CString str;
    int i;
    for(i=1;i<10;i++)
    {   str.Format("%d",i*10);
    
        dc.TextOut(-30,i*100,str);
    }
        dc.TextOut(-50,1050,"%");
    //橫坐標
    dc.MoveTo(0,0);
   dc.LineTo(850,0);
    dc.LineTo(830,10);
    dc.MoveTo(850,0);
    dc.LineTo(830,-10);

    int x1,y1,x2,y2,y3,x3;
    float zhuan=0.4,ben=0.3,shuo=0.2,bo=0.1;
    int h=1000,r=400;

    
    
    //畫柱子
 
    dc.SelectObject(&font);     //修改字體
    
    CRect r1(100,zhuan*h,200,0);
    CBrush br1(RGB(253,51,67));
    dc.FillRect(r1,&br1);//矩形,顏色
   dc.TextOut(130,-10,"專科");//橫坐標的說明文字

    CRect r2(300,ben*h,400,0);
    CBrush br2(RGB(250,164,51));
    dc.FillRect(r2,&br2);
    dc.TextOut(330,-10,"本科");

    CRect r3(500,shuo*h,600,0);
    CBrush br3(RGB(139,197,51));
    dc.FillRect(r3,&br3);
    dc.TextOut(530,-10,"碩士");

    CRect r4(700,bo*h,800,0);
    CBrush br4(RGB(3,141,216));
    dc.FillRect(r4,&br4);
    dc.TextOut(730,-10,"博士");


//    dc.SetBkColor(RGB(0,0,0));
//    dc.Rectangle(100,zhuan*h,200,0);
//    dc.Rectangle(300,ben*h,400,0);
//    dc.Rectangle(500,shuo*h,600,0);
//    dc.Rectangle(700,bo*h,800,0);
    
    //畫餅圖,利用cos,sin函數計算頂點值,顏色沿用之前已經定義了的brush
    dc.SelectObject(&br1);
    x1=int(r*cos(zhuan*3.14*2))+1400;
    y1=int(r*sin(zhuan*3.14*2)+400);
  dc.Pie(1000,800,1800,0,1800,400,x1,y1);


    dc.SelectObject(&br2);
    x2=int(r*cos((ben+zhuan)*3.14*2))+1400;
    y2=int(r*sin((ben+zhuan)*3.14*2))+400;
    dc.Pie(1000,800,1800,0,x1,y1,x2,y2);

    dc.SelectObject(&br3);
    x3=int(r*cos((ben+zhuan+shuo)*3.14*2))+1400;
    y3=int(r*sin((ben+zhuan+shuo)*3.14*2))+400;
    dc.Pie(1000,800,1800,0,x2,y2,x3,y3);
    CBrush   br9(RGB(125,30,227));
    dc.SelectObject(&br9);

    dc.SelectObject(&br4);
    dc.Pie(1000,800,1800,0,x3,y3,1800,400); 

    //在園外右上角畫圖例,加上說明文字
   CRect r5(2000,1000,2080,1060);
    dc.FillRect(r5,&br1);
    dc.TextOut(2100,1040,"專科");

    CRect r6(2000,900,2080,960);
    dc.FillRect(r6,&br2);
    dc.TextOut(2100,940,"本科");

    CRect r7(2000,800,2080,860);
    dc.FillRect(r7,&br3);
    dc.TextOut(2100,840,"碩士");

    CRect r8(2000,700,2080,760);
    dc.FillRect(r8,&br4);
    dc.TextOut(2100,740,"博士");

    // TODO: Add your message handler code here
    
    // Do not call CWnd::OnPaint() for painting messages
}

 

PS:

CPaintDCCClientDC的區別

  CPaintDC類是CDC類的一個派生類,一般用在響應WM_PAINT消息的函數OnPaint()中。如果在OnPaint函數內定義了CPaintDC類的對象,通過這個類對象就可以使用CDC類的成員函數完成視圖客戶區中的圖形繪制操作。

  CClientDC類也是CDC類的派生類。它只能在窗口的客戶區(即窗口中除了邊框、標題欄、菜單欄以及狀態欄外的中間部分)中進行繪圖,坐標點(0,0)通常指的是客戶區的左上角。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM