📄 winutil.cpp
字号:
/*
* Copyright (C) 2001-2006 Jacek Sieka, arnetheduck on gmail point com
*
* 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "stdafx.h"
#include "../client/DCPlusPlus.h"
#include "Resource.h"
#define COMPILE_MULTIMON_STUBS 1
#include <MultiMon.h>
#include "WinUtil.h"
#include "PrivateFrame.h"
#include "SearchFrm.h"
#include "LineDlg.h"
#include "../client/Util.h"
#include "../client/StringTokenizer.h"
#include "../client/ShareManager.h"
#include "../client/ClientManager.h"
#include "../client/TimerManager.h"
#include "../client/FavoriteManager.h"
#include "../client/ResourceManager.h"
#include "../client/QueueManager.h"
#include "../client/UploadManager.h"
#include "../client/HashManager.h"
#include "../client/LogManager.h"
#include "../client/version.h"
#include "HubFrame.h"
#include "MagnetDlg.h"
WinUtil::ImageMap WinUtil::fileIndexes;
int WinUtil::fileImageCount;
HBRUSH WinUtil::bgBrush = NULL;
COLORREF WinUtil::textColor = 0;
COLORREF WinUtil::bgColor = 0;
HFONT WinUtil::font = NULL;
int WinUtil::fontHeight = 0;
HFONT WinUtil::boldFont = NULL;
HFONT WinUtil::systemFont = NULL;
HFONT WinUtil::monoFont = NULL;
CMenu WinUtil::mainMenu;
CImageList WinUtil::fileImages;
CImageList WinUtil::userImages;
int WinUtil::dirIconIndex = 0;
int WinUtil::dirMaskedIndex = 0;
TStringList WinUtil::lastDirs;
HWND WinUtil::mainWnd = NULL;
HWND WinUtil::mdiClient = NULL;
FlatTabCtrl* WinUtil::tabCtrl = NULL;
HHOOK WinUtil::hook = NULL;
tstring WinUtil::tth;
StringPairList WinUtil::initialDirs;
DWORD WinUtil::helpCookie = 0;
bool WinUtil::urlDcADCRegistered = false;
bool WinUtil::urlMagnetRegistered = false;
HLSCOLOR RGB2HLS (COLORREF rgb) {
unsigned char minval = min(GetRValue(rgb), min(GetGValue(rgb), GetBValue(rgb)));
unsigned char maxval = max(GetRValue(rgb), max(GetGValue(rgb), GetBValue(rgb)));
float mdiff = float(maxval) - float(minval);
float msum = float(maxval) + float(minval);
float luminance = msum / 510.0f;
float saturation = 0.0f;
float hue = 0.0f;
if ( maxval != minval ) {
float rnorm = (maxval - GetRValue(rgb) ) / mdiff;
float gnorm = (maxval - GetGValue(rgb)) / mdiff;
float bnorm = (maxval - GetBValue(rgb) ) / mdiff;
saturation = (luminance <= 0.5f) ? (mdiff / msum) : (mdiff / (510.0f - msum));
if (GetRValue(rgb) == maxval) hue = 60.0f * (6.0f + bnorm - gnorm);
if (GetGValue(rgb) == maxval) hue = 60.0f * (2.0f + rnorm - bnorm);
if (GetBValue(rgb) == maxval) hue = 60.0f * (4.0f + gnorm - rnorm);
if (hue > 360.0f) hue = hue - 360.0f;
}
return HLS ((hue*255)/360, luminance*255, saturation*255);
}
static BYTE _ToRGB (float rm1, float rm2, float rh) {
if (rh > 360.0f) rh -= 360.0f;
else if (rh < 0.0f) rh += 360.0f;
if (rh < 60.0f) rm1 = rm1 + (rm2 - rm1) * rh / 60.0f;
else if (rh < 180.0f) rm1 = rm2;
else if (rh < 240.0f) rm1 = rm1 + (rm2 - rm1) * (240.0f - rh) / 60.0f;
return (BYTE)(rm1 * 255);
}
COLORREF HLS2RGB (HLSCOLOR hls) {
float hue = ((int)HLS_H(hls)*360)/255.0f;
float luminance = HLS_L(hls)/255.0f;
float saturation = HLS_S(hls)/255.0f;
if ( saturation == 0.0f ) {
return RGB (HLS_L(hls), HLS_L(hls), HLS_L(hls));
}
float rm1, rm2;
if ( luminance <= 0.5f ) rm2 = luminance + luminance * saturation;
else rm2 = luminance + saturation - luminance * saturation;
rm1 = 2.0f * luminance - rm2;
BYTE red = _ToRGB (rm1, rm2, hue + 120.0f);
BYTE green = _ToRGB (rm1, rm2, hue);
BYTE blue = _ToRGB (rm1, rm2, hue - 120.0f);
return RGB (red, green, blue);
}
COLORREF HLS_TRANSFORM (COLORREF rgb, int percent_L, int percent_S) {
HLSCOLOR hls = RGB2HLS (rgb);
BYTE h = HLS_H(hls);
BYTE l = HLS_L(hls);
BYTE s = HLS_S(hls);
if ( percent_L > 0 ) {
l = BYTE(l + ((255 - l) * percent_L) / 100);
} else if ( percent_L < 0 ) {
l = BYTE((l * (100+percent_L)) / 100);
}
if ( percent_S > 0 ) {
s = BYTE(s + ((255 - s) * percent_S) / 100);
} else if ( percent_S < 0 ) {
s = BYTE((s * (100+percent_S)) / 100);
}
return HLS2RGB (HLS(h, l, s));
}
void UserInfoBase::matchQueue() {
try {
QueueManager::getInstance()->addList(user, QueueItem::FLAG_MATCH_QUEUE);
} catch(const Exception& e) {
LogManager::getInstance()->message(e.getError());
}
}
void UserInfoBase::getList() {
try {
QueueManager::getInstance()->addList(user, QueueItem::FLAG_CLIENT_VIEW);
} catch(const Exception& e) {
LogManager::getInstance()->message(e.getError());
}
}
void UserInfoBase::browseList() {
if(user->getCID().isZero())
return;
try {
QueueManager::getInstance()->addPfs(user, "");
} catch(const Exception& e) {
LogManager::getInstance()->message(e.getError());
}
}
void UserInfoBase::addFav() {
FavoriteManager::getInstance()->addFavoriteUser(user);
}
void UserInfoBase::pm() {
PrivateFrame::openWindow(user);
}
void UserInfoBase::grant() {
UploadManager::getInstance()->reserveSlot(user);
}
void UserInfoBase::removeAll() {
QueueManager::getInstance()->removeSource(user, QueueItem::Source::FLAG_REMOVED);
}
bool WinUtil::getVersionInfo(OSVERSIONINFOEX& ver) {
memset(&ver, 0, sizeof(OSVERSIONINFOEX));
ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
if(!GetVersionEx((OSVERSIONINFO*)&ver)) {
ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if(!GetVersionEx((OSVERSIONINFO*)&ver)) {
return false;
}
}
return true;
}
static LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam) {
if(code == HC_ACTION) {
if(wParam == VK_CONTROL && LOWORD(lParam) == 1) {
if(lParam & 0x80000000) {
WinUtil::tabCtrl->endSwitch();
} else {
WinUtil::tabCtrl->startSwitch();
}
}
}
return CallNextHookEx(WinUtil::hook, code, wParam, lParam);
}
void WinUtil::init(HWND hWnd) {
mainWnd = hWnd;
mainMenu.CreateMenu();
CMenuHandle file;
file.CreatePopupMenu();
file.AppendMenu(MF_STRING, IDC_OPEN_FILE_LIST, CTSTRING(MENU_OPEN_FILE_LIST));
file.AppendMenu(MF_STRING, IDC_OPEN_OWN_LIST, CTSTRING(MENU_OPEN_OWN_LIST));
file.AppendMenu(MF_STRING, IDC_REFRESH_FILE_LIST, CTSTRING(MENU_REFRESH_FILE_LIST));
file.AppendMenu(MF_STRING, IDC_OPEN_DOWNLOADS, CTSTRING(MENU_OPEN_DOWNLOADS_DIR));
file.AppendMenu(MF_SEPARATOR);
file.AppendMenu(MF_STRING, ID_FILE_QUICK_CONNECT, CTSTRING(MENU_QUICK_CONNECT));
file.AppendMenu(MF_STRING, IDC_FOLLOW, CTSTRING(MENU_FOLLOW_REDIRECT));
file.AppendMenu(MF_STRING, ID_FILE_RECONNECT, CTSTRING(MENU_RECONNECT));
file.AppendMenu(MF_SEPARATOR);
file.AppendMenu(MF_STRING, ID_FILE_SETTINGS, CTSTRING(MENU_SETTINGS));
file.AppendMenu(MF_SEPARATOR);
file.AppendMenu(MF_STRING, ID_APP_EXIT, CTSTRING(MENU_EXIT));
mainMenu.AppendMenu(MF_POPUP, (UINT_PTR)(HMENU)file, CTSTRING(MENU_FILE));
CMenuHandle view;
view.CreatePopupMenu();
view.AppendMenu(MF_STRING, ID_FILE_CONNECT, CTSTRING(MENU_PUBLIC_HUBS));
view.AppendMenu(MF_STRING, IDC_QUEUE, CTSTRING(MENU_DOWNLOAD_QUEUE));
view.AppendMenu(MF_STRING, IDC_VIEW_WAITING_USERS, CTSTRING(WAITING_USERS));
view.AppendMenu(MF_STRING, IDC_FINISHED, CTSTRING(FINISHED_DOWNLOADS));
view.AppendMenu(MF_STRING, IDC_FINISHED_UL, CTSTRING(FINISHED_UPLOADS));
view.AppendMenu(MF_STRING, IDC_FAVORITES, CTSTRING(MENU_FAVORITE_HUBS));
view.AppendMenu(MF_STRING, IDC_FAVUSERS, CTSTRING(MENU_FAVORITE_USERS));
view.AppendMenu(MF_STRING, ID_FILE_SEARCH, CTSTRING(MENU_SEARCH));
view.AppendMenu(MF_STRING, IDC_FILE_ADL_SEARCH, CTSTRING(MENU_ADL_SEARCH));
view.AppendMenu(MF_STRING, IDC_SEARCH_SPY, CTSTRING(MENU_SEARCH_SPY));
view.AppendMenu(MF_STRING, IDC_NET_STATS, CTSTRING(MENU_NETWORK_STATISTICS));
view.AppendMenu(MF_STRING, IDC_NOTEPAD, CTSTRING(MENU_NOTEPAD));
view.AppendMenu(MF_STRING, IDC_HASH_PROGRESS, CTSTRING(MENU_HASH_PROGRESS));
view.AppendMenu(MF_STRING, IDC_SYSTEM_LOG, CTSTRING(MENU_SYSTEM_LOG));
view.AppendMenu(MF_SEPARATOR);
view.AppendMenu(MF_STRING, ID_VIEW_TOOLBAR, CTSTRING(MENU_TOOLBAR));
view.AppendMenu(MF_STRING, ID_VIEW_STATUS_BAR, CTSTRING(MENU_STATUS_BAR));
view.AppendMenu(MF_STRING, ID_VIEW_TRANSFER_VIEW, CTSTRING(MENU_TRANSFER_VIEW));
mainMenu.AppendMenu(MF_POPUP, (UINT_PTR)(HMENU)view, CTSTRING(MENU_VIEW));
CMenuHandle window;
window.CreatePopupMenu();
window.AppendMenu(MF_STRING, ID_WINDOW_CASCADE, CTSTRING(MENU_CASCADE));
window.AppendMenu(MF_STRING, ID_WINDOW_TILE_HORZ, CTSTRING(MENU_HORIZONTAL_TILE));
window.AppendMenu(MF_STRING, ID_WINDOW_TILE_VERT, CTSTRING(MENU_VERTICAL_TILE));
window.AppendMenu(MF_STRING, ID_WINDOW_ARRANGE, CTSTRING(MENU_ARRANGE));
window.AppendMenu(MF_STRING, ID_WINDOW_MINIMIZE_ALL, CTSTRING(MENU_MINIMIZE_ALL));
window.AppendMenu(MF_STRING, ID_WINDOW_RESTORE_ALL, CTSTRING(MENU_RESTORE_ALL));
window.AppendMenu(MF_SEPARATOR);
window.AppendMenu(MF_STRING, IDC_CLOSE_DISCONNECTED, CTSTRING(MENU_CLOSE_DISCONNECTED));
window.AppendMenu(MF_STRING, IDC_CLOSE_ALL_PM, CTSTRING(MENU_CLOSE_ALL_PM));
window.AppendMenu(MF_STRING, IDC_CLOSE_ALL_OFFLINE_PM, CTSTRING(MENU_CLOSE_ALL_OFFLINE_PM));
window.AppendMenu(MF_STRING, IDC_CLOSE_ALL_DIR_LIST, CTSTRING(MENU_CLOSE_ALL_DIR_LIST));
window.AppendMenu(MF_STRING, IDC_CLOSE_ALL_SEARCH_FRAME, CTSTRING(MENU_CLOSE_ALL_SEARCHFRAME));
mainMenu.AppendMenu(MF_POPUP, (UINT_PTR)(HMENU)window, CTSTRING(MENU_WINDOW));
CMenuHandle help;
help.CreatePopupMenu();
help.AppendMenu(MF_STRING, IDC_HELP_CONTENTS, CTSTRING(MENU_CONTENTS));
help.AppendMenu(MF_SEPARATOR);
help.AppendMenu(MF_STRING, IDC_HELP_CHANGELOG, CTSTRING(MENU_CHANGELOG));
help.AppendMenu(MF_STRING, ID_APP_ABOUT, CTSTRING(MENU_ABOUT));
help.AppendMenu(MF_SEPARATOR);
help.AppendMenu(MF_STRING, IDC_HELP_HOMEPAGE, CTSTRING(MENU_HOMEPAGE));
help.AppendMenu(MF_STRING, IDC_HELP_DOWNLOADS, CTSTRING(MENU_HELP_DOWNLOADS));
help.AppendMenu(MF_STRING, IDC_HELP_GEOIPFILE, CTSTRING(MENU_HELP_GEOIPFILE));
help.AppendMenu(MF_STRING, IDC_HELP_TRANSLATIONS, CTSTRING(MENU_HELP_TRANSLATIONS));
help.AppendMenu(MF_STRING, IDC_HELP_FAQ, CTSTRING(MENU_FAQ));
help.AppendMenu(MF_STRING, IDC_HELP_HELP_FORUM, CTSTRING(MENU_HELP_FORUM));
help.AppendMenu(MF_STRING, IDC_HELP_DISCUSS, CTSTRING(MENU_DISCUSS));
help.AppendMenu(MF_STRING, IDC_HELP_REQUEST_FEATURE, CTSTRING(MENU_REQUEST_FEATURE));
help.AppendMenu(MF_STRING, IDC_HELP_REPORT_BUG, CTSTRING(MENU_REPORT_BUG));
help.AppendMenu(MF_STRING, IDC_HELP_DONATE, CTSTRING(MENU_DONATE));
mainMenu.AppendMenu(MF_POPUP, (UINT_PTR)(HMENU)help, CTSTRING(MENU_HELP));
/** @todo fix this so that the system icon is used for dirs as well (we need
to mask it so that incomplete folders appear correct */
#if 0
if(BOOLSETTING(USE_SYSTEM_ICONS)) {
SHFILEINFO fi;
fileImages.Create(16, 16, ILC_COLOR32 | ILC_MASK, 16, 16);
::SHGetFileInfo(_T("."), FILE_ATTRIBUTE_DIRECTORY, &fi, sizeof(fi), SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES);
fileImages.AddIcon(fi.hIcon);
fileImages.AddIcon(ic);
::DestroyIcon(fi.hIcon);
} else {
fileImages.CreateFromImage(IDB_FOLDERS, 16, 3, CLR_DEFAULT, IMAGE_BITMAP, LR_CREATEDIBSECTION | LR_SHARED);
}
#endif
fileImages.CreateFromImage(IDB_FOLDERS, 16, 3, CLR_DEFAULT, IMAGE_BITMAP, LR_CREATEDIBSECTION | LR_SHARED);
dirIconIndex = fileImageCount++;
dirMaskedIndex = fileImageCount++;
fileImageCount++;
userImages.CreateFromImage(IDB_USERS, 16, 8, CLR_DEFAULT, IMAGE_BITMAP, LR_CREATEDIBSECTION | LR_SHARED);
LOGFONT lf, lf2;
::GetObject((HFONT)GetStockObject(DEFAULT_GUI_FONT), sizeof(lf), &lf);
SettingsManager::getInstance()->setDefault(SettingsManager::TEXT_FONT, Text::fromT(encodeFont(lf)));
decodeFont(Text::toT(SETTING(TEXT_FONT)), lf);
::GetObject((HFONT)GetStockObject(ANSI_FIXED_FONT), sizeof(lf2), &lf2);
lf2.lfHeight = lf.lfHeight;
lf2.lfWeight = lf.lfWeight;
lf2.lfItalic = lf.lfItalic;
bgBrush = CreateSolidBrush(SETTING(BACKGROUND_COLOR));
textColor = SETTING(TEXT_COLOR);
bgColor = SETTING(BACKGROUND_COLOR);
font = ::CreateFontIndirect(&lf);
fontHeight = WinUtil::getTextHeight(mainWnd, font);
lf.lfWeight = FW_BOLD;
boldFont = ::CreateFontIndirect(&lf);
systemFont = (HFONT)::GetStockObject(DEFAULT_GUI_FONT);
monoFont = (HFONT)::GetStockObject(BOOLSETTING(USE_OEM_MONOFONT)?OEM_FIXED_FONT:ANSI_FIXED_FONT);
if(BOOLSETTING(URL_HANDLER)) {
registerDchubHandler();
registerADChubHandler();
urlDcADCRegistered = true;
}
if(BOOLSETTING(MAGNET_REGISTER)) {
registerMagnetHandler();
urlMagnetRegistered = true;
}
hook = SetWindowsHookEx(WH_KEYBOARD, &KeyboardProc, NULL, GetCurrentThreadId());
HtmlHelp(NULL, NULL, HH_INITIALIZE, (DWORD)&helpCookie);
}
void WinUtil::uninit() {
HtmlHelp(NULL, NULL, HH_UNINITIALIZE, helpCookie);
fileImages.Destroy();
userImages.Destroy();
::DeleteObject(font);
::DeleteObject(boldFont);
::DeleteObject(bgBrush);
::DeleteObject(monoFont);
mainMenu.DestroyMenu();
UnhookWindowsHookEx(hook);
}
void WinUtil::decodeFont(const tstring& setting, LOGFONT &dest) {
StringTokenizer<tstring> st(setting, _T(','));
TStringList &sl = st.getTokens();
::GetObject((HFONT)GetStockObject(DEFAULT_GUI_FONT), sizeof(dest), &dest);
tstring face;
if(sl.size() == 4)
{
face = sl[0];
dest.lfHeight = Util::toInt(Text::fromT(sl[1]));
dest.lfWeight = Util::toInt(Text::fromT(sl[2]));
dest.lfItalic = (BYTE)Util::toInt(Text::fromT(sl[3]));
}
if(!face.empty()) {
::ZeroMemory(dest.lfFaceName, LF_FACESIZE);
_tcscpy(dest.lfFaceName, face.c_str());
}
}
int CALLBACK WinUtil::browseCallbackProc(HWND hwnd, UINT uMsg, LPARAM /*lp*/, LPARAM pData) {
switch(uMsg) {
case BFFM_INITIALIZED:
SendMessage(hwnd, BFFM_SETSELECTION, TRUE, pData);
break;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -