MFC帶文字顯示的進度條

2021-07-14 23:13:51 字數 3202 閱讀 5048

很多時候我們都要在ui上顯示事件的進度資訊,mfc也提供了現成的進度條控制項cprogressctrl,只要在ui上放置乙個cprogressctrl控制項,然後在程式中呼叫setrange和setpos方法就可以顯示進度資訊了。但是mfc自帶的控制項並不是完美的,例如它無法顯示文字進度,如「50%」等,只能通過進度條的位置大致判斷當前的進度,如果需要詳細的進度,通常還要放置乙個static控制項單獨顯示這個百分號的進度。如果要在進度條上顯示文字資訊,就需要自己繪製進度條的ui了,下面我提供乙個簡單單但很實用的方法來滿足要求。效果圖如下:

首先,需要新增乙個mfc類cmyprogress,繼承自cprogressctrl,這樣,我們的進度條控制項就具有了標準工具條的特性。為了能夠反映進度資訊以及繪製進度條,需要在類中新增如下變數:

colorref m_prgscolor; //進度條進度部分顏色

colorref m_freecolor; //進度條後面空餘部分顏色

colorref m_prgstextcolor; //進度部分字型顏色

colorref m_freetextcolor; //空白部分字型顏色

int  m_imin;    //進度條的最小值,通常是0

int  m_imax;    //進度條的最大值,通常是100

int  m_ipos;    //當前的進度

int  m_nbarwidth;  //進度條寬度

然後需要給呼叫者提供操作介面,標準的介面包括setrange、setpos,當然還可以提供諸如設定顏色、設定文字等方法,這個很簡單,就不在這裡給出**了。

int cmyprogress::setpos(int npos)

int noldpos = m_ipos;

m_ipos = npos;

crect rect;

getclientrect(rect);

//這裡先計算要顯示的進度條寬度,避免對同一進度多次繪製視窗

double fraction = (double)(m_ipos - m_imin) / ((double)(m_imax - m_imin));

int nbarwidth = (int) (fraction * rect.width());

if (nbarwidth != m_nbarwidth)

return noldpos;

}void cmyprogress::setrange(int nlower, int nupper)

最後也是最重要的操作是如何繪製進度條,這需要處理wm_paint訊息,通過vs2010或vc等我們可以很方便的新增wm_paint的訊息處理函式,當然我們也可以自己手動在程式新增。首先,在cmyprogress中宣告如下函式:

afx_msg void onpaint();

然後,在cmyprogress類的定義檔案中找到訊息對映begin_message_map,然後新增對映:

begin_message_map(cmyprogress, cprogressctrl)

on_wm_paint()

end_message_map()

onpaint的實現方法如下:

void cmyprogress::onpaint()

cpaintdc dc(this); // device context for painting

// 不為繪圖訊息呼叫 cprogressctrl::onpaint()

//獲取有效的進度條的位置和大小

crect leftrect, rightrect, clientrect;

getclientrect(clientrect);

leftrect = rightrect = clientrect;

//計算顯示進度的比例

double fraction = (double)(m_ipos - m_imin) / ((double)(m_imax - m_imin));

//繪製整個進度條中的有效進度

leftrect.right = leftrect.left + (int)((leftrect.right - leftrect.left) * fraction);

dc.fillsolidrect(leftrect, m_prgscolor);

//繪製剩餘進度

rightrect.left = leftrect.right;

dc.fillsolidrect(rightrect, m_freecolor);

cstring str;

str.format(_t("%d%%"), (int)(fraction*100.0));

//設定文字背景顏色為透明

dc.setbkmode(transparent);

//為了能夠在進度和剩餘進度中顯示不同顏色的字型,需要分別設定兩邊的字型顏色並繪圖

crgn rgn;

rgn.createrectrgn(leftrect.left, leftrect.top, leftrect.right, leftrect.bottom);

dc.selectcliprgn(&rgn);

dc.settextcolor(m_prgstextcolor);

dc.drawtext(str, clientrect, dt_center | dt_vcenter | dt_singleline);

rgn.deleteobject();

rgn.createrectrgn(rightrect.left, rightrect.top, rightrect.right, rightrect.bottom);

dc.selectcliprgn(&rgn);

dc.settextcolor(m_freetextcolor);

dc.drawtext(str, clientrect, dt_center | dt_vcenter | dt_singleline);

//如果在整個進度條中只顯示一種字型顏色,那麼可以直接呼叫

clientrect, dt_center | dt_vcenter | dt_singleline);

}為了在程式中使用進度條,需要在ui上先放置乙個mfc進度條控制項,然後新增並關聯乙個cprogressctrl變數,之後,將cprogressctrl改寫為cmyprogress即可。

本文出自 「jsl_mes」 部落格,請務必保留此出處

3 7 3帶重新整理的文字進度條

注 單行重新整理不能使用idle 需要使用控制台的命令列執行 以windows系統為例 開啟控制台的操作 windows r,輸入cmd即可開啟檔案 程式檔案 python第乙個程式.py 儲存在e盤python的資料夾中 需要的注意的點 1 這裡不是互動式,而是檔案式 如果是用互動式,則直接在控制...

進度條顯示

最近的專案需求中涉及到了顯示進度的圖示,因此就簡單實現了一下,拿出來獻醜了 方法實現很簡單,主要是使用了framelayout的特殊性來實現的疊加顯示的 有次需求的同學們可以參考一下呦3 成功的 失敗的 進行中的 初始化 param attrs private void initview attri...

文字進度條

文字進度條 import time scale 50 print 執行開始 center scale 2,t time.clock for i in range scale 1 a i b scale i c i scale 100 t time.clock print r s format c,a...