📄 urlfiledlg.cpp
字号:
// urlfileDlg.cpp : implementation file
// Written by chensu
//
#include "stdafx.h"
#include "urlfile.h"
#include "urlfileDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//*****************************************************************************
//-----------------------------------------------------------------------------
#define WM_USER_ENDDOWNLOAD (WM_USER + 1)
#define WM_USER_DISPLAYSTATUS (WM_USER + 2)
//-----------------------------------------------------------------------------
//*****************************************************************************
//*****************************************************************************
//-----------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//-----------------------------------------------------------------------------
//*****************************************************************************
//*****************************************************************************
//-----------------------------------------------------------------------------
CBSCallbackImpl::CBSCallbackImpl(HWND hWnd, HANDLE hEventStop)
{
m_hWnd = hWnd; // the window handle to display status
m_hEventStop = hEventStop; // the event object to signal to stop
m_ulObjRefCount = 1;
}
//-----------------------------------------------------------------------------
// IUnknown
STDMETHODIMP CBSCallbackImpl::QueryInterface(REFIID riid, void **ppvObject)
{
TRACE(_T("IUnknown::QueryInterface\n"));
*ppvObject = NULL;
// IUnknown
if (::IsEqualIID(riid, __uuidof(IUnknown)))
{
TRACE(_T("IUnknown::QueryInterface(IUnknown)\n"));
*ppvObject = this;
}
// IBindStatusCallback
else if (::IsEqualIID(riid, __uuidof(IBindStatusCallback)))
{
TRACE(_T("IUnknown::QueryInterface(IBindStatusCallback)\n"));
*ppvObject = static_cast<IBindStatusCallback *>(this);
}
if (*ppvObject)
{
(*reinterpret_cast<LPUNKNOWN *>(ppvObject))->AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
//-----------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CBSCallbackImpl::AddRef()
{
TRACE(_T("IUnknown::AddRef\n"));
return ++m_ulObjRefCount;
}
//-----------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CBSCallbackImpl::Release()
{
TRACE(_T("IUnknown::Release\n"));
return --m_ulObjRefCount;
}
//-----------------------------------------------------------------------------
// IBindStatusCallback
STDMETHODIMP CBSCallbackImpl::OnStartBinding(DWORD, IBinding *)
{
TRACE(_T("IBindStatusCallback::OnStartBinding\n"));
return S_OK;
}
//-----------------------------------------------------------------------------
STDMETHODIMP CBSCallbackImpl::GetPriority(LONG *)
{
TRACE(_T("IBindStatusCallback::GetPriority\n"));
return E_NOTIMPL;
}
//-----------------------------------------------------------------------------
STDMETHODIMP CBSCallbackImpl::OnLowResource(DWORD)
{
TRACE(_T("IBindStatusCallback::OnLowResource\n"));
return S_OK;
}
//-----------------------------------------------------------------------------
STDMETHODIMP CBSCallbackImpl::OnProgress(ULONG ulProgress,
ULONG ulProgressMax,
ULONG ulStatusCode,
LPCWSTR szStatusText)
{
static const LPCTSTR plpszStatus[] =
{
_T("BINDSTATUS_FINDINGRESOURCE"), // 1
_T("BINDSTATUS_CONNECTING"),
_T("BINDSTATUS_REDIRECTING"),
_T("BINDSTATUS_BEGINDOWNLOADDATA"),
_T("BINDSTATUS_DOWNLOADINGDATA"),
_T("BINDSTATUS_ENDDOWNLOADDATA"),
_T("BINDSTATUS_BEGINDOWNLOADCOMPONENTS"),
_T("BINDSTATUS_INSTALLINGCOMPONENTS"),
_T("BINDSTATUS_ENDDOWNLOADCOMPONENTS"),
_T("BINDSTATUS_USINGCACHEDCOPY"),
_T("BINDSTATUS_SENDINGREQUEST"),
_T("BINDSTATUS_CLASSIDAVAILABLE"),
_T("BINDSTATUS_MIMETYPEAVAILABLE"),
_T("BINDSTATUS_CACHEFILENAMEAVAILABLE"),
_T("BINDSTATUS_BEGINSYNCOPERATION"),
_T("BINDSTATUS_ENDSYNCOPERATION"),
_T("BINDSTATUS_BEGINUPLOADDATA"),
_T("BINDSTATUS_UPLOADINGDATA"),
_T("BINDSTATUS_ENDUPLOADINGDATA"),
_T("BINDSTATUS_PROTOCOLCLASSID"),
_T("BINDSTATUS_ENCODING"),
_T("BINDSTATUS_VERFIEDMIMETYPEAVAILABLE"),
_T("BINDSTATUS_CLASSINSTALLLOCATION"),
_T("BINDSTATUS_DECODING"),
_T("???") // unexpected
};
TRACE(_T("IBindStatusCallback::OnProgress\n"));
TRACE(_T("ulProgress: %lu, ulProgressMax: %lu\n"),
ulProgress, ulProgressMax);
TRACE(_T("ulStatusCode: %lu "), ulStatusCode);
if (ulStatusCode < BINDSTATUS_FINDINGRESOURCE ||
ulStatusCode > BINDSTATUS_DECODING)
ulStatusCode = BINDSTATUS_DECODING + 1;
TRACE(_T("(%s), szStatusText: %ls\n"),
plpszStatus[ulStatusCode - BINDSTATUS_FINDINGRESOURCE],
szStatusText);
if (m_hWnd != NULL)
{
// inform the dialog box to display current status,
// don't use PostMessage
CUrlFileDlg::DOWNLOADSTATUS downloadStatus =
{ ulProgress, ulProgressMax, ulStatusCode, szStatusText };
::SendMessage(m_hWnd, WM_USER_DISPLAYSTATUS,
0, reinterpret_cast<LPARAM>(&downloadStatus));
}
if (m_hEventStop != NULL)
{
if (::WaitForSingleObject(m_hEventStop, 0) == WAIT_OBJECT_0)
{
TRACE(_T("Canceled.\n"));
::SendMessage(m_hWnd, WM_USER_DISPLAYSTATUS, 0, NULL);
return E_ABORT; // canceled by the user
}
}
return S_OK;
}
//-----------------------------------------------------------------------------
STDMETHODIMP CBSCallbackImpl::OnStopBinding(HRESULT, LPCWSTR)
{
TRACE(_T("IBindStatusCallback::OnStopBinding\n"));
return S_OK;
}
//-----------------------------------------------------------------------------
STDMETHODIMP CBSCallbackImpl::GetBindInfo(DWORD *, BINDINFO *)
{
TRACE(_T("IBindStatusCallback::GetBindInfo\n"));
return S_OK;
}
//-----------------------------------------------------------------------------
STDMETHODIMP CBSCallbackImpl::OnDataAvailable(DWORD, DWORD,
FORMATETC *, STGMEDIUM *)
{
TRACE(_T("IBindStatusCallback::OnDataAvailable\n"));
return S_OK;
}
//-----------------------------------------------------------------------------
STDMETHODIMP CBSCallbackImpl::OnObjectAvailable(REFIID, IUnknown *)
{
TRACE(_T("IBindStatusCallback::OnObjectAvailable\n"));
return S_OK;
}
//-----------------------------------------------------------------------------
//*****************************************************************************
//*****************************************************************************
//-----------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////
// CUrlFileDlg dialog
CUrlFileDlg::CUrlFileDlg(CWnd* pParent /*=NULL*/)
: CDialog(CUrlFileDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CUrlFileDlg)
m_strURL = _T("");
m_strProgress = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_pDownloadThread = NULL;
}
void CUrlFileDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CUrlFileDlg)
DDX_Control(pDX, IDOK, m_btnDownloadStop);
DDX_Control(pDX, IDCANCEL, m_btnExit);
DDX_Control(pDX, IDC_URL, m_editURL);
DDX_Text(pDX, IDC_URL, m_strURL);
DDX_Control(pDX, IDC_PROGRESS, m_editProgress);
DDX_Text(pDX, IDC_PROGRESS, m_strProgress);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CUrlFileDlg, CDialog)
//{{AFX_MSG_MAP(CUrlFileDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_USER_ENDDOWNLOAD, OnEndDownload)
ON_MESSAGE(WM_USER_DISPLAYSTATUS, OnDisplayStatus)
ON_EN_MAXTEXT(IDC_PROGRESS, OnMaxtextProgress)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CUrlFileDlg message handlers
BOOL CUrlFileDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -