如何用c 的mfc繪製柱狀圖

時間 2021-09-08 21:08:54

1樓:育知同創教育

用c++的mfc繪製柱狀圖的方法如下:

1:取groupbox的區域,並儲存四個值  左,上,右,下

//獲取螢幕座標

((cwnd*)getdlgitem(idc_static_chart))->getwindowrect(rect);

//計算x軸y軸基本單位

int dx = (rect.right-rect.left)/50;

int dy = (rect.bottom-rect.top)/80;

//轉換成對話方塊座標

screentoclient(rect);

//儲存4個值

int l = rect.left,r = rect.right,t = rect.top,b = rect.bottom;

groupbox的區域我忘記標出來了,就在上面圖中柱狀圖那一塊

2:獲取dc,這一步沒什麼好說的

cpaintdc dc(this);

3:畫x軸,y軸

//xdc.moveto(l+dx*2,b-dy*3);

dc.lineto(l+dx*49,b-dy*3);

//最後的那個箭頭

dc.moveto(l+dx*49,b-dy*3);

dc.lineto(l+dx*48,b-dy*2);

dc.moveto(l+dx*49,b-dy*3);

dc.lineto(l+dx*48,b-dy*4);

y軸同理,但是考慮到dx,dy的值不一樣,當畫y軸的箭頭時,需要交換dx和dy的位置

//縱座標線 dc.moveto(l+dx*2,b-dy*3);

dc.lineto(l+dx*2,b-dy*77);

dc.moveto(l+dx*2,b-dy*77);

//交換了dx,dy的位置

dc.lineto(l+dx*2-dy,b-dy*77+dx);

dc.moveto(l+dx*2,b-dy*77);

//交換了dx,dy的位置

dc.lineto(l+dx*2+dy,b-dy*77+dx);

繪製完結果如圖:

4:畫柱狀圖,這裡主要根據前面計算dx,dy時,劃分的數量來計算每個柱的寬度,以及柱間的間隔

//第乙個柱狀體的左下座標

int x = l+dx*3;

int y = b-dy*3;

for(int i=0;i

crect rc;

rc.left=x+i*dx*9;

rc.right=rc.left+dx*7;

rc.bottom=y;

rc.top=rc.bottom-dy*answer[index][i+1];

//這裡把柱狀圖的資訊輸出,這裡輸出的是乙個數字,因為要轉換成字串,比較麻煩

//處理了一下,肯定有簡潔的處理方式,但是我也懶得去想了,我很懶的

dc.setbkmode(transparent);//設定透明背景,要不然輸出文字之後會有一塊白,難看

char num[10];

sprintf(num,"%d",answer[index][i+1]);

cstring strnum(num);

dc.textoutw((rc.left+rc.right)/2-dx,rc.bottom-dy*(answer[index][i+1]+3),strnum);

//畫刷是我之前就定義好的,直接拿來用

dc.fillrect(&rc,brushs+i);

5:新增控制項訊息響應函式

維護乙個全域性變數index來儲存當前題號,建立重繪函式updateinfo

void cenglishreportdlg::updateinfo(){

int count = choose_c[index];

int i;

//選項存在,賦值,l是巨集命令與text()相同功能

for(i=0;i

m_strlable[i] = choose[index][i];

//無此選項,置空

for(;i<5;i++)

m_strlable[i] = l"";

m_strtopic = topics[index];

//獲取groupbox區域,並轉換成對話方塊座標

crect rect;

((cwnd*)getdlgitem(idc_static_chart))->getwindowrect(rect);

screentoclient(rect);

//重繪此區域

invalidaterect(rect);

//將控制項變數更新到前台

updatedata(false);

函式1:響應listbox的selchange事件

void cenglishreportdlg::onlbnselchangelisttopic()

// todo: 在此新增控制項通知處理程式**

index = m_listtopic.getcursel();

updateinfo();

void cenglishreportdlg::onbnclickedbuttonpre()

// todo: 在此新增控制項通知處理程式**

if(index>0)

index--;

updateinfo();

m_listtopic.setcursel(index);

void cenglishreportdlg::onbnclickedbuttonnext()

// todo: 在此新增控制項通知處理程式**

if(index<19)

index++;

updateinfo();

m_listtopic.setcursel(index);

至此基本的功能都已經實現了,還差最後一步:

6:初始化對話方塊

for(int i=0;i<20;i++){

m_listtopic.addstring(topics[i]);

//index初始化為0,直接重新整理

updateinfo();

m_listtopic.setcursel(index);

執行結果如下:

2樓:武銳

可以用mschart。

如何用或ecel做圖表線狀圖和柱狀圖在表

小小小小顰 以excel為例,具體操作步驟如下 1 首先,開啟excel表,選擇要顯示的資料,如下圖所示,然後進入下一步。2 其次,完成上述步驟後,在左上角 插入 選項卡下選擇 柱形圖 以插入一個柱形圖,如下圖所示,然後進入下一步。3 接著,在圖表中選擇需要更改為折線圖的資料列,單擊滑鼠右鍵,然後選...

請教直方圖和柱狀圖的區別,條形圖和柱狀圖的區別

直方圖既有縱向的數量,又有橫向的區域,比如乙個班級1月份出生10人,二月份出生3人,三月份出生4人,等。如果按月劃分,則對應人數為10 3 4 等等。如果按季度分,則第一季度17人。而柱形圖一般只表示縱向的數量,如某班來自北京的3人,上海的5人,天津的3人,等。檢視原帖 直方圖 histogram ...

excel的柱狀圖,某一柱如何移動

單擊選中圖上的某一資料系列,在公式欄裡將最右面右括號前一個數字改一下就可以移動某一個柱子了 移到最前面選1 倚樓聽風姚 題號上面的柱子移到1上面,1上面的柱子移到2上面,以此類推 你用滑鼠點一下柱子中的任何一個 只要點一下哦 然後你在 編輯欄 就會看到類似的公式 series sheet1 shee...