📄 emuledlg.cpp
字号:
SetActiveDialog(sharedfileswnd);
break;
case IDD_SEARCH:
SetActiveDialog(searchwnd);
break;
case IDD_CHAT:
SetActiveDialog(chatwnd);
break;
case IDD_TRANSFER:
SetActiveDialog(transferwnd);
break;
case IDD_STATISTICS:
SetActiveDialog(statisticswnd);
break;
case IDD_KADEMLIAWND:
SetActiveDialog(kademliawnd);
break;
case IDD_IRC:
SetActiveDialog(ircwnd);
break;
}
}
// if still no active window, activate server window
if (activewnd == NULL)
SetActiveDialog(serverwnd);
SetAllIcons();
Localize();
// set updateintervall of graphic rate display (in seconds)
//ShowConnectionState(false);
// adjust all main window sizes for toolbar height and maximize the child windows
CRect rcClient, rcToolbar, rcStatusbar;
GetClientRect(&rcClient);
pwndToolbarX->GetWindowRect(&rcToolbar);
statusbar->GetWindowRect(&rcStatusbar);
rcClient.top += rcToolbar.Height();
rcClient.bottom -= rcStatusbar.Height();
CWnd* apWnds[] =
{
serverwnd,
kademliawnd,
transferwnd,
sharedfileswnd,
searchwnd,
chatwnd,
ircwnd,
statisticswnd
};
for (int i = 0; i < ARRSIZE(apWnds); i++)
apWnds[i]->SetWindowPos(NULL, rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(), SWP_NOZORDER);
// anchors
AddAnchor(*serverwnd, TOP_LEFT, BOTTOM_RIGHT);
AddAnchor(*kademliawnd, TOP_LEFT, BOTTOM_RIGHT);
AddAnchor(*transferwnd, TOP_LEFT, BOTTOM_RIGHT);
AddAnchor(*sharedfileswnd, TOP_LEFT, BOTTOM_RIGHT);
AddAnchor(*searchwnd, TOP_LEFT, BOTTOM_RIGHT);
AddAnchor(*chatwnd, TOP_LEFT, BOTTOM_RIGHT);
AddAnchor(*ircwnd, TOP_LEFT, BOTTOM_RIGHT);
AddAnchor(*statisticswnd, TOP_LEFT, BOTTOM_RIGHT);
AddAnchor(*pwndToolbarX, TOP_LEFT, TOP_RIGHT);
AddAnchor(*statusbar, BOTTOM_LEFT, BOTTOM_RIGHT);
statisticswnd->ShowInterval();
// tray icon
TraySetMinimizeToTray(thePrefs.GetMinTrayPTR());
TrayMinimizeToTrayChange();
ShowTransferRate(true);
ShowPing();
searchwnd->UpdateCatTabs();
///////////////////////////////////////////////////////////////////////////
// Restore saved window placement
//
WINDOWPLACEMENT wp = {0};
wp.length = sizeof(wp);
wp = thePrefs.GetEmuleWindowPlacement();
if (m_bStartMinimized)
{
// To avoid the window flickering during startup we try to set the proper window show state right here.
if (*thePrefs.GetMinTrayPTR())
{
// Minimize to System Tray
//
// Unfortunately this does not work. The eMule main window is a modal dialog which is invoked
// by CDialog::DoModal which eventually calls CWnd::RunModalLoop. Look at 'MLF_SHOWONIDLE' and
// 'bShowIdle' in the above noted functions to see why it's not possible to create the window
// right in hidden state.
//--- attempt #1
//wp.showCmd = SW_HIDE;
//TrayShow();
//--- doesn't work at all
//--- attempt #2
//if (wp.showCmd == SW_SHOWMAXIMIZED)
// wp.flags = WPF_RESTORETOMAXIMIZED;
//m_bStartMinimizedChecked = false; // post-hide the window..
//--- creates window flickering
//--- attempt #3
// Minimize the window into the task bar and later move it into the tray bar
if (wp.showCmd == SW_SHOWMAXIMIZED)
wp.flags = WPF_RESTORETOMAXIMIZED;
wp.showCmd = SW_MINIMIZE;
m_bStartMinimizedChecked = false;
// to get properly restored from tray bar (after attempt #3) we have to use a patched 'restore' window cmd..
m_wpFirstRestore = thePrefs.GetEmuleWindowPlacement();
m_wpFirstRestore.length = sizeof(m_wpFirstRestore);
if (m_wpFirstRestore.showCmd != SW_SHOWMAXIMIZED)
m_wpFirstRestore.showCmd = SW_SHOWNORMAL;
}
else {
// Minimize to System Taskbar
//
if (wp.showCmd == SW_SHOWMAXIMIZED)
wp.flags = WPF_RESTORETOMAXIMIZED;
wp.showCmd = SW_MINIMIZE; // Minimize window but do not activate it.
m_bStartMinimizedChecked = true;
}
}
else
{
// Allow only SW_SHOWNORMAL and SW_SHOWMAXIMIZED. Ignore SW_SHOWMINIMIZED to make sure the window
// becomes visible. If user wants SW_SHOWMINIMIZED, we already have an explicit option for this (see above).
if (wp.showCmd != SW_SHOWMAXIMIZED)
wp.showCmd = SW_SHOWNORMAL;
m_bStartMinimizedChecked = true;
}
SetWindowPlacement(&wp);
if (thePrefs.GetWSIsEnabled())
theApp.webserver->StartServer();
theApp.mmserver->Init();
VERIFY( (m_hTimer = ::SetTimer(NULL, NULL, 300, StartupTimer)) != NULL );
if (thePrefs.GetVerbose() && !m_hTimer)
AddDebugLogLine(true,_T("Failed to create 'startup' timer - %s"),GetErrorMessage(GetLastError()));
theStats.starttime = GetTickCount();
if (thePrefs.IsFirstStart())
{
// temporary disable the 'startup minimized' option, otherwise no window will be shown at all
m_bStartMinimized = false;
DestroySplash();
extern BOOL FirstTimeWizard();
if (FirstTimeWizard()){
// start connection wizard
CConnectionWizardDlg conWizard;
conWizard.DoModal();
}
}
VERIFY( m_pDropTarget->Register(this) );
// initalize PeerCache
theApp.m_pPeerCache->Init(thePrefs.GetPeerCacheLastSearch(), thePrefs.WasPeerCacheFound(), thePrefs.IsPeerCacheDownloadEnabled(), thePrefs.GetPeerCachePort());
// start aichsyncthread
AfxBeginThread(RUNTIME_CLASS(CAICHSyncThread), THREAD_PRIORITY_BELOW_NORMAL,0);
return TRUE;
}
// modders: dont remove or change the original versioncheck! (additionals are ok)
void CemuleDlg::DoVersioncheck(bool manual) {
if (!manual && thePrefs.GetLastVC()!=0) {
CTime last(thePrefs.GetLastVC());
time_t tLast=safe_mktime(last.GetLocalTm());
time_t tNow=safe_mktime(CTime::GetCurrentTime().GetLocalTm());
if ( (difftime(tNow,tLast) / 86400)<thePrefs.GetUpdateDays() )
return;
}
if (WSAAsyncGetHostByName(m_hWnd, UM_VERSIONCHECK_RESPONSE, "vcdns2.emule.org.cn", m_acVCDNSBuffer, sizeof(m_acVCDNSBuffer)) == 0){
AddLogLine(true,GetResString(IDS_NEWVERSIONFAILED));
}
}
void CALLBACK CemuleDlg::StartupTimer(HWND hwnd, UINT uiMsg, UINT idEvent, DWORD dwTime)
{
// NOTE: Always handle all type of MFC exceptions in TimerProcs - otherwise we'll get mem leaks
try
{
switch(theApp.emuledlg->status){
case 0:
theApp.emuledlg->status++;
theApp.emuledlg->ready = true;
theApp.sharedfiles->SetOutputCtrl(&theApp.emuledlg->sharedfileswnd->sharedfilesctrl);
theApp.emuledlg->status++;
break;
case 1:
break;
case 2:
theApp.emuledlg->status++;
try{
theApp.serverlist->Init();
}
catch(...){
ASSERT(0);
LogError(LOG_STATUSBAR,_T("Failed to initialize server list - Unknown exception"));
}
theApp.emuledlg->status++;
break;
case 3:
break;
case 4:{
bool bError = false;
theApp.emuledlg->status++;
// NOTE: If we have an unhandled exception in CDownloadQueue::Init, MFC will silently catch it
// and the creation of the TCP and the UDP socket will not be done -> client will get a LowID!
try{
theApp.downloadqueue->Init();
}
catch(...){
ASSERT(0);
LogError(LOG_STATUSBAR,_T("Failed to initialize download queue - Unknown exception"));
bError = true;
}
if(!theApp.listensocket->StartListening()){
LogError(LOG_STATUSBAR, GetResString(IDS_MAIN_SOCKETERROR),thePrefs.GetPort());
bError = true;
}
if(!theApp.clientudp->Create()){
LogError(LOG_STATUSBAR, GetResString(IDS_MAIN_SOCKETERROR),thePrefs.GetUDPPort());
bError = true;
}
if ((thePrefs.GetTotalDownloaded()>50000 && thePrefs.GetTotalUploaded()>0) && ((thePrefs.GetTotalDownloaded()/thePrefs.GetTotalUploaded())>1)){
AddLogLine(true, GetResString(IDS_YOUR_UDR),(float)(thePrefs.GetTotalDownloaded())/(thePrefs.GetTotalUploaded())); //VeryCD版
AddLogLine(true, GetResString(IDS_MOREUPLOAD)); //VeryCD版
theApp.emuledlg->ShowNotifier(GetResString(IDS_MOREUPLOAD), TBN_SERVERMSG);
}
if (!bError) // show the success msg, only if we had no serious error
AddLogLine(true, GetResString(IDS_MAIN_READY),theApp.m_strCurVersionLong);
if(thePrefs.DoAutoConnect())
theApp.emuledlg->OnBnClickedButton2();
theApp.emuledlg->status++;
break;
}
case 5:
break;
default:
theApp.emuledlg->StopTimer();
}
}
CATCH_DFLT_EXCEPTIONS(_T("CemuleDlg::StartupTimer"))
}
void CemuleDlg::StopTimer(){
try {
if (m_hTimer){
::KillTimer(NULL, m_hTimer);
m_hTimer = 0;
}
}
catch (...){
ASSERT(0);
}
if (thePrefs.UpdateNotify()) DoVersioncheck(false);
if (theApp.pendinglink){
OnWMData(NULL,(LPARAM) &theApp.sendstruct);//changed by Cax2 28/10/02
delete theApp.pendinglink;
}
}
void CemuleDlg::OnSysCommand(UINT nID, LPARAM lParam){
// Systemmenu-Speedselector
if (nID>=MP_QS_U10 && nID<=10512) {
QuickSpeedUpload(nID);
return;
}
if (nID>=MP_QS_D10 && nID<=10531) {
QuickSpeedDownload(nID);
return;
}
if (nID==MP_QS_PA || nID==MP_QS_UA) {
QuickSpeedOther(nID);
return;
}
switch (nID /*& 0xFFF0*/){
case MP_ABOUTBOX : {
CCreditsDlg dlgAbout;
dlgAbout.DoModal();
break;
}
case MP_VERSIONCHECK:
DoVersioncheck(true);
break;
case MP_CONNECT : {
StartConnection();
break;
}
case MP_DISCONNECT : {
CloseConnection();
break;
}
default:{
CTrayDialog::OnSysCommand(nID, lParam);
}
}
if (
(nID & 0xFFF0) == SC_MINIMIZE ||
(nID & 0xFFF0) == SC_MINIMIZETRAY ||
(nID & 0xFFF0) == SC_RESTORE ||
(nID & 0xFFF0) == SC_MAXIMIZE ) {
ShowTransferRate(true);
ShowPing();
transferwnd->UpdateCatTabTitles();
}
}
void CemuleDlg::PostStartupMinimized()
{
if (!m_bStartMinimizedChecked)
{
//TODO: Use full initialized 'WINDOWPLACEMENT' and remove the 'OnCancel' call...
// Isn't that easy.. Read comments in OnInitDialog..
m_bStartMinimizedChecked = true;
if (m_bStartMinimized)
{
if (theApp.DidWeAutoStart())
{
if (!thePrefs.mintotray) {
thePrefs.mintotray = true;
OnCancel();
thePrefs.mintotray = false;
}
else
OnCancel();
}
else
OnCancel();
}
}
}
void CemuleDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this);
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
dc.DrawIcon(x, y, m_hIcon);
}
else
CTrayDialog::OnPaint();
}
HCURSOR CemuleDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CemuleDlg::OnBnClickedButton2(){
if (!theApp.IsConnected())
//connect if not currently connected
if (!theApp.serverconnect->IsConnecting() && !Kademlia::CKademlia::isRunning() ){
StartConnection();
}
else {
CloseConnection();
}
else{
//disconnect if currently connected
CloseConnection();
}
}
void CemuleDlg::ResetLog(){
serverwnd->logbox->Reset();
}
void CemuleDlg::ResetDebugLog(){
serverwnd->debuglog->Reset();
}
void CemuleDlg::AddLogText(UINT uFlags, LPCTSTR pszText)
{
if (GetCurrentThreadId() != _uMainThreadId)
{
theApp.QueueLogLineEx(uFlags, _T("%s"), pszText);
return;
}
if (uFlags & LOG_STATUSBAR)
{
if (statusbar->m_hWnd /*&& ready*/)
{
if (theApp.m_app_state != APP_STATE_SHUTINGDOWN)
statusbar->SetText(pszText, SBarLog, 0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -