📄 mainfrm.cpp
字号:
void MainFrame::updateTray(bool add /* = true */) {
if(add) {
NOTIFYICONDATA nid;
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = m_hWnd;
nid.uID = 0;
nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
nid.uCallbackMessage = WM_APP + 242;
nid.hIcon = (HICON)::LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
_tcscpy(nid.szTip, _T("DC++"));
nid.szTip[63] = '\0';
lastMove = GET_TICK() - 1000;
::Shell_NotifyIcon(NIM_ADD, &nid);
trayIcon = true;
} else {
NOTIFYICONDATA nid;
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = m_hWnd;
nid.uID = 0;
nid.uFlags = 0;
::Shell_NotifyIcon(NIM_DELETE, &nid);
ShowWindow(SW_SHOW);
trayIcon = false;
}
}
LRESULT MainFrame::onSize(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
if(wParam == SIZE_MINIMIZED) {
if(BOOLSETTING(AUTO_AWAY) && !Util::getManualAway()) {
Util::setAway(true);
}
if(BOOLSETTING(MINIMIZE_TRAY) != WinUtil::isShift()) {
updateTray(true);
ShowWindow(SW_HIDE);
}
maximized = IsZoomed() > 0;
} else if( (wParam == SIZE_RESTORED || wParam == SIZE_MAXIMIZED) ) {
if(BOOLSETTING(AUTO_AWAY) && !Util::getManualAway()) {
Util::setAway(false);
}
if(trayIcon) {
updateTray(false);
}
}
bHandled = FALSE;
return 0;
}
LRESULT MainFrame::onEndSession(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) {
if(c != NULL) {
c->removeListener(this);
delete c;
c = NULL;
}
WINDOWPLACEMENT wp;
wp.length = sizeof(wp);
GetWindowPlacement(&wp);
CRect rc;
GetWindowRect(rc);
if(wp.showCmd == SW_SHOW || wp.showCmd == SW_SHOWNORMAL) {
SettingsManager::getInstance()->set(SettingsManager::MAIN_WINDOW_POS_X, rc.left);
SettingsManager::getInstance()->set(SettingsManager::MAIN_WINDOW_POS_Y, rc.top);
SettingsManager::getInstance()->set(SettingsManager::MAIN_WINDOW_SIZE_X, rc.Width());
SettingsManager::getInstance()->set(SettingsManager::MAIN_WINDOW_SIZE_Y, rc.Height());
}
if(wp.showCmd == SW_SHOWNORMAL || wp.showCmd == SW_SHOW || wp.showCmd == SW_SHOWMAXIMIZED || wp.showCmd == SW_MAXIMIZE)
SettingsManager::getInstance()->set(SettingsManager::MAIN_WINDOW_STATE, (int)wp.showCmd);
QueueManager::getInstance()->saveQueue();
SettingsManager::getInstance()->save();
return 0;
}
LRESULT MainFrame::OnClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) {
if(c != NULL) {
c->removeListener(this);
delete c;
c = NULL;
}
if(!closing) {
if( oldshutdown ||(!BOOLSETTING(CONFIRM_EXIT)) || (MessageBox(CTSTRING(REALLY_EXIT), _T(APPNAME) _T(" ") _T(VERSIONSTRING), MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2) == IDYES) ) {
string tmp1;
string tmp2;
WINDOWPLACEMENT wp;
wp.length = sizeof(wp);
GetWindowPlacement(&wp);
CRect rc;
GetWindowRect(rc);
if(wp.showCmd == SW_SHOW || wp.showCmd == SW_SHOWNORMAL) {
SettingsManager::getInstance()->set(SettingsManager::MAIN_WINDOW_POS_X, rc.left);
SettingsManager::getInstance()->set(SettingsManager::MAIN_WINDOW_POS_Y, rc.top);
SettingsManager::getInstance()->set(SettingsManager::MAIN_WINDOW_SIZE_X, rc.Width());
SettingsManager::getInstance()->set(SettingsManager::MAIN_WINDOW_SIZE_Y, rc.Height());
}
if(wp.showCmd == SW_SHOWNORMAL || wp.showCmd == SW_SHOW || wp.showCmd == SW_SHOWMAXIMIZED || wp.showCmd == SW_MAXIMIZE)
SettingsManager::getInstance()->set(SettingsManager::MAIN_WINDOW_STATE, (int)wp.showCmd);
ShowWindow(SW_HIDE);
transferView.prepareClose();
SearchManager::getInstance()->disconnect();
ConnectionManager::getInstance()->disconnect();
stopUPnP();
DWORD id;
stopperThread = CreateThread(NULL, 0, stopper, this, 0, &id);
closing = true;
}
bHandled = TRUE;
} else {
// This should end immediately, as it only should be the stopper that sends another WM_CLOSE
WaitForSingleObject(stopperThread, 60*1000);
CloseHandle(stopperThread);
stopperThread = NULL;
bHandled = FALSE;
}
return 0;
}
LRESULT MainFrame::onLink(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
tstring site;
switch(wID) {
case IDC_HELP_HOMEPAGE: site = links.homepage; break;
case IDC_HELP_DOWNLOADS: site = links.downloads; break;
case IDC_HELP_GEOIPFILE: site = links.geoipfile; break;
case IDC_HELP_TRANSLATIONS: site = links.translations; break;
case IDC_HELP_FAQ: site = links.faq; break;
case IDC_HELP_HELP_FORUM: site = links.help; break;
case IDC_HELP_DISCUSS: site = links.discuss; break;
case IDC_HELP_REQUEST_FEATURE: site = links.features; break;
case IDC_HELP_REPORT_BUG: site = links.bugs; break;
case IDC_HELP_DONATE: site = Text::toT("https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=arnetheduck%40gmail%2ecom&item_name=DCPlusPlus&no_shipping=1&return=http%3a%2f%2fdcplusplus%2esf%2enet%2f&cancel_return=http%3a%2f%2fdcplusplus%2esf%2enet%2f&cn=Greeting&tax=0¤cy_code=EUR&bn=PP%2dDonationsBF&charset=UTF%2d8"); break;
default: dcassert(0);
}
WinUtil::openLink(site);
return 0;
}
void MainFrame::UpdateLayout(BOOL bResizeBars /* = TRUE */)
{
RECT rect;
GetClientRect(&rect);
// position bars and offset their dimensions
UpdateBarsPosition(rect, bResizeBars);
if(ctrlStatus.IsWindow() && ctrlLastLines.IsWindow()) {
CRect sr;
int w[8];
ctrlStatus.GetClientRect(sr);
w[7] = sr.right - 16;
#define setw(x) w[x] = max(w[x+1] - statusSizes[x], 0)
setw(6); setw(5); setw(4); setw(3); setw(2); setw(1); setw(0);
ctrlStatus.SetParts(8, w);
ctrlLastLines.SetMaxTipWidth(w[0]);
}
CRect rc = rect;
rc.top = rc.bottom - ctrlTab.getHeight();
if(ctrlTab.IsWindow())
ctrlTab.MoveWindow(rc);
CRect rc2 = rect;
rc2.bottom = rc.top;
SetSplitterRect(rc2);
}
static const TCHAR types[] = _T("File Lists\0*.DcLst;*.xml.bz2\0All Files\0*.*\0");
LRESULT MainFrame::onOpenFileList(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
tstring file;
if(WinUtil::browseFile(file, m_hWnd, false, Text::toT(Util::getListPath()), types)) {
User::Ptr u = DirectoryListing::getUserFromFilename(Text::fromT(file));
if(u) {
DirectoryListingFrame::openWindow(file, u, 0);
} else {
MessageBox(CTSTRING(INVALID_LISTNAME), _T(APPNAME) _T(" ") _T(VERSIONSTRING));
}
}
return 0;
}
LRESULT MainFrame::onOpenOwnList(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(!ShareManager::getInstance()->getOwnListFile().empty()){
DirectoryListingFrame::openWindow(Text::toT(ShareManager::getInstance()->getOwnListFile()), ClientManager::getInstance()->getMe(), 0);
}
return 0;
}
LRESULT MainFrame::onRefreshFileList(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
ShareManager::getInstance()->setDirty();
ShareManager::getInstance()->refresh(true);
return 0;
}
LRESULT MainFrame::onTrayIcon(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
if (lParam == WM_LBUTTONUP) {
ShowWindow(SW_SHOW);
ShowWindow(maximized ? SW_MAXIMIZE : SW_RESTORE);
}else if(lParam == WM_RBUTTONDOWN || lParam == WM_CONTEXTMENU){
CPoint pt;
CMenu mnuTrayMenu;
mnuTrayMenu.CreatePopupMenu();
mnuTrayMenu.AppendMenu(MF_STRING, IDC_TRAY_SHOW, CTSTRING(MENU_SHOW));
mnuTrayMenu.AppendMenu(MF_STRING, IDC_TRAY_QUIT, CTSTRING(MENU_EXIT));
mnuTrayMenu.AppendMenu(MF_STRING, IDC_OPEN_DOWNLOADS, CTSTRING(MENU_OPEN_DOWNLOADS_DIR));
mnuTrayMenu.AppendMenu(MF_STRING, ID_FILE_SETTINGS, CTSTRING(MENU_SETTINGS));
GetCursorPos(&pt);
SetForegroundWindow(m_hWnd);
mnuTrayMenu.TrackPopupMenu(TPM_BOTTOMALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,pt.x,pt.y,m_hWnd);
PostMessage(WM_NULL, 0, 0);
mnuTrayMenu.SetMenuDefaultItem(0,TRUE);
} else if(lParam == WM_MOUSEMOVE && ((lastMove + 1000) < GET_TICK()) ) {
NOTIFYICONDATA nid;
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = m_hWnd;
nid.uID = 0;
nid.uFlags = NIF_TIP;
_tcsncpy(nid.szTip, Text::toT("D: " + Util::formatBytes(DownloadManager::getInstance()->getAverageSpeed()) + "/s (" +
Util::toString(DownloadManager::getInstance()->getDownloadCount()) + ")\r\nU: " +
Util::formatBytes(UploadManager::getInstance()->getAverageSpeed()) + "/s (" +
Util::toString(UploadManager::getInstance()->getUploadCount()) + ")").c_str(), 64);
::Shell_NotifyIcon(NIM_MODIFY, &nid);
lastMove = GET_TICK();
}
return 0;
}
LRESULT MainFrame::OnViewToolBar(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
static BOOL bVisible = TRUE; // initially visible
bVisible = !bVisible;
CReBarCtrl rebar = m_hWndToolBar;
int nBandIndex = rebar.IdToIndex(ATL_IDW_BAND_FIRST + 1); // toolbar is 2nd added band
rebar.ShowBand(nBandIndex, bVisible);
UISetCheck(ID_VIEW_TOOLBAR, bVisible);
UpdateLayout();
SettingsManager::getInstance()->set(SettingsManager::SHOW_TOOLBAR, bVisible);
return 0;
}
LRESULT MainFrame::OnViewStatusBar(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
BOOL bVisible = !::IsWindowVisible(m_hWndStatusBar);
::ShowWindow(m_hWndStatusBar, bVisible ? SW_SHOWNOACTIVATE : SW_HIDE);
UISetCheck(ID_VIEW_STATUS_BAR, bVisible);
UpdateLayout();
SettingsManager::getInstance()->set(SettingsManager::SHOW_STATUSBAR, bVisible);
return 0;
}
LRESULT MainFrame::OnViewTransferView(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
BOOL bVisible = !transferView.IsWindowVisible();
if(!bVisible) {
if(GetSinglePaneMode() == SPLIT_PANE_NONE)
SetSinglePaneMode(SPLIT_PANE_TOP);
} else {
if(GetSinglePaneMode() != SPLIT_PANE_NONE)
SetSinglePaneMode(SPLIT_PANE_NONE);
}
UISetCheck(ID_VIEW_TRANSFER_VIEW, bVisible);
UpdateLayout();
SettingsManager::getInstance()->set(SettingsManager::SHOW_TRANSFERVIEW, bVisible);
return 0;
}
LRESULT MainFrame::onCloseWindows(WORD , WORD wID, HWND , BOOL& ) {
switch(wID) {
case IDC_CLOSE_DISCONNECTED: HubFrame::closeDisconnected(); break;
case IDC_CLOSE_ALL_PM: PrivateFrame::closeAll(); break;
case IDC_CLOSE_ALL_OFFLINE_PM: PrivateFrame::closeAllOffline(); break;
case IDC_CLOSE_ALL_DIR_LIST: DirectoryListingFrame::closeAll(); break;
case IDC_CLOSE_ALL_SEARCH_FRAME: SearchFrame::closeAll(); break;
}
return 0;
}
LRESULT MainFrame::onQuickConnect(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/){
LineDlg dlg;
dlg.description = TSTRING(HUB_ADDRESS);
dlg.title = TSTRING(QUICK_CONNECT);
if(dlg.DoModal(m_hWnd) == IDOK){
if(SETTING(NICK).empty())
return 0;
tstring tmp = dlg.line;
// Strip out all the spaces
string::size_type i;
while((i = tmp.find(' ')) != string::npos)
tmp.erase(i, 1);
HubFrame::openWindow(tmp);
}
return 0;
}
void MainFrame::on(TimerManagerListener::Second, u_int32_t aTick) throw() {
int64_t diff = (int64_t)((lastUpdate == 0) ? aTick - 1000 : aTick - lastUpdate);
int64_t updiff = Socket::getTotalUp() - lastUp;
int64_t downdiff = Socket::getTotalDown() - lastDown;
TStringList* str = new TStringList();
str->push_back(Util::getAway() ? TSTRING(AWAY) : _T(""));
str->push_back(Text::toT("H: " + Client::getCounts()));
str->push_back(Text::toT(STRING(SLOTS) + ": " + Util::toString(UploadManager::getInstance()->getFreeSlots()) + '/' + Util::toString(SETTING(SLOTS))));
str->push_back(Text::toT("D: " + Util::formatBytes(Socket::getTotalDown())));
str->push_back(Text::toT("U: " + Util::formatBytes(Socket::getTotalUp())));
str->push_back(Text::toT("D: " + Util::formatBytes(downdiff*1000I64/diff) + "/s (" + Util::toString(DownloadManager::getInstance()->getDownloadCount()) + ")"));
str->push_back(Text::toT("U: " + Util::formatBytes(updiff*1000I64/diff) + "/s (" + Util::toString(UploadManager::getInstance()->getUploadCount()) + ")"));
PostMessage(WM_SPEAKER, STATS, (LPARAM)str);
SettingsManager::getInstance()->set(SettingsManager::TOTAL_UPLOAD, SETTING(TOTAL_UPLOAD) + updiff);
SettingsManager::getInstance()->set(SettingsManager::TOTAL_DOWNLOAD, SETTING(TOTAL_DOWNLOAD) + downdiff);
lastUpdate = aTick;
lastUp = Socket::getTotalUp();
lastDown = Socket::getTotalDown();
}
void MainFrame::on(HttpConnectionListener::Data, HttpConnection* /*conn*/, const u_int8_t* buf, size_t len) throw() {
versionInfo += string((const char*)buf, len);
}
void MainFrame::on(PartialList, const User::Ptr& aUser, const string& text) throw() {
PostMessage(WM_SPEAKER, BROWSE_LISTING, (LPARAM)new DirectoryBrowseInfo(aUser, text));
}
void MainFrame::on(QueueManagerListener::Finished, QueueItem* qi, int64_t speed) throw() {
if(qi->isSet(QueueItem::FLAG_CLIENT_VIEW)) {
if(qi->isSet(QueueItem::FLAG_USER_LIST)) {
// This is a file listing, show it...
DirectoryListInfo* i = new DirectoryListInfo(qi->getCurrent()->getUser(), Text::toT(qi->getListName()), speed);
PostMessage(WM_SPEAKER, DOWNLOAD_LISTING, (LPARAM)i);
} else if(qi->isSet(QueueItem::FLAG_TEXT)) {
PostMessage(WM_SPEAKER, VIEW_FILE_AND_DELETE, (LPARAM) new tstring(Text::toT(qi->getTarget())));
}
}
}
LRESULT MainFrame::onDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) {
LogManager::getInstance()->removeListener(this);
QueueManager::getInstance()->removeListener(this);
TimerManager::getInstance()->removeListener(this);
if(trayIcon) {
updateTray(false);
}
bHandled = FALSE;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -