From 4042c774bcdaa235bb787efee58df550c01c0242 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Thu, 20 Feb 2014 18:49:21 +0000 Subject: missing projects & files git-svn-id: http://svn.miranda-ng.org/main/trunk@8195 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/NewAwaySysMod/NewAwaySys_10.vcxproj | 2 - .../NewAwaySysMod/NewAwaySys_10.vcxproj.filters | 6 - plugins/NewAwaySysMod/NewAwaySys_11.vcxproj | 218 +++++++++++++ .../NewAwaySysMod/NewAwaySys_11.vcxproj.filters | 112 +++++++ plugins/NewAwaySysMod/NewAwaySys_12.vcxproj | 222 +++++++++++++ .../NewAwaySysMod/NewAwaySys_12.vcxproj.filters | 115 +++++++ plugins/NewAwaySysMod/src/AwayOpt.cpp | 9 +- plugins/NewAwaySysMod/src/GroupCheckbox.cpp | 344 +++++++++++++++++++++ plugins/NewAwaySysMod/src/GroupCheckbox.h | 26 ++ 9 files changed, 1042 insertions(+), 12 deletions(-) create mode 100644 plugins/NewAwaySysMod/NewAwaySys_11.vcxproj create mode 100644 plugins/NewAwaySysMod/NewAwaySys_11.vcxproj.filters create mode 100644 plugins/NewAwaySysMod/NewAwaySys_12.vcxproj create mode 100644 plugins/NewAwaySysMod/NewAwaySys_12.vcxproj.filters create mode 100644 plugins/NewAwaySysMod/src/GroupCheckbox.cpp create mode 100644 plugins/NewAwaySysMod/src/GroupCheckbox.h diff --git a/plugins/NewAwaySysMod/NewAwaySys_10.vcxproj b/plugins/NewAwaySysMod/NewAwaySys_10.vcxproj index 91290fef63..fa65b55588 100644 --- a/plugins/NewAwaySysMod/NewAwaySys_10.vcxproj +++ b/plugins/NewAwaySysMod/NewAwaySys_10.vcxproj @@ -191,8 +191,6 @@ - - diff --git a/plugins/NewAwaySysMod/NewAwaySys_10.vcxproj.filters b/plugins/NewAwaySysMod/NewAwaySys_10.vcxproj.filters index 7fb56a8f67..9aa019bfd9 100644 --- a/plugins/NewAwaySysMod/NewAwaySys_10.vcxproj.filters +++ b/plugins/NewAwaySysMod/NewAwaySys_10.vcxproj.filters @@ -57,12 +57,6 @@ Source Files - - Source Files - - - Source Files - Source Files diff --git a/plugins/NewAwaySysMod/NewAwaySys_11.vcxproj b/plugins/NewAwaySysMod/NewAwaySys_11.vcxproj new file mode 100644 index 0000000000..fa65b55588 --- /dev/null +++ b/plugins/NewAwaySysMod/NewAwaySys_11.vcxproj @@ -0,0 +1,218 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {6A516E27-AC50-5374-756B-A1558DB2EFA9} + NewAwaySys + + + + DynamicLibrary + Unicode + true + + + DynamicLibrary + Unicode + true + + + DynamicLibrary + Unicode + + + DynamicLibrary + Unicode + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(SolutionDir)$(Configuration)\Plugins\ + $(SolutionDir)$(Configuration)64\Plugins\ + $(SolutionDir)$(Configuration)\Obj\$(ProjectName)\ + $(SolutionDir)$(Configuration)64\Obj\$(ProjectName)\ + $(SolutionDir)$(Configuration)\Plugins\ + $(SolutionDir)$(Configuration)64\Plugins\ + $(SolutionDir)$(Configuration)\Obj\$(ProjectName)\ + $(SolutionDir)$(Configuration)64\Obj\$(ProjectName)\ + true + + + + Disabled + ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + Use + Level3 + EditAndContinue + Common.h + + + true + $(IntDir)$(TargetName).lib + Windows + false + $(SolutionDir)\lib + + + _DEBUG;%(PreprocessorDefinitions) + ..\..\include\msapi + + + + + Disabled + ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + _DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + Use + Level3 + Common.h + + + true + $(IntDir)$(TargetName).lib + Windows + false + $(SolutionDir)\lib + + + _DEBUG;%(PreprocessorDefinitions) + ..\..\include\msapi + + + + + Full + OnlyExplicitInline + ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + Sync + false + false + Use + Level3 + Size + Common.h + + + true + $(IntDir)$(TargetName).lib + true + true + Windows + false + $(SolutionDir)\lib + + + NDEBUG;%(PreprocessorDefinitions) + ..\..\include\msapi + + + + + Full + OnlyExplicitInline + ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + Sync + false + false + Use + Level3 + Size + Common.h + + + true + $(IntDir)$(TargetName).lib + true + true + Windows + false + $(SolutionDir)\lib + + + NDEBUG;%(PreprocessorDefinitions) + ..\..\include\msapi + + + + + + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/NewAwaySysMod/NewAwaySys_11.vcxproj.filters b/plugins/NewAwaySysMod/NewAwaySys_11.vcxproj.filters new file mode 100644 index 0000000000..9aa019bfd9 --- /dev/null +++ b/plugins/NewAwaySysMod/NewAwaySys_11.vcxproj.filters @@ -0,0 +1,112 @@ + + + + + {116110a1-b9f8-4995-aab2-1de50eab806f} + cpp;c;cxx;rc;def;r;odl;idl;hpj;bat + + + {7c639270-1dc0-403f-a6ba-7da092e1f885} + h;hpp;hxx;hm;inl + + + {bbdb7c3b-6f74-434a-b577-46de841df2af} + ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + {b1737ff9-4769-4f5b-b414-ee0f5256de7f} + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Documentation + + + Documentation + + + + + Resource Files + + + \ No newline at end of file diff --git a/plugins/NewAwaySysMod/NewAwaySys_12.vcxproj b/plugins/NewAwaySysMod/NewAwaySys_12.vcxproj new file mode 100644 index 0000000000..cf471eb28e --- /dev/null +++ b/plugins/NewAwaySysMod/NewAwaySys_12.vcxproj @@ -0,0 +1,222 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {6A516E27-AC50-5374-756B-A1558DB2EFA9} + NewAwaySys + + + + DynamicLibrary + Unicode + true + v120 + + + DynamicLibrary + Unicode + true + v120 + + + DynamicLibrary + Unicode + v120 + + + DynamicLibrary + Unicode + v120 + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(SolutionDir)$(Configuration)\Plugins\ + $(SolutionDir)$(Configuration)64\Plugins\ + $(SolutionDir)$(Configuration)\Obj\$(ProjectName)\ + $(SolutionDir)$(Configuration)64\Obj\$(ProjectName)\ + $(SolutionDir)$(Configuration)\Plugins\ + $(SolutionDir)$(Configuration)64\Plugins\ + $(SolutionDir)$(Configuration)\Obj\$(ProjectName)\ + $(SolutionDir)$(Configuration)64\Obj\$(ProjectName)\ + true + + + + Disabled + ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + Use + Level3 + EditAndContinue + Common.h + + + true + $(IntDir)$(TargetName).lib + Windows + false + $(SolutionDir)\lib + + + _DEBUG;%(PreprocessorDefinitions) + ..\..\include\msapi + + + + + Disabled + ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + _DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + Use + Level3 + Common.h + + + true + $(IntDir)$(TargetName).lib + Windows + false + $(SolutionDir)\lib + + + _DEBUG;%(PreprocessorDefinitions) + ..\..\include\msapi + + + + + Full + OnlyExplicitInline + ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + Sync + false + false + Use + Level3 + Size + Common.h + + + true + $(IntDir)$(TargetName).lib + true + true + Windows + false + $(SolutionDir)\lib + + + NDEBUG;%(PreprocessorDefinitions) + ..\..\include\msapi + + + + + Full + OnlyExplicitInline + ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + Sync + false + false + Use + Level3 + Size + Common.h + + + true + $(IntDir)$(TargetName).lib + true + true + Windows + false + $(SolutionDir)\lib + + + NDEBUG;%(PreprocessorDefinitions) + ..\..\include\msapi + + + + + + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/NewAwaySysMod/NewAwaySys_12.vcxproj.filters b/plugins/NewAwaySysMod/NewAwaySys_12.vcxproj.filters new file mode 100644 index 0000000000..61ffbfd573 --- /dev/null +++ b/plugins/NewAwaySysMod/NewAwaySys_12.vcxproj.filters @@ -0,0 +1,115 @@ + + + + + {116110a1-b9f8-4995-aab2-1de50eab806f} + cpp;c;cxx;rc;def;r;odl;idl;hpj;bat + + + {7c639270-1dc0-403f-a6ba-7da092e1f885} + h;hpp;hxx;hm;inl + + + {bbdb7c3b-6f74-434a-b577-46de841df2af} + ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + {b1737ff9-4769-4f5b-b414-ee0f5256de7f} + + + {ce0f339c-23a2-46b5-9000-81e923ac9be6} + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files\CommonLibs + + + Source Files\CommonLibs + + + Source Files\CommonLibs + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Documentation + + + Documentation + + + + + Resource Files + + + \ No newline at end of file diff --git a/plugins/NewAwaySysMod/src/AwayOpt.cpp b/plugins/NewAwaySysMod/src/AwayOpt.cpp index 7ba87f43ab..b8e75739a2 100644 --- a/plugins/NewAwaySysMod/src/AwayOpt.cpp +++ b/plugins/NewAwaySysMod/src/AwayOpt.cpp @@ -628,12 +628,13 @@ INT_PTR CALLBACK AutoreplyOptDlg(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM l HWND hButton = GetDlgItem(hwndDlg, IDC_REPLYDLG_VARS); SendMessage(hButton, BUTTONADDTOOLTIP, (WPARAM)TranslateT("Open Variables help dialog"), BATF_TCHAR); SendMessage(hButton, BUTTONSETASFLATBTN, TRUE, 0); - MakeThemedImageCheckbox(GetDlgItem(hwndDlg, IDC_MOREOPTDLG_EVNTMSG)); - MakeThemedImageCheckbox(GetDlgItem(hwndDlg, IDC_MOREOPTDLG_EVNTURL)); - MakeThemedImageCheckbox(GetDlgItem(hwndDlg, IDC_MOREOPTDLG_EVNTFILE)); + + SendMessage(GetDlgItem(hwndDlg, IDC_MOREOPTDLG_EVNTMSG), BUTTONSETASTHEMEDBTN, TRUE, 0); + SendMessage(GetDlgItem(hwndDlg, IDC_MOREOPTDLG_EVNTURL), BUTTONSETASTHEMEDBTN, TRUE, 0); + SendMessage(GetDlgItem(hwndDlg, IDC_MOREOPTDLG_EVNTFILE), BUTTONSETASTHEMEDBTN, TRUE, 0); SendMessage(hwndDlg, UM_ICONSCHANGED, 0, 0); - // init tooltips + // init tooltips struct { int DlgItemID; TCHAR* Text; diff --git a/plugins/NewAwaySysMod/src/GroupCheckbox.cpp b/plugins/NewAwaySysMod/src/GroupCheckbox.cpp new file mode 100644 index 0000000000..d396631676 --- /dev/null +++ b/plugins/NewAwaySysMod/src/GroupCheckbox.cpp @@ -0,0 +1,344 @@ +/* + GroupCheckbox.cpp + Copyright (c) 2007 Chervov Dmitry + + 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 "Common.h" +#include "GroupCheckbox.h" + +#pragma comment(lib, "uxtheme.lib") + +#define WM_THEMECHANGED 0x031A + +#define UM_INITCHECKBOX (WM_USER + 123) +#define UM_AUTOSIZE (WM_USER + 124) + +#define CG_CHECKBOX_VERTINDENT 0 +#define CG_CHECKBOX_INDENT 1 +#define CG_CHECKBOX_WIDTH 16 +#define CG_TEXT_INDENT 2 +#define CG_ADDITIONAL_WIDTH 3 + +// states +#define CGS_UNCHECKED BST_UNCHECKED +#define CGS_CHECKED BST_CHECKED +#define CGS_INDETERMINATE BST_INDETERMINATE +#define CGS_PRESSED BST_PUSHED // values above and including CGS_PRESSED must coincide with BST_ constants for BM_GETSTATE to work properly +#define CGS_HOVERED 8 + +// state masks +#define CGSM_ISCHECKED 3 // mask for BM_GETCHECK +#define CGSM_GETSTATE 7 // mask to get only valid values for BM_GETSTATE + +#ifndef lengthof +#define lengthof(s) (sizeof(s) / sizeof(*s)) +#endif + +class CCheckboxData +{ +public: + CCheckboxData(): OldWndProc(NULL), Style(0), State(0), hFont(NULL) {}; + + WNDPROC OldWndProc; + int Style; // BS_CHECKBOX, BS_AUTOCHECKBOX, BS_3STATE or BS_AUTO3STATE + int State; + HFONT hFont; +}; + +static int CALLBACK CheckboxWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + CCheckboxData *dat = (CCheckboxData*)GetWindowLong(hWnd, GWLP_USERDATA); + if (!dat) + return 0; + + switch (Msg) { + case UM_INITCHECKBOX: + { + HFONT hFont = (HFONT)SendMessage(hWnd, WM_GETFONT, 0, 0); + if (!hFont) + hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); + + LOGFONT lf; + GetObject(hFont, sizeof(lf), &lf); + lf.lfWeight = FW_BOLD; + dat->hFont = CreateFontIndirect(&lf); + SendMessage(hWnd, UM_AUTOSIZE, 0, 0); + } + return 0; + + case UM_AUTOSIZE: + { + HTHEME hTheme = OpenThemeData(hWnd, L"BUTTON"); + int Len = GetWindowTextLength(hWnd) + 1; + HDC hdc = GetDC(hWnd); + HFONT hOldFont = (HFONT)SelectObject(hdc, dat->hFont); + RECT rcText = { 0 }; + if (hTheme) { + WCHAR *szText = (WCHAR*)malloc(Len * sizeof(WCHAR)); + GetWindowTextW(hWnd, szText, Len); + GetThemeTextExtent(hTheme, hdc, BP_GROUPBOX, IsWindowEnabled(hWnd) ? GBS_NORMAL : GBS_DISABLED, szText, -1, DT_CALCRECT | DT_LEFT | DT_VCENTER | DT_SINGLELINE, 0, &rcText); + free(szText); + } + else { + SIZE size; + TCHAR *szText = (TCHAR*)malloc(Len * sizeof(TCHAR)); + GetWindowText(hWnd, szText, Len); + GetTextExtentPoint32(hdc, szText, lstrlen(szText), &size); + free(szText); + rcText.right = size.cx; + rcText.bottom = size.cy; + } + + SelectObject(hdc, hOldFont); + ReleaseDC(hWnd, hdc); + if (hTheme) + CloseThemeData(hTheme); + + OffsetRect(&rcText, CG_CHECKBOX_INDENT + CG_CHECKBOX_WIDTH + CG_TEXT_INDENT, 0); + RECT rc; + GetClientRect(hWnd, &rc); + SetWindowPos(hWnd, 0, 0, 0, rcText.right + CG_ADDITIONAL_WIDTH, rc.bottom, SWP_NOMOVE | SWP_NOZORDER); + } + break; + + case BM_CLICK: + SendMessage(hWnd, WM_LBUTTONDOWN, 0, 0); + SendMessage(hWnd, WM_LBUTTONUP, 0, 0); + return 0; + + case BM_GETCHECK: + return dat->State & CGSM_ISCHECKED; + + case BM_SETCHECK: + if ((wParam != BST_UNCHECKED && wParam != BST_CHECKED && wParam != BST_INDETERMINATE) || (wParam == BST_INDETERMINATE && dat->Style != BS_3STATE && dat->Style != BS_AUTO3STATE)) + wParam = BST_CHECKED; + dat->State &= ~CGSM_ISCHECKED; + dat->State |= wParam; + InvalidateRect(hWnd, NULL, false); + SendMessage(GetParent(hWnd), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(hWnd), BN_CLICKED), (LPARAM)hWnd); + return 0; + + case BM_SETSTATE: + if (wParam) + dat->State |= CGS_PRESSED; + else + dat->State &= ~CGS_PRESSED; + InvalidateRect(hWnd, NULL, false); + return 0; + + case BM_GETSTATE: + return (dat->State & CGSM_GETSTATE) | ((GetFocus() == hWnd) ? BST_FOCUS : 0); + + case WM_GETDLGCODE: + return DLGC_BUTTON; + + case WM_THEMECHANGED: + case WM_ENABLE: + InvalidateRect(hWnd, NULL, false); + return 0; + + case WM_SETTEXT: + if (CallWindowProc(dat->OldWndProc, hWnd, Msg, wParam, lParam)) + SendMessage(hWnd, UM_AUTOSIZE, 0, 0); + return 0; + + case WM_KEYDOWN: + if (wParam == VK_SPACE) + SendMessage(hWnd, BM_SETSTATE, true, 0); + return 0; + + case WM_KEYUP: + if (wParam == VK_SPACE) { + SendMessage(hWnd, BM_SETCHECK, (SendMessage(hWnd, BM_GETCHECK, 0, 0) + 1) % ((dat->Style == BS_AUTO3STATE) ? 3 : 2), 0); + SendMessage(hWnd, BM_SETSTATE, false, 0); + } + return 0; + + case WM_CAPTURECHANGED: + SendMessage(hWnd, BM_SETSTATE, false, 0); + return 0; + + case WM_ERASEBKGND: + return true; + + case WM_LBUTTONDOWN: + case WM_LBUTTONDBLCLK: + SetFocus(hWnd); + SendMessage(hWnd, BM_SETSTATE, true, 0); + SetCapture(hWnd); + return 0; + + case WM_LBUTTONUP: + if (GetCapture() == hWnd) + ReleaseCapture(); + + SendMessage(hWnd, BM_SETSTATE, false, 0); + if (dat->State & CGS_HOVERED && (dat->Style == BS_AUTOCHECKBOX || dat->Style == BS_AUTO3STATE)) + SendMessage(hWnd, BM_SETCHECK, (SendMessage(hWnd, BM_GETCHECK, 0, 0) + 1) % ((dat->Style == BS_AUTO3STATE) ? 3 : 2), 0); + return 0; + + case WM_MOUSEMOVE: + { + TRACKMOUSEEVENT tme; + tme.cbSize = sizeof(tme); + tme.dwFlags = TME_LEAVE; + tme.dwHoverTime = HOVER_DEFAULT; + tme.hwndTrack = hWnd; + _TrackMouseEvent(&tme); + } + + POINT pt; + GetCursorPos(&pt); + if ((WindowFromPoint(pt) == hWnd) ^ ((dat->State & CGS_HOVERED) != 0)) { + dat->State ^= CGS_HOVERED; + InvalidateRect(hWnd, NULL, false); + } + return 0; + + case WM_MOUSELEAVE: + if (dat->State & CGS_HOVERED) { + dat->State &= ~CGS_HOVERED; + InvalidateRect(hWnd, NULL, false); + } + return 0; + + case WM_SETFOCUS: + case WM_KILLFOCUS: + case WM_SYSCOLORCHANGE: + InvalidateRect(hWnd, NULL, false); + return 0; + + case WM_PAINT: + { + HDC hdc; + PAINTSTRUCT ps; + hdc = BeginPaint(hWnd, &ps); + RECT rc; + GetClientRect(hWnd, &rc); + HDC hdcMem = CreateCompatibleDC(hdc); + HBITMAP hbmMem = CreateCompatibleBitmap(hdc, rc.right, rc.bottom); + HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, hbmMem); + HTHEME hTheme = OpenThemeData(hWnd, L"BUTTON"); + if (hTheme) + DrawThemeParentBackground(hWnd, hdcMem, NULL); + else + FillRect(hdcMem, &rc, GetSysColorBrush(COLOR_3DFACE)); + + int StateID = 0; + switch (SendMessage(hWnd, BM_GETCHECK, 0, 0)) { + case BST_CHECKED: + StateID += CBSCHECK_CHECKED; + break; + case BST_UNCHECKED: + StateID += CBSCHECK_UNCHECKED; + break; + case BST_INDETERMINATE: + StateID += CBSCHECK_MIXED; + break; + } + if (!IsWindowEnabled(hWnd)) + StateID += CBSSTATE_DISABLED; + else if (dat->State & CGS_PRESSED && (GetCapture() != hWnd || dat->State & CGS_HOVERED)) + StateID += CBSSTATE_PRESSED; + else if (dat->State & CGS_PRESSED || dat->State & CGS_HOVERED) + StateID += CBSSTATE_HOT; + + rc.left += CG_CHECKBOX_INDENT; + rc.right = rc.left + CG_CHECKBOX_WIDTH; // left-align the image in the client area + rc.top += CG_CHECKBOX_VERTINDENT; + rc.bottom = rc.top + CG_CHECKBOX_WIDTH; // exact rc dimensions are necessary for DrawFrameControl to draw correctly + if (hTheme) + DrawThemeBackground(hTheme, hdcMem, BP_CHECKBOX, StateID, &rc, &rc); + else { + int dfcStates[] = + { 0, 0, DFCS_PUSHED, DFCS_INACTIVE, + DFCS_CHECKED, DFCS_CHECKED, DFCS_CHECKED | DFCS_PUSHED, DFCS_CHECKED | DFCS_INACTIVE, + DFCS_BUTTON3STATE | DFCS_CHECKED, DFCS_BUTTON3STATE | DFCS_CHECKED, DFCS_BUTTON3STATE | DFCS_INACTIVE | DFCS_CHECKED | DFCS_PUSHED, DFCS_BUTTON3STATE | DFCS_INACTIVE | DFCS_CHECKED | DFCS_PUSHED }; + _ASSERT(StateID >= 1 && StateID <= lengthof(dfcStates)); + DrawFrameControl(hdcMem, &rc, DFC_BUTTON, dfcStates[StateID - 1]); + } + + GetClientRect(hWnd, &rc); + rc.left += CG_CHECKBOX_INDENT + CG_CHECKBOX_WIDTH + CG_TEXT_INDENT; + + int Len = GetWindowTextLength(hWnd) + 1; + TCHAR *szTextT = (TCHAR*)malloc(Len * sizeof(TCHAR)); + GetWindowText(hWnd, szTextT, Len); + + HFONT hOldFont = (HFONT)SelectObject(hdcMem, dat->hFont); + SetBkMode(hdcMem, TRANSPARENT); + if (hTheme) + DrawThemeText(hTheme, hdcMem, BP_GROUPBOX, IsWindowEnabled(hWnd) ? GBS_NORMAL : GBS_DISABLED, szTextT, -1, DT_LEFT | DT_VCENTER | DT_SINGLELINE, 0, &rc); + else + DrawText(hdcMem, szTextT, -1, &rc, DT_LEFT | DT_VCENTER | DT_SINGLELINE); + + if (GetFocus() == hWnd) { + RECT rcText = { 0 }; + if (hTheme) + GetThemeTextExtent(hTheme, hdcMem, BP_GROUPBOX, IsWindowEnabled(hWnd) ? GBS_NORMAL : GBS_DISABLED, szTextT, -1, DT_CALCRECT | DT_LEFT | DT_VCENTER | DT_SINGLELINE, 0, &rcText); + else { + SIZE size; + GetTextExtentPoint32(hdcMem, szTextT, lstrlen(szTextT), &size); + rcText.right = size.cx; + rcText.bottom = size.cy; + } + rcText.bottom = rc.bottom; + OffsetRect(&rcText, rc.left, 0); + InflateRect(&rcText, 1, -1); + DrawFocusRect(hdcMem, &rcText); + } + free(szTextT); + SelectObject(hdcMem, hOldFont); + if (hTheme) { + CloseThemeData(hTheme); + } + BitBlt(hdc, 0, 0, rc.right, rc.bottom, hdcMem, 0, 0, SRCCOPY); + SelectObject(hdcMem, hbmOld); + DeleteObject(hbmMem); + DeleteDC(hdcMem); + EndPaint(hWnd, &ps); + } + return 0; + + case WM_DESTROY: + if (dat->hFont) + DeleteObject(dat->hFont); + + SetWindowLong(hWnd, GWLP_USERDATA, NULL); + CallWindowProc(dat->OldWndProc, hWnd, Msg, wParam, lParam); + delete dat; + return 0; + } + return CallWindowProc(dat->OldWndProc, hWnd, Msg, wParam, lParam); +} + +int MakeGroupCheckbox(HWND hWndCheckbox) +{ // workaround to make SetTextColor work in WM_CTLCOLORSTATIC with windows themes enabled + CCheckboxData *dat = new CCheckboxData(); + dat->OldWndProc = (WNDPROC)GetWindowLong(hWndCheckbox, GWLP_WNDPROC); + dat->State = SendMessage(hWndCheckbox, BM_GETSTATE, 0, 0); + long Style = GetWindowLong(hWndCheckbox, GWL_STYLE); + dat->Style = Style & (BS_CHECKBOX | BS_AUTOCHECKBOX | BS_3STATE | BS_AUTO3STATE); + _ASSERT(dat->Style == BS_CHECKBOX || dat->Style == BS_AUTOCHECKBOX || dat->Style == BS_3STATE || dat->Style == BS_AUTO3STATE); + Style &= ~(BS_CHECKBOX | BS_AUTOCHECKBOX | BS_3STATE | BS_AUTO3STATE); + Style |= BS_OWNERDRAW; + SetWindowLong(hWndCheckbox, GWL_STYLE, Style); + SetWindowLong(hWndCheckbox, GWLP_USERDATA, (LONG)dat); + SetWindowLong(hWndCheckbox, GWLP_WNDPROC, (LONG)CheckboxWndProc); + SendMessage(hWndCheckbox, UM_INITCHECKBOX, 0, 0); + return 0; +} diff --git a/plugins/NewAwaySysMod/src/GroupCheckbox.h b/plugins/NewAwaySysMod/src/GroupCheckbox.h new file mode 100644 index 0000000000..3aa121f869 --- /dev/null +++ b/plugins/NewAwaySysMod/src/GroupCheckbox.h @@ -0,0 +1,26 @@ +/* + GroupCheckbox.h + Copyright (c) 2007 Chervov Dmitry + + 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 +*/ + +#pragma once + +#include +#include +#include + +int MakeGroupCheckbox(HWND hWndCheckbox); -- cgit v1.2.3