进度条是自绘的,就是进度显示没处理好,开始用静态文本Text Control,随着进度增加移动,只是在开始一段背景处理不好(前段是灰白色,后端是蓝色),后又试试TextOut,TextOutA等可惜MFC不支持,要实现的效果如下,各位有什么好方法
------解决思路----------------------
我的自绘进度条进度显示用的TextOutA,没有问题啊。我是基于对话框的MFC。我把源码放着你参考下,当时也是从网上下载的:
DPro.h
#pragma once
// CDPro
class CDPro : public CProgressCtrl
{
DECLARE_DYNAMIC(CDPro)
public:
CDPro();
virtual ~CDPro();
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnPaint();
COLORREF m_ColText;
COLORREF m_ColProgress;
COLORREF m_ColBlank;
CBitmap bitmap;
};
DPro.cpp
// DPro.cpp : 实现文件
//
#include "stdafx.h"
#include "Demo.h"
#include "DPro.h"
#include "DemoDlg.h"
// CDPro
IMPLEMENT_DYNAMIC(CDPro, CProgressCtrl)
CDPro::CDPro(void)
{
m_ColText = RGB(0,0,0);
m_ColProgress = RGB(255,255,255);
m_ColBlank = RGB(0,255,0);
bitmap.LoadBitmap(IDB_D_PRO); //进度条背景
}
CDPro::~CDPro()
{
}
BEGIN_MESSAGE_MAP(CDPro, CProgressCtrl)
ON_WM_PAINT()
END_MESSAGE_MAP()
// CDPro 消息处理程序
void CDPro::OnPaint()
{
PAINTSTRUCT ps;//声明一个绘画区域
CDC *pDC=BeginPaint(&ps);//把绘画区域选入设备上下文并开始
int AdrPos=GetPos();//获取进度条的进度位置
CString StrPos;//声明字符串,用于显示进度条的进度
//StrPos.Format (_T("%d%%"),AdrPos);//把进度位置复制到StrPos
StrPos = CounterPro;
CRect ClientRC;
GetClientRect(ClientRC);//获取客户区矩形
CSize CsText=pDC->GetTextExtent (StrPos);//获取显示StrPos的规模大小
int nX=(ClientRC.Width ()-CsText.cx )/2;//获取显示字符串的X
int nY=(ClientRC.Height ()-CsText.cy )/2;//获取显示字符串的Y
pDC->SetBkMode(TRANSPARENT);//设置背景模式为透明
int nMin,nMax;//声明进度条的最大最小限制
GetRange(nMin,nMax);//获取限制
double Every=(double)ClientRC.Width ()/(nMax-nMin);//获取单位刻度
int Now=Every*AdrPos;//当前长度
CRect LeftRC,RightRC;//声明进度条区域和空白区域
LeftRC=RightRC=ClientRC;
LeftRC.right = Now;//进度条区域
RightRC.left = Now;//空白区域
for (int m=255;m>0;m--)
{
int x;
x=LeftRC.Width()*m/255;
pDC->FillRect(CRect(0,0,x,LeftRC.Height()),&CBrush(RGB(m*AdrPos/nMax,0,(255-m*AdrPos/nMax))));
}
CBrush brush;
brush.CreatePatternBrush(&bitmap);
pDC->FillRect (RightRC,&brush);//画空白区域
pDC->SetTextColor (m_ColText);//设置文本颜色
pDC->TextOutA (nX,nY,StrPos);//写文本
ReleaseDC(pDC);//销毁设备上下文
EndPaint(&ps);//结束绘画区域绘画
}
------解决思路----------------------
使用DrawText函数,有个DT_VCENTER,指定文本在垂直方向正中间现实,DT_RIGHT,指定文本在水平方向右边显示,这样就不必计算TextOut的x和y了,