自绘一个进度条需要重写OnPaint函数,说白了就是不让进度条的自绘起作用,在OnPaint里面自己绘制(如果要按这个说法来说其实也并不需要进度条,用编辑框自绘也可以)
void CMyProgressCtrl::OnPaint()
{
CPaintDC PaintDC(this);
COLORREF m_colFore = RGB(0, 0, 255);
COLORREF m_colBk = RGB(255, 255, 255);
int nMin, nMax;
GetRange(nMin, nMax);
int nPos = GetPos();
CRect LeftRect, RightRect, ClientRect;
GetClientRect(ClientRect);
double Fraction = (double)(nPos - nMin) / ((double)(nMax - nMin));
LeftRect = RightRect = ClientRect;
LeftRect.right = LeftRect.left + (int)((LeftRect.right - LeftRect.left)*Fraction);
PaintDC.FillSolidRect(LeftRect, m_colFore);
RightRect.left = LeftRect.right;
PaintDC.FillSolidRect(RightRect, m_colBk);
CString str;
str = m_strText;
PaintDC.SetBkMode(TRANSPARENT);
CRgn rgn;
rgn.CreateRectRgn(LeftRect.left, LeftRect.top, LeftRect.right, LeftRect.bottom);
PaintDC.SelectClipRgn(&rgn);
PaintDC.SetTextColor(m_colBk);
PaintDC.DrawText(str, ClientRect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
rgn.DeleteObject();
rgn.CreateRectRgn(RightRect.left, RightRect.top, RightRect.right, RightRect.bottom);
PaintDC.SelectClipRgn(&rgn);
PaintDC.SetTextColor(m_colFore);
PaintDC.DrawText(str, ClientRect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
在写这里的时候遇到了一个问题,顺便记录一下:
在进入OnPaint函数之后,退出之前,一定要让它经历一次CPaintDC PaintDC(this)代码,否则就会一直响应WM_PAINT消息,把消息队列阻塞,这个时候会出现界面涉及到消息传输操作的全部停滞,有一种卡死的效果。