读书人

进度条的使用解决办法

发布时间: 2013-09-12 22:07:00 作者: rapoo

进度条的使用
int i=0;
while(n<100000)
{
i++;
}
用进度条实时显示循环进行的长度,求大神指教! 进度条 ProgressBar
[解决办法]

int nMin;
int nMax;
CProgressCtrl::GetRange(nMin,nMax);
for(int i=nMin;i<nMax;i++)
{
CProgressCtrl::SetPos(i);
DoEvents();
Sleep(50);
}
//DoEvents 会将控制权传给操作系统。
//可以让程序在执行操作的同时仍可以处理其他事件,用这个方法可以有效地解决画面无法刷新的问题。
void DoEvents()
{
MSG msg;
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
DispatchMessage(&msg);
TranslateMessage(&msg);
}
}

[解决办法]
我一般用多线程加消息完成进度条功能

[解决办法]
CProgressCtrl::SetPos(i * 100 / nMax);
[解决办法]


//文件名:MyStatusBar.cpp CMyStatusBar类的实现文件

//文件名:MyStatusBar.h CMyStatusBar类的头文件
#pragma once
class CMyStatusBar : public CStatusBar
{
DECLARE_DYNAMIC(CMyStatusBar)
CProgressCtrl m_MyProgressCtrl;
public:
CMyStatusBar();
virtual ~CMyStatusBar();
CProgressCtrl &GetProgressCtrl(){return m_MyProgressCtrl;};
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnSize(UINT nType, int cx, int cy);
};

//cpp文件
#include "stdafx.h"
#include "Test.h"
#include "MyStatusBar.h"
IMPLEMENT_DYNAMIC(CMyStatusBar, CStatusBar)
CMyStatusBar::CMyStatusBar()
{
}
CMyStatusBar::~CMyStatusBar()
{
}
BEGIN_MESSAGE_MAP(CMyStatusBar, CStatusBar)
ON_WM_CREATE()
ON_WM_SIZE()
END_MESSAGE_MAP()
int CMyStatusBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CStatusBar::OnCreate(lpCreateStruct) == -1)
return -1;
CRect rect(0,0,0,0);
m_MyProgressCtrl.Create(WS_CHILD
------解决方案--------------------


WS_VISIBLE,rect,this,IDC_MYPROGRESS);
return 0;
}

void CMyStatusBar::OnSize(UINT nType, int cx, int cy)
{
CStatusBar::OnSize(nType, cx, cy);
UINT inx;
CRect rect;
inx=CommandToIndex(ID_INDICATOR_MYPROGRESS);
GetItemRect(inx,&rect);
m_MyProgressCtrl.MoveWindow(rect);
}

使用

void CMainFrame::OnTimer(UINT nIDEvent)
{
int nLower,nUpper;
m_wndStatusBar.m_MyProgressCtrl.GetRange(nLower,nUpper);
if(m_Pos>=nUpper)
m_Pos=0;
m_wndStatusBar.m_MyProgressCtrl.SetPos(m_Pos);
m_Pos+=2;
CFrameWnd::OnTimer(nIDEvent);
}

读书人网 >VC/MFC

热点推荐