当前位置: 代码迷 >> VC/MFC >> MFC 进度条上显示进度(如20%),用什么议案好
  详细解决方案

MFC 进度条上显示进度(如20%),用什么议案好

热度:157   发布时间:2016-05-02 03:49:32.0
MFC 进度条上显示进度(如20%),用什么方案好
进度条是自绘的,就是进度显示没处理好,开始用静态文本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了,
  相关解决方案