📄 wnddownloads.cpp
字号:
//
// WndDownloads.cpp
//
// Copyright (c) Shareaza Development Team, 2002-2004.
// This file is part of SHAREAZA (www.shareaza.com)
//
// Shareaza is free software; you can redistribute it
// and/or modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
//
// Shareaza is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Shareaza; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
#include "StdAfx.h"
#include "Shareaza.h"
#include "Settings.h"
#include "Transfers.h"
#include "Downloads.h"
#include "Download.h"
#include "DownloadSource.h"
#include "DownloadTransfer.h"
#include "DownloadGroups.h"
#include "Library.h"
#include "LibraryMaps.h"
#include "SharedFile.h"
#include "FileExecutor.h"
#include "ShareazaURL.h"
#include "SHA.h"
#include "ChatWindows.h"
#include "WindowManager.h"
#include "WndDownloads.h"
#include "WndUploads.h"
#include "WndBrowseHost.h"
#include "DlgDownload.h"
#include "DlgDownloadEdit.h"
#include "DlgSettingsManager.h"
#include "DlgTorrentTracker.h"
#include "DlgDeleteFile.h"
#include "DlgFilePropertiesSheet.h"
#include "DlgURLCopy.h"
#include "DlgHelp.h"
#include "Skin.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_SERIAL(CDownloadsWnd, CPanelWnd, 0)
BEGIN_MESSAGE_MAP(CDownloadsWnd, CPanelWnd)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_SIZE()
ON_WM_TIMER()
ON_WM_CONTEXTMENU()
ON_WM_MEASUREITEM()
ON_WM_DRAWITEM()
ON_WM_MDIACTIVATE()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_RBUTTONDOWN()
ON_WM_KEYDOWN()
ON_WM_KEYUP()
ON_WM_SETCURSOR()
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_RESUME, OnUpdateDownloadsResume)
ON_COMMAND(ID_DOWNLOADS_RESUME, OnDownloadsResume)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_PAUSE, OnUpdateDownloadsPause)
ON_COMMAND(ID_DOWNLOADS_PAUSE, OnDownloadsPause)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_CLEAR, OnUpdateDownloadsClear)
ON_COMMAND(ID_DOWNLOADS_CLEAR, OnDownloadsClear)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_LAUNCH, OnUpdateDownloadsLaunch)
ON_COMMAND(ID_DOWNLOADS_LAUNCH, OnDownloadsLaunch)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_SOURCES, OnUpdateDownloadsSources)
ON_COMMAND(ID_DOWNLOADS_SOURCES, OnDownloadsSources)
ON_COMMAND(ID_DOWNLOADS_CLEAR_COMPLETED, OnDownloadsClearCompleted)
ON_COMMAND(ID_DOWNLOADS_CLEAR_PAUSED, OnDownloadsClearPaused)
ON_UPDATE_COMMAND_UI(ID_TRANSFERS_DISCONNECT, OnUpdateTransfersDisconnect)
ON_COMMAND(ID_TRANSFERS_DISCONNECT, OnTransfersDisconnect)
ON_UPDATE_COMMAND_UI(ID_TRANSFERS_FORGET, OnUpdateTransfersForget)
ON_COMMAND(ID_TRANSFERS_FORGET, OnTransfersForget)
ON_UPDATE_COMMAND_UI(ID_TRANSFERS_CHAT, OnUpdateTransfersChat)
ON_COMMAND(ID_TRANSFERS_CHAT, OnTransfersChat)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_URL, OnUpdateDownloadsUrl)
ON_COMMAND(ID_DOWNLOADS_URL, OnDownloadsUrl)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_ENQUEUE, OnUpdateDownloadsEnqueue)
ON_COMMAND(ID_DOWNLOADS_ENQUEUE, OnDownloadsEnqueue)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_AUTO_CLEAR, OnUpdateDownloadsAutoClear)
ON_COMMAND(ID_DOWNLOADS_AUTO_CLEAR, OnDownloadsAutoClear)
ON_UPDATE_COMMAND_UI(ID_TRANSFERS_CONNECT, OnUpdateTransfersConnect)
ON_COMMAND(ID_TRANSFERS_CONNECT, OnTransfersConnect)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_SHOW_SOURCES, OnUpdateDownloadsShowSources)
ON_COMMAND(ID_DOWNLOADS_SHOW_SOURCES, OnDownloadsShowSources)
ON_UPDATE_COMMAND_UI(ID_BROWSE_LAUNCH, OnUpdateBrowseLaunch)
ON_COMMAND(ID_BROWSE_LAUNCH, OnBrowseLaunch)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_BOOST, OnUpdateDownloadsBoost)
ON_COMMAND(ID_DOWNLOADS_BOOST, OnDownloadsBoost)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_LAUNCH_COPY, OnUpdateDownloadsLaunchCopy)
ON_COMMAND(ID_DOWNLOADS_LAUNCH_COPY, OnDownloadsLaunchCopy)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_MONITOR, OnUpdateDownloadsMonitor)
ON_COMMAND(ID_DOWNLOADS_MONITOR, OnDownloadsMonitor)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_FILE_DELETE, OnUpdateDownloadsFileDelete)
ON_COMMAND(ID_DOWNLOADS_FILE_DELETE, OnDownloadsFileDelete)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_RATE, OnUpdateDownloadsRate)
ON_COMMAND(ID_DOWNLOADS_RATE, OnDownloadsRate)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_MOVE_UP, OnUpdateDownloadsMoveUp)
ON_COMMAND(ID_DOWNLOADS_MOVE_UP, OnDownloadsMoveUp)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_MOVE_DOWN, OnUpdateDownloadsMoveDown)
ON_COMMAND(ID_DOWNLOADS_MOVE_DOWN, OnDownloadsMoveDown)
ON_COMMAND(ID_DOWNLOADS_SETTINGS, OnDownloadsSettings)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_FILTER_ALL, OnUpdateDownloadsFilterAll)
ON_COMMAND(ID_DOWNLOADS_FILTER_ALL, OnDownloadsFilterAll)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_FILTER_ACTIVE, OnUpdateDownloadsFilterActive)
ON_COMMAND(ID_DOWNLOADS_FILTER_ACTIVE, OnDownloadsFilterActive)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_FILTER_QUEUED, OnUpdateDownloadsFilterQueued)
ON_COMMAND(ID_DOWNLOADS_FILTER_QUEUED, OnDownloadsFilterQueued)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_FILTER_SOURCES, OnUpdateDownloadsFilterSources)
ON_COMMAND(ID_DOWNLOADS_FILTER_SOURCES, OnDownloadsFilterSources)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_FILTER_PAUSED, OnUpdateDownloadsFilterPaused)
ON_COMMAND(ID_DOWNLOADS_FILTER_PAUSED, OnDownloadsFilterPaused)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_LAUNCH_COMPLETE, OnUpdateDownloadsLaunchComplete)
ON_COMMAND(ID_DOWNLOADS_LAUNCH_COMPLETE, OnDownloadsLaunchComplete)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_SHARE, OnUpdateDownloadsShare)
ON_COMMAND(ID_DOWNLOADS_SHARE, OnDownloadsShare)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_COPY, OnUpdateDownloadsCopy)
ON_COMMAND(ID_DOWNLOADS_COPY, OnDownloadsCopy)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_TORRENT_INFO, OnUpdateDownloadsTorrentInfo)
ON_COMMAND(ID_DOWNLOADS_TORRENT_INFO, OnDownloadsTorrentInfo)
ON_UPDATE_COMMAND_UI(ID_DOWNLOAD_GROUP_SHOW, OnUpdateDownloadGroupShow)
ON_COMMAND(ID_DOWNLOAD_GROUP_SHOW, OnDownloadGroupShow)
ON_COMMAND(ID_DOWNLOADS_HELP, OnDownloadsHelp)
ON_COMMAND(ID_DOWNLOADS_FILTER_MENU, OnDownloadsFilterMenu)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_CLEAR_INCOMPLETE, OnUpdateDownloadsClearIncomplete)
ON_COMMAND(ID_DOWNLOADS_CLEAR_INCOMPLETE, OnDownloadsClearIncomplete)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_CLEAR_COMPLETE, OnUpdateDownloadsClearComplete)
ON_COMMAND(ID_DOWNLOADS_CLEAR_COMPLETE, OnDownloadsClearComplete)
ON_UPDATE_COMMAND_UI(ID_DOWNLOADS_EDIT, OnUpdateDownloadsEdit)
ON_COMMAND(ID_DOWNLOADS_EDIT, OnDownloadsEdit)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDownloadsWnd construction
CDownloadsWnd::CDownloadsWnd() : CPanelWnd( TRUE, TRUE )
{
Create( IDR_DOWNLOADSFRAME );
}
CDownloadsWnd::~CDownloadsWnd()
{
}
/////////////////////////////////////////////////////////////////////////////
// CDownloadsWnd system message handlers
int CDownloadsWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if ( CPanelWnd::OnCreate( lpCreateStruct ) == -1 ) return -1;
if ( ! m_wndTabBar.Create( this, WS_CHILD|CBRS_TOP, AFX_IDW_TOOLBAR+1 ) ) return -1;
m_wndTabBar.SetBarStyle( m_wndTabBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_BORDER_BOTTOM );
if ( ! m_wndToolBar.Create( this, WS_CHILD|WS_VISIBLE|CBRS_NOALIGN, AFX_IDW_TOOLBAR ) ) return -1;
m_wndToolBar.SetBarStyle( m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_BORDER_TOP );
m_wndToolBar.SetSyncObject( &Transfers.m_pSection );
m_wndDownloads.Create( this, IDC_DOWNLOADS );
LoadState( NULL, TRUE );
SetTimer( 2, 2000, NULL );
PostMessage( WM_TIMER, 2 );
SetTimer( 4, 10000, NULL );
PostMessage( WM_TIMER, 4 );
m_pDragList = NULL;
m_pDragImage = NULL;
m_hCursMove = AfxGetApp()->LoadCursor( IDC_MOVE );
m_hCursCopy = AfxGetApp()->LoadCursor( IDC_COPY );
m_tSel = 0;
OnSkinChange();
return 0;
}
void CDownloadsWnd::OnDestroy()
{
CancelDrag();
KillTimer( 4 );
KillTimer( 2 );
SaveState();
CPanelWnd::OnDestroy();
}
void CDownloadsWnd::OnSkinChange()
{
CPanelWnd::OnSkinChange();
Skin.CreateToolBar( _T("CDownloadsWnd"), &m_wndToolBar );
}
void CDownloadsWnd::Update()
{
int nCookie = 0;
if ( Settings.General.GUIMode != GUI_BASIC && Settings.Downloads.ShowGroups )
{
nCookie = (int)GetTickCount();
m_wndTabBar.Update( nCookie );
}
m_wndDownloads.Update( nCookie );
}
BOOL CDownloadsWnd::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
if ( m_wndToolBar.m_hWnd )
{
if ( m_wndToolBar.OnCmdMsg( nID, nCode, pExtra, pHandlerInfo ) ) return TRUE;
}
if ( m_wndTabBar.m_hWnd )
{
if ( m_wndTabBar.OnCmdMsg( nID, nCode, pExtra, pHandlerInfo ) ) return TRUE;
}
return CPanelWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
void CDownloadsWnd::OnSize(UINT nType, int cx, int cy)
{
CPanelWnd::OnSize( nType, cx, cy );
CRect rc( 0, 0, cx, cy - 28 );
BOOL bTabs = ( Settings.General.GUIMode != GUI_BASIC ) && Settings.Downloads.ShowGroups;
if ( bTabs )
rc.top += 24;
else
m_wndTabBar.ShowWindow( SW_HIDE );
HDWP hPos = BeginDeferWindowPos( bTabs ? 3 : 2 );
DeferWindowPos( hPos, m_wndDownloads, NULL,
rc.left, rc.top, rc.Width(), rc.Height(), SWP_NOZORDER|SWP_SHOWWINDOW );
if ( bTabs ) DeferWindowPos( hPos, m_wndTabBar, NULL,
rc.left, 0, rc.Width(), 24, SWP_NOZORDER|SWP_SHOWWINDOW );
DeferWindowPos( hPos, m_wndToolBar, NULL,
rc.left, rc.bottom, rc.Width(), 28, SWP_NOZORDER );
EndDeferWindowPos( hPos );
}
void CDownloadsWnd::OnTimer(UINT nIDEvent)
{
if ( nIDEvent == 5 ) m_tSel = 0;
if ( nIDEvent == 4 && Settings.Downloads.AutoClear )
{
CSingleLock pLock( &Transfers.m_pSection );
if ( ! pLock.Lock( 10 ) ) return;
DWORD tNow = GetTickCount();
for ( POSITION pos = Downloads.GetIterator() ; pos ; )
{
CDownload* pDownload = Downloads.GetNext( pos );
if ( pDownload->IsCompleted() &&
pDownload->IsPreviewVisible() == FALSE &&
pDownload->m_pTorrent.IsAvailable() == FALSE &&
tNow - pDownload->m_tCompleted > Settings.Downloads.ClearDelay )
{
pDownload->Remove();
}
}
}
if ( nIDEvent != 1 && m_pDragList == NULL && IsPartiallyVisible() ) Update();
}
void CDownloadsWnd::OnMDIActivate(BOOL bActivate, CWnd* pActivateWnd, CWnd* pDeactivateWnd)
{
CPanelWnd::OnMDIActivate( bActivate, pActivateWnd, pDeactivateWnd );
if ( bActivate )
{
Update();
m_wndDownloads.SetFocus();
}
}
void CDownloadsWnd::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
AfxGetMainWnd()->SendMessage( WM_MEASUREITEM, nIDCtl, (LPARAM)lpMeasureItemStruct );
}
void CDownloadsWnd::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
AfxGetMainWnd()->SendMessage( WM_DRAWITEM, nIDCtl, (LPARAM)lpDrawItemStruct );
}
void CDownloadsWnd::OnContextMenu(CWnd* pWnd, CPoint point)
{
CSingleLock pLock( &Transfers.m_pSection, TRUE );
CDownloadSource* pSource;
CDownload* pDownload;
CPoint ptLocal( point );
m_wndDownloads.ScreenToClient( &ptLocal );
m_tSel = 0;
if ( m_wndDownloads.HitTest( ptLocal, &pDownload, &pSource, NULL, NULL ) )
{
if ( pSource != NULL )
{
pLock.Unlock();
TrackPopupMenu( _T("CDownloadsWnd.Source"), point, ID_TRANSFERS_CONNECT );
return;
}
else if ( pDownload->IsCompleted() )
{
pLock.Unlock();
TrackPopupMenu( _T("CDownloadsWnd.Completed"), point, ID_DOWNLOADS_LAUNCH );
return;
}
}
pLock.Unlock();
TrackPopupMenu( _T("CDownloadsWnd.Download"), point,
Settings.General.GUIMode == GUI_BASIC ? ID_DOWNLOADS_LAUNCH_COPY : ID_DOWNLOADS_LAUNCH );
}
BOOL CDownloadsWnd::PreTranslateMessage(MSG* pMsg)
{
if ( pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_TAB )
{
GetManager()->Open( RUNTIME_CLASS(CUploadsWnd) );
return TRUE;
}
return CPanelWnd::PreTranslateMessage( pMsg );
}
BOOL CDownloadsWnd::Select(CDownload* pSelect)
{
CSingleLock pLock( &Transfers.m_pSection, TRUE );
BOOL bFound = FALSE;
for ( POSITION pos = Downloads.GetIterator() ; pos ; )
{
CDownload* pDownload = Downloads.GetNext( pos );
if ( pDownload == pSelect )
{
pDownload->m_bSelected = TRUE;
bFound = TRUE;
}
else
{
pDownload->m_bSelected = FALSE;
}
for ( CDownloadSource* pSource = pDownload->GetFirstSource() ; pSource != NULL ; pSource = pSource->m_pNext )
{
pSource->m_bSelected = FALSE;
}
}
Invalidate();
m_tSel = 0;
return bFound;
}
void CDownloadsWnd::Prepare()
{
DWORD tNow = GetTickCount();
if ( tNow - m_tSel < 250 ) return;
m_tSel = tNow;
m_bSelAny = m_bSelDownload = m_bSelSource = m_bSelPaused = FALSE;
m_bSelNotPausedOrMoving = m_bSelNoPreview = m_bSelNotCompleteAndNoPreview = FALSE;
m_bSelCompletedAndNoPreview = m_bSelStartedAndNotMoving = m_bSelCompleted = FALSE;
m_bSelNotMoving = m_bSelBoostable = m_bSelSHA1orED2K = FALSE;
m_bSelTorrent = m_bSelIdleSource = m_bSelActiveSource = FALSE;
m_bSelHttpSource = m_bSelShareState = FALSE;
m_bSelShareConsistent = TRUE;
CSingleLock pLock( &Transfers.m_pSection, TRUE );
BOOL bFirstShare = TRUE;
for ( POSITION pos = Downloads.GetIterator() ; pos ; )
{
CDownload* pDownload = Downloads.GetNext( pos );
if ( pDownload->m_bSelected )
{
m_bSelAny = TRUE;
m_bSelDownload = TRUE;
if ( pDownload->IsCompleted() )
m_bSelCompleted = TRUE;
if ( ! pDownload->IsMoving() )
m_bSelNotMoving = TRUE;
if ( ! pDownload->IsBoosted() )
m_bSelBoostable = TRUE;
if ( pDownload->m_bSHA1 || pDownload->m_bED2K )
m_bSelSHA1orED2K = TRUE;
if ( pDownload->m_pTorrent.IsAvailable() )
m_bSelTorrent = TRUE;
if ( pDownload->IsPaused() )
m_bSelPaused = TRUE;
else if ( ! pDownload->IsMoving() )
m_bSelNotPausedOrMoving = TRUE;
if ( ! pDownload->IsPreviewVisible() )
{
m_bSelNoPreview = TRUE;
if ( pDownload->IsCompleted() )
m_bSelCompletedAndNoPreview = TRUE;
else
m_bSelNotCompleteAndNoPreview = TRUE;
}
if ( pDownload->IsStarted() && ! pDownload->IsMoving() )
m_bSelStartedAndNotMoving = TRUE;
if ( bFirstShare )
{
m_bSelShareState = pDownload->IsShared();
bFirstShare = FALSE;
}
else if ( m_bSelShareState != pDownload->IsShared() )
{
m_bSelShareState = FALSE;
m_bSelShareConsistent = FALSE;
}
}
for ( CDownloadSource* pSource = pDownload->GetFirstSource() ; pSource ; pSource = pSource->m_pNext )
{
if ( pSource->m_bSelected )
{
m_bSelAny = TRUE;
m_bSelSource = TRUE;
if ( pSource->m_pTransfer == NULL )
m_bSelIdleSource = TRUE;
else
m_bSelActiveSource = TRUE;
if ( pSource->m_nProtocol == PROTOCOL_HTTP ) m_bSelHttpSource = TRUE;
}
}
}
}
/////////////////////////////////////////////////////////////////////////////
// CDownloadsWnd command handlers
void CDownloadsWnd::OnUpdateDownloadsResume(CCmdUI* pCmdUI)
{
Prepare();
if ( CCoolBarItem* pcCmdUI = CCoolBarItem::FromCmdUI( pCmdUI ) )
pcCmdUI->Show( m_bSelPaused );
pCmdUI->Enable( m_bSelPaused );
}
void CDownloadsWnd::OnDownloadsResume()
{
CSingleLock pLock( &Transfers.m_pSection, TRUE );
for ( POSITION pos = Downloads.GetIterator() ; pos ; )
{
CDownload* pDownload = Downloads.GetNext( pos );
if ( pDownload->m_bSelected )
{
pDownload->Resume();
}
}
Update();
}
void CDownloadsWnd::OnUpdateDownloadsPause(CCmdUI* pCmdUI)
{
Prepare();
if ( CCoolBarItem* pcCmdUI = CCoolBarItem::FromCmdUI( pCmdUI ) )
pcCmdUI->Show( m_bSelNotPausedOrMoving || ! m_bSelDownload );
pCmdUI->Enable( m_bSelNotPausedOrMoving );
}
void CDownloadsWnd::OnDownloadsPause()
{
CSingleLock pLock( &Transfers.m_pSection, TRUE );
for ( POSITION pos = Downloads.GetIterator() ; pos ; )
{
CDownload* pDownload = Downloads.GetNext( pos );
if ( pDownload->m_bSelected )
{
if ( ! pDownload->IsPaused() && ! pDownload->IsMoving() ) pDownload->Pause();
}
}
Update();
}
void CDownloadsWnd::OnUpdateDownloadsClear(CCmdUI* pCmdUI)
{
Prepare();
pCmdUI->Enable( m_bSelNoPreview );
}
void CDownloadsWnd::OnDownloadsClear()
{
CSingleLock pLock( &Transfers.m_pSection, TRUE );
CList<CDownload*> pList;
for ( POSITION pos = Downloads.GetIterator() ; pos ; )
{
CDownload* pDownload = Downloads.GetNext( pos );
if ( pDownload->m_bSelected ) pList.AddTail( pDownload );
}
while ( ! pList.IsEmpty() )
{
CDownload* pDownload = pList.RemoveHead();
if ( Downloads.Check( pDownload ) )
{
if ( pDownload->IsPreviewVisible() )
{
// Can't
}
else if ( pDownload->IsCompleted() )
{
pDownload->Remove();
}
else if ( pDownload->IsStarted() )
{
CDeleteFileDlg dlg;
dlg.m_sName = pDownload->m_sRemoteName;
BOOL bShared = pDownload->IsShared();
pLock.Unlock();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -