📄 muletoolbarctrl.cpp
字号:
//this file is part of eMule
//Copyright (C)2002 Merkur ( devs@emule-project.net / http://www.emule-project.net )
//
//This program 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.
//
//This program 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 this program; if not, write to the Free Software
//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include "stdafx.h"
#include "emule.h"
#include "MuleToolbarCtrl.h"
#include "SearchDlg.h"
#include "KademliaWnd.h"
#include "VeryCD/chanblardbrowser.h" //VeryCD
#include "EnBitmap.h"
#include "OtherFunctions.h"
#include "emuledlg.h"
#include "Sockets.h"
#include "MenuCmds.h"
#include "MuleStatusbarCtrl.h"
#include "ServerWnd.h"
#include "TransferWnd.h"
#include "SharedFilesWnd.h"
#include "ChatWnd.h"
#include "IrcWnd.h"
#include "StatisticsDlg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#if (_WIN32_IE < 0x0500)
#define TBN_INITCUSTOMIZE (TBN_FIRST - 23)
#define TBNRF_HIDEHELP 0x00000001
#endif
#define EMULTB_BASEEXT _T("eMuleToolbar.kad02")
static const LPCTSTR _apszTBFiles[] =
{
_T("*.") EMULTB_BASEEXT _T(".bmp"),
_T("*.") EMULTB_BASEEXT _T(".gif"),
_T("*.") EMULTB_BASEEXT _T(".png")
};
static const LPCTSTR _apszSkinFiles[] =
{
_T("*.") EMULSKIN_BASEEXT _T(".ini"),
};
static int _iPreviousHeight = 0;
// CMuleToolbarCtrl
IMPLEMENT_DYNAMIC(CMuleToolbarCtrl, CToolBarCtrl)
CMuleToolbarCtrl::CMuleToolbarCtrl()
{
m_iLastPressedButton = -1;
m_buttoncount=0;
memset(TBButtons, 0, sizeof(TBButtons));
memset(TBStrings, 0, sizeof(TBStrings));
m_iToolbarLabelSettings = 0;
}
CMuleToolbarCtrl::~CMuleToolbarCtrl()
{
}
BEGIN_MESSAGE_MAP(CMuleToolbarCtrl, CToolBarCtrl)
ON_WM_SIZE()
ON_NOTIFY_REFLECT(NM_RCLICK, OnNMRclick)
ON_NOTIFY_REFLECT(TBN_QUERYDELETE, OnTbnQueryDelete)
ON_NOTIFY_REFLECT(TBN_QUERYINSERT, OnTbnQueryInsert)
ON_NOTIFY_REFLECT(TBN_GETBUTTONINFO, OnTbnGetButtonInfo)
ON_NOTIFY_REFLECT(TBN_TOOLBARCHANGE, OnTbnToolbarChange)
ON_NOTIFY_REFLECT(TBN_RESET, OnTbnReset)
ON_NOTIFY_REFLECT(TBN_INITCUSTOMIZE, OnTbnInitCustomize)
ON_WM_SYSCOLORCHANGE()
END_MESSAGE_MAP()
void CMuleToolbarCtrl::Init(void)
{
bitmappaths.RemoveAll();
ModifyStyle(0, TBSTYLE_FLAT | CCS_ADJUSTABLE | TBSTYLE_TRANSPARENT | CCS_NODIVIDER);
ChangeToolbarBitmap(thePrefs.GetToolbarBitmapSettings(), false);
// add button-text:
TCHAR cButtonStrings[2000];
int lLen, lLen2;
m_buttoncount=0;
_tcscpy(cButtonStrings, GetResString(IDS_MAIN_BTN_CONNECT));
lLen = _tcslen(GetResString(IDS_MAIN_BTN_CONNECT)) + 1;
++m_buttoncount;
lLen2 = _tcslen(GetResString(IDS_EM_KADEMLIA)) + 1;
memcpy(cButtonStrings+lLen, GetResString(IDS_EM_KADEMLIA), lLen2*sizeof(TCHAR));
lLen += lLen2;
++m_buttoncount;
lLen2 = _tcslen(GetResString(IDS_EM_SERVER)) + 1;
memcpy(cButtonStrings+lLen, GetResString(IDS_EM_SERVER), lLen2*sizeof(TCHAR));
lLen += lLen2;
++m_buttoncount;
lLen2 = _tcslen(GetResString(IDS_EM_TRANS)) + 1;
memcpy(cButtonStrings+lLen, GetResString(IDS_EM_TRANS), lLen2*sizeof(TCHAR));
lLen += lLen2;
++m_buttoncount;
lLen2 = _tcslen(GetResString(IDS_EM_SEARCH)) + 1;
memcpy(cButtonStrings+lLen, GetResString(IDS_EM_SEARCH), lLen2*sizeof(TCHAR));
lLen += lLen2;
++m_buttoncount;
lLen2 = _tcslen(GetResString(IDS_EM_FILES)) + 1;
memcpy(cButtonStrings+lLen, GetResString(IDS_EM_FILES), lLen2*sizeof(TCHAR));
lLen += lLen2;
++m_buttoncount;
lLen2 = _tcslen(GetResString(IDS_EM_MESSAGES)) + 1;
memcpy(cButtonStrings+lLen, GetResString(IDS_EM_MESSAGES), lLen2*sizeof(TCHAR));
lLen += lLen2;
++m_buttoncount;
lLen2 = _tcslen(GetResString(IDS_IRC)) + 1;
memcpy(cButtonStrings+lLen, GetResString(IDS_IRC), lLen2*sizeof(TCHAR));
lLen += lLen2;
++m_buttoncount;
lLen2 = _tcslen(GetResString(IDS_EM_STATISTIC)) + 1;
memcpy(cButtonStrings+lLen, GetResString(IDS_EM_STATISTIC), lLen2*sizeof(TCHAR));
lLen += lLen2;
++m_buttoncount;
lLen2 = _tcslen(GetResString(IDS_EM_PREFS)) + 1;
memcpy(cButtonStrings+lLen, GetResString(IDS_EM_PREFS), lLen2*sizeof(TCHAR));
lLen += lLen2;
++m_buttoncount;
lLen2 = _tcslen(GetResString(IDS_TOOLS)) + 1;
memcpy(cButtonStrings+lLen, GetResString(IDS_TOOLS), lLen2*sizeof(TCHAR));
lLen += lLen2;
++m_buttoncount;
lLen2 = _tcslen(GetResString(IDS_EM_HELP)) + 1;
memcpy(cButtonStrings+lLen, GetResString(IDS_EM_HELP), lLen2*sizeof(TCHAR));
lLen += lLen2;
++m_buttoncount;
lLen2 = _tcslen(GetResString(IDS_EM_BROWSER)) + 1; //VeryCD
memcpy(cButtonStrings+lLen, GetResString(IDS_EM_BROWSER), lLen2);
lLen += lLen2;
++m_buttoncount;
// terminate
memcpy(cButtonStrings+lLen, _T("\0"), sizeof(TCHAR));
AddStrings(cButtonStrings);
// initialize buttons:
for(int i = 0; i < m_buttoncount; i++)
{
TBButtons[i].fsState = TBSTATE_ENABLED;
TBButtons[i].fsStyle = TBSTYLE_CHECKGROUP;
TBButtons[i].idCommand = IDC_TOOLBARBUTTON + i;
TBButtons[i].iString = i;
switch(i)
{
case 0:
case 9:
case 10:
case 11:
TBButtons[i].fsStyle = TBSTYLE_BUTTON;
break;
}
}
// set button image indices
int iBitmap = 0;
for(int i = 0; i < m_buttoncount; i++)
{
TBButtons[i].iBitmap = iBitmap;
if (i == 0) // 'Connect' button has 3 states
iBitmap += 3;
else
iBitmap += 1;
}
TBBUTTON sepButton = {0};
sepButton.idCommand = 0;
sepButton.fsStyle = TBSTYLE_SEP;
sepButton.fsState = TBSTATE_ENABLED;
sepButton.iString = -1;
sepButton.iBitmap = -1;
int iAddedButtons = 0;
CString config = thePrefs.GetToolbarSettings();
for(i=0;i<config.GetLength();i+=2)
{
int index = _tstoi(config.Mid(i,2));
if(index==99)
{
AddButtons(1,&sepButton);
continue;
}
AddButtons(1,&TBButtons[index]);
iAddedButtons++;
}
// recalc toolbar-size:
Localize(); // at first we have to localize the button-text!!!
m_iToolbarLabelSettings=4;
ChangeTextLabelStyle(thePrefs.GetToolbarLabelSettings(), false);
SetBtnWidth(); // then calc and set the button width
AutoSize(); // and finally call the original (but maybe obsolete) function
// add speed-meter to upper-right corner
CRect rClient;
GetClientRect(&rClient);
rClient.DeflateRect(7,7);
int iHeight = rClient.Height();
rClient.left = rClient.right - iHeight * 2;
// resize speed-meter
CRect rcWnd;
GetWindowRect(&rcWnd);
OnSize(0, rcWnd.Width(), rcWnd.Height());
theApp.emuledlg->SetButtonState();
GetWindowRect(&rcWnd);
_iPreviousHeight = rcWnd.Height();
}
void CMuleToolbarCtrl::Localize(void)
{
if(m_hWnd)
{
static const int TBStringIDs[]={
IDS_EM_KADEMLIA,
IDS_EM_SERVER,
IDS_EM_TRANS,
IDS_EM_SEARCH,
IDS_EM_FILES,
IDS_EM_MESSAGES,
IDS_IRC,
IDS_EM_STATISTIC,
IDS_EM_PREFS,
IDS_TOOLS,
IDS_EM_HELP,
IDS_EM_BROWSER,//VeryCD
};
TBBUTTONINFO tbi;
tbi.dwMask = TBIF_TEXT;
tbi.cbSize = sizeof (TBBUTTONINFO);
CString buffer;
if(theApp.serverconnect->IsConnected())
buffer = GetResString(IDS_MAIN_BTN_DISCONNECT);
else if(theApp.serverconnect->IsConnecting())
buffer = GetResString(IDS_MAIN_BTN_CANCEL);
else
buffer = GetResString(IDS_MAIN_BTN_CONNECT);
_stprintf(TBStrings[0], _T("%s"), buffer);
tbi.pszText = TBStrings[0];
SetButtonInfo(IDC_TOOLBARBUTTON+0, &tbi);
for (int i = 1; i < m_buttoncount; i++)
{
buffer = GetResString(TBStringIDs[i-1]); // EC
_stprintf(TBStrings[i], _T("%s"), buffer);
tbi.pszText = TBStrings[i];
SetButtonInfo(IDC_TOOLBARBUTTON+i, &tbi);
}
AutoSize();
SetBtnWidth();
}
}
void CMuleToolbarCtrl::OnSize(UINT nType, int cx, int cy)
{
CToolBarCtrl::OnSize(nType, cx, cy);
SetBtnWidth();
AutoSize();
}
void CMuleToolbarCtrl::SetBtnWidth()
{
if(m_iToolbarLabelSettings==1)
{
CDC *pDC = GetDC();
CFont *pFnt = GetFont();
CFont *pOldFnt = pDC->SelectObject(pFnt);
CRect r(0,0,0,0);
// calculate the max. possible button-size
int iCalcSize = 0;
for(int i = 0; i < m_buttoncount ; i++)
if(!IsButtonHidden(IDC_TOOLBARBUTTON+i))
{
pDC->DrawText(TBStrings[i], -1, r, DT_SINGLELINE | DT_CALCRECT);
if (r.Width() > iCalcSize)
iCalcSize = r.Width();
}
iCalcSize += 10;
pDC->SelectObject(pOldFnt);
ReleaseDC(pDC); // FoRcHa
GetClientRect(&r);
int bc=GetButtonCount(); if (bc==0) bc=1;
int iMaxPossible = r.Width() / bc;
// if the buttons are to big, reduze their size
if(iCalcSize > iMaxPossible)
iCalcSize = iMaxPossible;
SetButtonWidth(iCalcSize, iCalcSize);
}
else
{
SetButtonSize(CSize(0,0));
SetButtonWidth(0,0);
}
}
void CMuleToolbarCtrl::OnNMRclick(NMHDR *pNMHDR, LRESULT *pResult)
{
if (GetKeyState(VK_CONTROL) & 0x8000)
{
if (!thePrefs.GetToolbarBitmapSettings().IsEmpty())
ChangeToolbarBitmap(thePrefs.GetToolbarBitmapSettings(), true);
if (!CString(thePrefs.GetSkinProfile()).IsEmpty())
theApp.ApplySkin(thePrefs.GetSkinProfile());
*pResult = TRUE;
return;
}
POINT point;
GetCursorPos (&point);
CMenu m_ToolbarMenu;
m_ToolbarMenu.CreatePopupMenu();
CMenu m_BitmapsMenu;
m_BitmapsMenu.CreateMenu();
m_BitmapsMenu.AppendMenu(MF_STRING,MP_SELECTTOOLBARBITMAP, GetResString(IDS_SELECTTOOLBARBITMAP));
m_BitmapsMenu.AppendMenu(MF_STRING,MP_SELECTTOOLBARBITMAPDIR, GetResString(IDS_SELECTTOOLBARBITMAPDIR));
m_BitmapsMenu.AppendMenu(MF_SEPARATOR);
m_BitmapsMenu.AppendMenu(MF_STRING,MP_TOOLBARBITMAP,GetResString(IDS_DEFAULT));
bitmappaths.RemoveAll();
CString currentBitmapSettings = thePrefs.GetToolbarBitmapSettings();
bool checked=false;
if(currentBitmapSettings=="")
{
m_BitmapsMenu.CheckMenuItem(MP_TOOLBARBITMAP,MF_CHECKED);
m_BitmapsMenu.EnableMenuItem(MP_TOOLBARBITMAP,MF_DISABLED);
checked=true;
}
bitmappaths.Add(_T(""));
int i = 1;
if (!thePrefs.GetToolbarBitmapFolderSettings().IsEmpty())
{
for (int f = 0; f < ARRSIZE(_apszTBFiles); f++)
{
bool bFinished = false;
WIN32_FIND_DATA FileData;
HANDLE hSearch = FindFirstFile(thePrefs.GetToolbarBitmapFolderSettings() + CString(_T("\\")) + _apszTBFiles[f], &FileData);
if (hSearch == INVALID_HANDLE_VALUE)
bFinished = true;
for (/**/; !bFinished && i < 50; i++)
{
CString bitmapFileName = FileData.cFileName;
CString bitmapBaseName;
int iExt = bitmapFileName.Find(EMULTB_BASEEXT);
if (iExt > 0)
bitmapBaseName = bitmapFileName.Left(iExt - 1);
else
bitmapBaseName = bitmapFileName;
m_BitmapsMenu.AppendMenu(MF_STRING, MP_TOOLBARBITMAP + i, bitmapBaseName);
bitmappaths.Add(thePrefs.GetToolbarBitmapFolderSettings() + CString(_T("\\")) + bitmapFileName);
if (!checked && currentBitmapSettings == bitmappaths[i])
{
m_BitmapsMenu.CheckMenuItem(MP_TOOLBARBITMAP+i, MF_CHECKED);
m_BitmapsMenu.EnableMenuItem(MP_TOOLBARBITMAP+i, MF_DISABLED);
checked = true;
}
if (!FindNextFile(hSearch, &FileData))
bFinished = true;
}
FindClose(hSearch);
}
}
if(!checked)
{
m_BitmapsMenu.AppendMenu(MF_STRING,MP_TOOLBARBITMAP+i,currentBitmapSettings);
m_BitmapsMenu.CheckMenuItem(MP_TOOLBARBITMAP+i,MF_CHECKED);
m_BitmapsMenu.EnableMenuItem(MP_TOOLBARBITMAP+i,MF_DISABLED);
bitmappaths.Add(currentBitmapSettings);
}
m_ToolbarMenu.AppendMenu(MF_STRING|MF_POPUP,(UINT_PTR)m_BitmapsMenu.m_hMenu, GetResString(IDS_TOOLBARSKINS));
CMenu m_SkinsMenu;
m_SkinsMenu.CreateMenu();
m_SkinsMenu.AppendMenu(MF_STRING,MP_SELECT_SKIN_FILE, GetResString(IDS_SEL_SKIN));
m_SkinsMenu.AppendMenu(MF_STRING,MP_SELECT_SKIN_DIR, GetResString(IDS_SEL_SKINDIR));
m_SkinsMenu.AppendMenu(MF_SEPARATOR);
m_SkinsMenu.AppendMenu(MF_STRING,MP_SKIN_PROFILE,GetResString(IDS_DEFAULT));
aSkinPaths.RemoveAll();
CString currentSkin = thePrefs.GetSkinProfile();
checked=false;
if(currentSkin=="")
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -