wxWidgets下显示下载进度条

来源:互联网 发布:手机淘宝装修日记 编辑:程序博客网 时间:2024/06/05 04:39
class myApp : public wxApp{
public:
bool OnInit(void);
};
DECLARE_APP(myApp);
IMPLEMENT_APP(myApp);




void LoadBarProgress(unsigned curr_val, unsigned max_val, unsigned bar_width = 20)
{
if(dialog !=NULL){
dialog->Update(curr_val);
}else{
dialog = new wxProgressDialog(wxT("下载进度"), wxT("正在下载..."), 100, NULL, wxPD_AUTO_HIDE|wxPD_APP_MODAL );
dialog->Update(curr_val);
}

}

class CallbackHandler : public IBindStatusCallback
{
private:
int m_percentLast;


public:
CallbackHandler() : m_percentLast(0)
{
}


HRESULT STDMETHODCALLTYPE
QueryInterface(REFIID riid, void** ppvObject)
{


if(    IsEqualIID(IID_IBindStatusCallback, riid)
|| IsEqualIID(IID_IUnknown, riid) )
{
*ppvObject = reinterpret_cast<void*>(this);
return S_OK;
}


return E_NOINTERFACE;
}


ULONG STDMETHODCALLTYPE
AddRef()
{
return 2UL;
}


ULONG STDMETHODCALLTYPE
Release()
{
return 1UL;
}


// IBindStatusCallback


HRESULT STDMETHODCALLTYPE
OnStartBinding(DWORD     /*dwReserved*/,
IBinding* /*pib*/)
{
return E_NOTIMPL;
}


HRESULT STDMETHODCALLTYPE
GetPriority(LONG* /*pnPriority*/)
{
return E_NOTIMPL;
}


HRESULT STDMETHODCALLTYPE
OnLowResource(DWORD /*reserved*/)
{
return E_NOTIMPL;
}


HRESULT STDMETHODCALLTYPE
OnProgress(ULONG   ulProgress,
ULONG   ulProgressMax,
ULONG   ulStatusCode,
LPCWSTR /*szStatusText*/)
{
switch(ulStatusCode)
{
case BINDSTATUS_FINDINGRESOURCE:
tcout << _T("Finding resource...") << endl;
break;
case BINDSTATUS_CONNECTING:
tcout << _T("Connecting...") << endl;
break;
case BINDSTATUS_SENDINGREQUEST:
tcout << _T("Sending request...") << endl;
break;
case BINDSTATUS_MIMETYPEAVAILABLE:
tcout << _T("Mime type available") << endl;
break;
case BINDSTATUS_CACHEFILENAMEAVAILABLE:
tcout << _T("Cache filename available") << endl;
break;
case BINDSTATUS_BEGINDOWNLOADDATA:
tcout << _T("Begin download") << endl;
break;
case BINDSTATUS_DOWNLOADINGDATA:
case BINDSTATUS_ENDDOWNLOADDATA:
{
tcout<<_T("ulProgress::")<<ulProgress << _T("   ulProgressMax::")<<ulProgressMax <<endl;
int percent = (int)(100.0 * static_cast<double>(ulProgress)
/ static_cast<double>(ulProgressMax));
if(m_percentLast < percent)
{
LoadBarProgress(percent, 100);
m_percentLast = percent;
}
if(ulStatusCode == BINDSTATUS_ENDDOWNLOADDATA)
{
tcout << endl << _T("End download") << endl;
}
}
break;


default:
{
tcout << _T("Status code : ") << ulStatusCode << endl;
}
}
// The download can be cancelled by returning E_ABORT here
// of from any other of the methods.
return S_OK;
}


HRESULT STDMETHODCALLTYPE
OnStopBinding(HRESULT /*hresult*/,
LPCWSTR /*szError*/)
{
return E_NOTIMPL;
}


HRESULT STDMETHODCALLTYPE
GetBindInfo(DWORD*    /*grfBINDF*/,
BINDINFO* /*pbindinfo*/)
{
return E_NOTIMPL;
}


HRESULT STDMETHODCALLTYPE
OnDataAvailable(DWORD      /*grfBSCF*/,
DWORD      /*dwSize*/,
FORMATETC* /*pformatetc*/,
STGMEDIUM* /*pstgmed*/)
{
return E_NOTIMPL;
}


HRESULT STDMETHODCALLTYPE
OnObjectAvailable(REFIID    /*riid*/,
IUnknown* /*punk*/)
{
return E_NOTIMPL;
}
};


bool myApp::OnInit(){

if(gDEBUG_OUTPUT){
showWin32Console();
}
if ( !wxApp::OnInit() )
return false;
frame = new wxFrame(NULL, wxID_ANY, wxT("update"));
frame->Show(false);


URLDownloadToFile(NULL, stemp.c_str(),stempinstall.c_str(),0, pBindStatusCallback);

}


0 0