很多時候我們都要在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...