📄 downloadlistctrl.cpp
字号:
case 9: // remaining time & size
{
//size
uint32 remains;
remains=lpPartFile->GetFileSize()-lpPartFile->GetCompletedSize(); //<<-- 09/27/2002, CML
// time
sint32 restTime=lpPartFile->getTimeRemaining();
buffer.Format("%s (%s)", CastSecondsToHM(restTime),CastItoXBytes(remains));
if (lpPartFile->GetStatus()==PS_COMPLETING || lpPartFile->GetStatus()==PS_COMPLETE )
buffer="";
dc->DrawText(buffer,buffer.GetLength(),lpRect, DLC_DT_TEXT);
}
break;
case 10: // last seen complete
{
if (lpPartFile->lastseencomplete==NULL)
buffer=GetResString(IDS_UNKNOWN);
else
buffer=lpPartFile->lastseencomplete.Format( theApp.glob_prefs->GetDateTimeFormat());
dc->DrawText(buffer,(int)strlen(buffer),lpRect, DLC_DT_TEXT);
}
break;
case 11: // last receive
if (!IsColumnHidden(11)) {
if(lpPartFile->GetFileDate()!=NULL)
buffer=lpPartFile->GetCFileDate().Format( theApp.glob_prefs->GetDateTimeFormat());
else buffer="";
dc->DrawText(buffer,(int)strlen(buffer),lpRect, DLC_DT_TEXT);
}
break;
}
}
}
void CDownloadListCtrl::DrawSourceItem(CDC *dc, int nColumn, LPRECT lpRect, CtrlItem_Struct *lpCtrlItem) {
if(lpRect->left < lpRect->right) {
CString buffer;
CUpDownClient *lpUpDownClient = (CUpDownClient*)lpCtrlItem->value;
switch(nColumn) {
case 0: // icon, name, status
{
RECT cur_rec;
memcpy(&cur_rec, lpRect, sizeof(RECT));
POINT point = {cur_rec.left, cur_rec.top+1};
if (lpCtrlItem->type == AVAILABLE_SOURCE){
switch (lpUpDownClient->GetDownloadState()) {
case DS_CONNECTING:
m_ImageList.Draw(dc, 2, point, ILD_NORMAL);
break;
case DS_CONNECTED:
m_ImageList.Draw(dc, 2, point, ILD_NORMAL);
break;
case DS_WAITCALLBACK:
m_ImageList.Draw(dc, 2, point, ILD_NORMAL);
break;
case DS_ONQUEUE:
if(lpUpDownClient->IsRemoteQueueFull())
m_ImageList.Draw(dc, 3, point, ILD_NORMAL);
else
m_ImageList.Draw(dc, 1, point, ILD_NORMAL);
break;
case DS_DOWNLOADING:
m_ImageList.Draw(dc, 0, point, ILD_NORMAL);
break;
case DS_REQHASHSET:
m_ImageList.Draw(dc, 0, point, ILD_NORMAL);
break;
case DS_NONEEDEDPARTS:
m_ImageList.Draw(dc, 3, point, ILD_NORMAL);
break;
case DS_LOWTOLOWIP:
m_ImageList.Draw(dc, 3, point, ILD_NORMAL);
break;
case DS_TOOMANYCONNS:
m_ImageList.Draw(dc, 2, point, ILD_NORMAL);
break;
default:
m_ImageList.Draw(dc, 4, point, ILD_NORMAL);
}
}
else {
m_ImageList.Draw(dc, 3, point, ILD_NORMAL);
}
cur_rec.left += 20;
if (lpUpDownClient->IsFriend()){
POINT point2= {cur_rec.left,cur_rec.top+1};
m_ImageList.Draw(dc, 6, point2, ILD_NORMAL);
cur_rec.left += 20;
}
else if (lpUpDownClient->ExtProtocolAvailable()) {
POINT point2= {cur_rec.left,cur_rec.top+1};
m_ImageList.Draw(dc, 5, point2, ILD_NORMAL);
cur_rec.left += 20;
}
else{
POINT point2= {cur_rec.left,cur_rec.top+1};
if( lpUpDownClient->GetClientSoft() == SO_MLDONKEY )
m_ImageList.Draw(dc, 8, point2, ILD_NORMAL);
else if ( lpUpDownClient->GetClientSoft() == SO_EDONKEYHYBRID )
m_ImageList.Draw(dc, 11, point2, ILD_NORMAL);
else
m_ImageList.Draw(dc, 7, point2, ILD_NORMAL);
cur_rec.left += 20;
}
if (!lpUpDownClient->GetUserName()) {
buffer = "?";
}
else {
buffer.Format("%s",lpUpDownClient->GetUserName());
}
dc->DrawText(buffer,buffer.GetLength(),&cur_rec, DLC_DT_TEXT);
}
break;
case 1: // size
break;
case 2:// transfered
if ( !IsColumnHidden(3)) {
dc->DrawText("",0,lpRect, DLC_DT_TEXT);
break;
}
case 3:// completed
if (lpCtrlItem->type == AVAILABLE_SOURCE && lpUpDownClient->GetTransferedDown()) {
buffer.Format( "%s", CastItoXBytes(lpUpDownClient->GetTransferedDown()));
dc->DrawText(buffer,buffer.GetLength(),lpRect, DLC_DT_TEXT);
}
break;
case 4: // speed
if (lpCtrlItem->type == AVAILABLE_SOURCE && lpUpDownClient->GetDownloadDatarate()){
if (lpUpDownClient->GetDownloadDatarate()==0) buffer=""; else
buffer.Format("%.1f %s", lpUpDownClient->GetDownloadDatarate()/1024.0f,GetResString(IDS_KBYTESEC));
dc->DrawText(buffer,buffer.GetLength(),lpRect, DLC_DT_TEXT);
}
break;
case 5: // file info
{
lpRect->bottom--;
lpRect->top++;
int iWidth = lpRect->right - lpRect->left;
int iHeight = lpRect->bottom - lpRect->top;
if (lpCtrlItem->status == (HBITMAP)NULL)
VERIFY(lpCtrlItem->status.CreateBitmap(1, 1, 1, 8, NULL));
CDC cdcStatus;
HGDIOBJ hOldBitmap;
cdcStatus.CreateCompatibleDC(dc);
int cx = lpCtrlItem->status.GetBitmapDimension().cx;
DWORD dwTicks = GetTickCount();
if(lpCtrlItem->dwUpdated + DLC_BARUPDATE < dwTicks || cx != iWidth || !lpCtrlItem->dwUpdated) {
lpCtrlItem->status.DeleteObject();
lpCtrlItem->status.CreateCompatibleBitmap(dc, iWidth, iHeight);
lpCtrlItem->status.SetBitmapDimension(iWidth, iHeight);
hOldBitmap = cdcStatus.SelectObject(lpCtrlItem->status);
RECT rec_status;
rec_status.left = 0;
rec_status.top = 0;
rec_status.bottom = iHeight;
rec_status.right = iWidth;
lpUpDownClient->DrawStatusBar(&cdcStatus, &rec_status,(lpCtrlItem->type == UNAVAILABLE_SOURCE), theApp.glob_prefs->UseFlatBar());
lpCtrlItem->dwUpdated = dwTicks + (rand() % 128);
} else
hOldBitmap = cdcStatus.SelectObject(lpCtrlItem->status);
dc->BitBlt(lpRect->left, lpRect->top, iWidth, iHeight, &cdcStatus, 0, 0, SRCCOPY);
cdcStatus.SelectObject(hOldBitmap);
lpRect->bottom++;
lpRect->top--;
}
break;
case 6:{ // sources
switch(lpUpDownClient->GetClientSoft()){
case SO_EDONKEY:
buffer.Format("eDonkey v%.1f",(float)lpUpDownClient->GetVersion()/10.0f);
break;
case SO_EDONKEYHYBRID:
buffer.Format( "eDonkeyHybrid v%.1f",(float)lpUpDownClient->GetVersion()/10.0f);
break;
case SO_EMULE:
case SO_OLDEMULE:{
buffer.Format("eMule v%.2f",(float)lpUpDownClient->GetVersion()/1000.0f);
break;
}
case SO_CDONKEY:{
buffer.Format("cDonkey v%.2f",(float)lpUpDownClient->GetVersion()/1000.0f);
break;
}
case SO_LMULE:{
buffer.Format("lMule v%.2f",(float)lpUpDownClient->GetVersion()/1000.0f);
break;
}
case SO_MLDONKEY:
buffer.Format("Old MlDonkey");
break;
case SO_UNKNOWN:
buffer.Format( "%s", GetResString(IDS_UNKNOWN));
}
dc->DrawText(buffer,buffer.GetLength(),lpRect, DLC_DT_TEXT);
break;
}
case 7: // prio
if (lpUpDownClient->GetDownloadState()==DS_ONQUEUE){
if( lpUpDownClient->IsRemoteQueueFull() ){
buffer.Format( "%s",GetResString(IDS_QUEUEFULL));
dc->DrawText(buffer,buffer.GetLength(),lpRect, DLC_DT_TEXT);
}
else{
if ( lpUpDownClient->GetRemoteQueueRank()){
buffer.Format("QR: %u",lpUpDownClient->GetRemoteQueueRank());
dc->DrawText(buffer,buffer.GetLength(),lpRect, DLC_DT_TEXT);
}
else{
buffer="";
dc->DrawText(buffer,buffer.GetLength(),lpRect, DLC_DT_TEXT);
}
}
} else {
buffer= "";
dc->DrawText(buffer,buffer.GetLength(),lpRect, DLC_DT_TEXT);
}
break;
case 8: { // status
if (lpCtrlItem->type == AVAILABLE_SOURCE){
switch (lpUpDownClient->GetDownloadState()) {
case DS_CONNECTING:
buffer = GetResString(IDS_CONNECTING);
break;
case DS_CONNECTED:
buffer = GetResString(IDS_ASKING);
break;
case DS_WAITCALLBACK:
buffer = GetResString(IDS_CONNVIASERVER);
break;
case DS_ONQUEUE:
if( lpUpDownClient->IsRemoteQueueFull() )
buffer = GetResString(IDS_QUEUEFULL);
else
buffer = GetResString(IDS_ONQUEUE);
break;
case DS_DOWNLOADING:
buffer = GetResString(IDS_TRANSFERRING);
break;
case DS_REQHASHSET:
buffer = GetResString(IDS_RECHASHSET);
break;
case DS_NONEEDEDPARTS:
buffer = GetResString(IDS_NONEEDEDPARTS);
break;
case DS_LOWTOLOWIP:
buffer = GetResString(IDS_NOCONNECTLOW2LOW);
break;
case DS_TOOMANYCONNS:
buffer = GetResString(IDS_TOOMANYCONNS);
break;
default:
buffer = GetResString(IDS_UNKNOWN);
}
}
else {
buffer = GetResString(IDS_ASKED4ANOTHERFILE);
}
dc->DrawText(buffer,buffer.GetLength(),lpRect, DLC_DT_TEXT);
break;
}
case 9: // remaining time & size
break;
}
}
}
void CDownloadListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){
if (!lpDrawItemStruct->itemData)
return;
CDC* odc = CDC::FromHandle(lpDrawItemStruct->hDC);
CtrlItem_Struct* content = (CtrlItem_Struct*)lpDrawItemStruct->itemData;
BOOL bCtrlFocused = ((GetFocus() == this) || (GetStyle() & LVS_SHOWSELALWAYS));
if ((content->type == FILE_TYPE) && (lpDrawItemStruct->itemAction | ODA_SELECT) &&
(lpDrawItemStruct->itemState & ODS_SELECTED)) {
if(bCtrlFocused)
odc->SetBkColor(m_crHighlight);
else
odc->SetBkColor(m_crNoHighlight);
} /*else if (content->type != FILE_TYPE) {
COLORREF crHighlight = m_crWindowText;
COLORREF crWindow = m_crWindow;
COLORREF crHalf = DLC_RGBBLEND(crHighlight, crWindow, 16);
odc->SetBkColor(crHalf);
}*/ else
odc->SetBkColor(GetBkColor());
CMemDC dc(odc,&CRect(lpDrawItemStruct->rcItem));
CFont *pOldFont = dc->SelectObject(GetFont());
COLORREF crOldTextColor = dc->SetTextColor(m_crWindowText);
BOOL notLast = lpDrawItemStruct->itemID + 1 != GetItemCount();
BOOL notFirst = lpDrawItemStruct->itemID != 0;
int tree_start;
int tree_end;
RECT cur_rec;
memcpy(&cur_rec,&lpDrawItemStruct->rcItem,sizeof(RECT));
//offset was 4, now it's the standard 2 spaces
int iOffset = dc->GetTextExtent(_T(" "), 1 ).cx*2;
CHeaderCtrl *pHeaderCtrl = GetHeaderCtrl();
int iCount = pHeaderCtrl->GetItemCount();
cur_rec.right = cur_rec.left;
cur_rec.right -= iOffset;
cur_rec.left += iOffset;
if (content->type == FILE_TYPE){
for(int iCurrent = 0; iCurrent < iCount; iCurrent++) {
int iColumn = pHeaderCtrl->OrderToIndex(iCurrent);
int cx = CListCtrl::GetColumnWidth(iColumn);
if(iColumn == 5) {
int iNextLeft = cur_rec.left + cx;
//set up tree vars
cur_rec.left = cur_rec.right + iOffset;
cur_rec.right = cur_rec.left + min(8, cx);
tree_start = cur_rec.left + 1;
tree_end = cur_rec.right;
//normal column stuff
cur_rec.left = cur_rec.right + 1;
cur_rec.right = tree_start + cx - iOffset;
DrawFileItem(dc, 5, &cur_rec, content);
cur_rec.left = iNextLeft;
} else {
cur_rec.right += cx;
DrawFileItem(dc, iColumn, &cur_rec, content);
cur_rec.left += cx;
}
}
}
else if (content->type == UNAVAILABLE_SOURCE || content->type == AVAILABLE_SOURCE){
for(int iCurrent = 0; iCurrent < iCount; iCurrent++) {
int iColumn = pHeaderCtrl->OrderToIndex(iCurrent);
int cx = CListCtrl::GetColumnWidth(iColumn);
if(iColumn == 5) {
int iNextLeft = cur_rec.left + cx;
//set up tree vars
cur_rec.left = cur_rec.right + iOffset;
cur_rec.right = cur_rec.left + min(8, cx);
tree_start = cur_rec.left + 1;
tree_end = cur_rec.right;
//normal column stuff
cur_rec.left = cur_rec.right + 1;
cur_rec.right = tree_start + cx - iOffset;
DrawSourceItem(dc, 5, &cur_rec, content);
cur_rec.left = iNextLeft;
} else {
while(iCurrent < iCount) {
int iNext = pHeaderCtrl->OrderToIndex(iCurrent + 1);
if(iNext == 1 /*|| iNext == 5 || iNext == 7 || iNext == 8*/)
cx += CListCtrl::GetColumnWidth(iNext);
else
break;
iCurrent++;
}
cur_rec.right += cx;
DrawSourceItem(dc, iColumn, &cur_rec, content);
cur_rec.left += cx;
}
}
}
//draw rectangle around selected item(s)
if ((lpDrawItemStruct->itemAction | ODA_SELECT) &&
(lpDrawItemStruct->itemState & ODS_SELECTED) &&
(content->type == FILE_TYPE)) {
RECT outline_rec;
memcpy(&outline_rec,&lpDrawItemStruct->rcItem,sizeof(RECT));
outline_rec.top--;
outline_rec.bottom++;
dc->FrameRect(&outline_rec, &CBrush(GetBkColor()));
outline_rec.top++;
outline_rec.bottom--;
outline_rec.left++;
outline_rec.right--;
if(notFirst && (GetItemState(lpDrawItemStruct->itemID - 1, LVIS_SELECTED))) {
CtrlItem_Struct* prev = (CtrlItem_Struct*)this->GetItemData(lpDrawItemStruct->itemID - 1);
if(prev->type == FILE_TYPE)
outline_rec.top--;
}
if(notLast && (GetItemState(lpDrawItemStruct->itemID + 1, LVIS_SELECTED))) {
CtrlItem_Struct* next = (CtrlItem_Struct*)this->GetItemData(lpDrawItemStruct->itemID + 1);
if(next->type == FILE_TYPE)
outline_rec.bottom++;
}
if(bCtrlFocused)
dc->FrameRect(&outline_rec, &CBrush(m_crFocusLine));
else
dc->FrameRect(&outline_rec, &CBrush(m_crNoFocusLine));
}
//draw focus rectangle around non-highlightable items when they have the focus
else if (((lpDrawItemStruct->itemState & ODS_FOCUS) == ODS_FOCUS) &&
(GetFocus() == this)) {
RECT focus_rec;
focus_rec.top = lpDrawItemStruct->rcItem.top;
focus_rec.bottom = lpDrawItemStruct->rcItem.bottom;
focus_rec.left = lpDrawItemStruct->rcItem.left + 1;
focus_rec.right = lpDrawItemStruct->rcItem.right - 1;
dc->FrameRect(&focus_rec, &CBrush(m_crNoFocusLine));
}
//draw tree last so it draws over selected and focus (looks better)
if(tree_start < tree_end) {
//set new bounds
RECT tree_rect;
tree_rect.top = lpDrawItemStruct->rcItem.top;
tree_rect.bottom = lpDrawItemStruct->rcItem.bottom;
tree_rect.left = tree_start;
tree_rect.right = tree_end;
dc->SetBoundsRect(&tree_rect, DCB_DISABLE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -