diff options
author | George Hazan <george.hazan@gmail.com> | 2012-06-21 18:03:23 +0000 |
---|---|---|
committer | George Hazan <george.hazan@gmail.com> | 2012-06-21 18:03:23 +0000 |
commit | 798a7bc2ee5f488d67831c11778f209bdadcba02 (patch) | |
tree | 7110885daa35701e74363b03064534fd70f317af /src/modules/button/button.cpp | |
parent | b6eeba0ad88a0eef9218e95cd07ef3cd867ff431 (diff) |
patch for the core Mbutton class customization, to use the themes defined by plugins
git-svn-id: http://svn.miranda-ng.org/main/trunk@514 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'src/modules/button/button.cpp')
-rw-r--r-- | src/modules/button/button.cpp | 122 |
1 files changed, 62 insertions, 60 deletions
diff --git a/src/modules/button/button.cpp b/src/modules/button/button.cpp index c191b56683..c55c4f807f 100644 --- a/src/modules/button/button.cpp +++ b/src/modules/button/button.cpp @@ -21,32 +21,12 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "..\..\core\commonheaders.h"
+
+#include <m_button_int.h>
+
#include <initguid.h>
#include <oleacc.h>
-struct MButtonCtrl
-{
- HWND hwnd;
- int stateId; // button state
- int focus; // has focus (1 or 0)
- HFONT hFont; // font
- HICON arrow; // uses down arrow
- HICON hIcon;
- HBITMAP hBitmap;
- HTHEME hThemeButton;
- HTHEME hThemeToolbar;
- TCHAR cHot;
- HWND hwndToolTips;
- IAccPropServices* pAccPropServices;
-
- bool bIsPushBtn, // button has two states
- bIsPushed, // is button pushed or not
- bIsDefault, // default button
- bIsFlat, // flat button
- bIsThemed, // themed button
- bIsSkinned; // skinned button
-};
-
struct TTooltips
{
DWORD ThreadId;
@@ -72,15 +52,17 @@ static void DestroyTheme(MButtonCtrl *ctl) closeThemeData(ctl->hThemeToolbar);
ctl->hThemeToolbar = NULL;
}
+ ctl->bIsThemed = false;
}
}
static void LoadTheme(MButtonCtrl *ctl)
{
+ DestroyTheme(ctl);
if (openThemeData) {
- DestroyTheme(ctl);
ctl->hThemeButton = openThemeData(ctl->hwnd, L"BUTTON");
ctl->hThemeToolbar = openThemeData(ctl->hwnd, L"TOOLBAR");
+ ctl->bIsThemed = true;
}
}
@@ -117,22 +99,20 @@ static void PaintWorker(MButtonCtrl *ctl, HDC hdcPaint) if ( !hdcPaint)
return;
- HDC hdcMem;
- HBITMAP hbmMem;
- HDC hOld;
RECT rcClient;
-
GetClientRect(ctl->hwnd, &rcClient);
- hdcMem = CreateCompatibleDC(hdcPaint);
- hbmMem = CreateCompatibleBitmap(hdcPaint, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top);
- hOld = (HDC)SelectObject(hdcMem, hbmMem);
+
+ HDC hdcMem = CreateCompatibleDC(hdcPaint);
+ HBITMAP hbmMem = CreateCompatibleBitmap(hdcPaint, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top);
+ HDC hOld = (HDC)SelectObject(hdcMem, hbmMem);
// If its a push button, check to see if it should stay pressed
- if (ctl->bIsPushBtn && ctl->bIsPushed) ctl->stateId = PBS_PRESSED;
+ if (ctl->bIsPushBtn && ctl->bIsPushed)
+ ctl->stateId = PBS_PRESSED;
// Draw the flat button
if (ctl->bIsFlat) {
- if (ctl->hThemeToolbar) {
+ if (ctl->hThemeToolbar && ctl->bIsThemed) {
int state = IsWindowEnabled(ctl->hwnd)?(ctl->stateId == PBS_NORMAL && ctl->bIsDefault ? PBS_DEFAULTED : ctl->stateId):PBS_DISABLED;
if (isThemeBackgroundPartiallyTransparent(ctl->hThemeToolbar, TP_BUTTON, TBStateConvert2Flat(state)))
drawThemeParentBackground(ctl->hwnd, hdcMem, &rcClient);
@@ -166,11 +146,12 @@ static void PaintWorker(MButtonCtrl *ctl, HDC hdcPaint) }
else {
// Draw background/border
- if (ctl->hThemeButton) {
+ if (ctl->hThemeButton && ctl->bIsThemed) {
int state = IsWindowEnabled(ctl->hwnd)?(ctl->stateId == PBS_NORMAL && ctl->bIsDefault ? PBS_DEFAULTED : ctl->stateId) : PBS_DISABLED;
- if (isThemeBackgroundPartiallyTransparent(ctl->hThemeButton, BP_PUSHBUTTON, state)) {
+
+ if (isThemeBackgroundPartiallyTransparent(ctl->hThemeButton, BP_PUSHBUTTON, state))
drawThemeParentBackground(ctl->hwnd, hdcMem, &rcClient);
- }
+
drawThemeBackground(ctl->hThemeButton, hdcMem, BP_PUSHBUTTON, state, &rcClient, &rcClient);
}
else {
@@ -196,18 +177,17 @@ static void PaintWorker(MButtonCtrl *ctl, HDC hdcPaint) ix++;
iy++;
}
- {
- HIMAGELIST hImageList;
- HICON hIconNew;
-
- hImageList = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), IsWinVerXPPlus()? ILC_COLOR32 | ILC_MASK : ILC_COLOR16 | ILC_MASK, 1, 0);
- ImageList_AddIcon(hImageList, ctl->hIcon);
- hIconNew = ImageList_GetIcon(hImageList, 0, ILD_NORMAL);
- DrawState(hdcMem, NULL, NULL, (LPARAM)hIconNew, 0, ix, iy, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), IsWindowEnabled(ctl->hwnd)?DST_ICON|DSS_NORMAL:DST_ICON|DSS_DISABLED);
- ImageList_RemoveAll(hImageList);
- ImageList_Destroy(hImageList);
- DestroyIcon(hIconNew);
- }
+
+ HIMAGELIST hImageList;
+ HICON hIconNew;
+
+ hImageList = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), IsWinVerXPPlus()? ILC_COLOR32 | ILC_MASK : ILC_COLOR16 | ILC_MASK, 1, 0);
+ ImageList_AddIcon(hImageList, ctl->hIcon);
+ hIconNew = ImageList_GetIcon(hImageList, 0, ILD_NORMAL);
+ DrawState(hdcMem, NULL, NULL, (LPARAM)hIconNew, 0, ix, iy, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), IsWindowEnabled(ctl->hwnd)?DST_ICON|DSS_NORMAL:DST_ICON|DSS_DISABLED);
+ ImageList_RemoveAll(hImageList);
+ ImageList_Destroy(hImageList);
+ DestroyIcon(hIconNew);
}
else if (ctl->hBitmap) {
BITMAP bminfo;
@@ -261,6 +241,12 @@ static void PaintWorker(MButtonCtrl *ctl, HDC hdcPaint) static LRESULT CALLBACK MButtonWndProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
MButtonCtrl* bct = (MButtonCtrl *)GetWindowLongPtr(hwndDlg, 0);
+ if (bct && bct->fnWindowProc) {
+ LRESULT res = bct->fnWindowProc(hwndDlg, msg, wParam, lParam);
+ if (res)
+ return res;
+ }
+
switch(msg) {
case WM_NCCREATE:
SetWindowLongPtr(hwndDlg, GWL_STYLE, GetWindowLongPtr(hwndDlg, GWL_STYLE) | BS_OWNERDRAW);
@@ -268,14 +254,14 @@ static LRESULT CALLBACK MButtonWndProc(HWND hwndDlg, UINT msg, WPARAM wParam, L if (bct == NULL) return FALSE;
bct->hwnd = hwndDlg;
bct->stateId = PBS_NORMAL;
+ bct->fnPainter = PaintWorker;
bct->hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
LoadTheme(bct);
if (SUCCEEDED(CoCreateInstance(CLSID_AccPropServices, NULL, CLSCTX_SERVER, IID_IAccPropServices, (void**)&bct->pAccPropServices))) {
// Annotating the Role of this object to be PushButton
SetHwndPropInt(bct, OBJID_CLIENT, CHILDID_SELF, PROPID_ACC_ROLE, ROLE_SYSTEM_PUSHBUTTON);
}
- else
- bct->pAccPropServices = NULL;
+ else bct->pAccPropServices = NULL;
SetWindowLongPtr(hwndDlg, 0, (LONG_PTR)bct);
if (((CREATESTRUCT *)lParam)->lpszName) SetWindowText(hwndDlg, ((CREATESTRUCT *)lParam)->lpszName);
return TRUE;
@@ -292,9 +278,9 @@ static LRESULT CALLBACK MButtonWndProc(HWND hwndDlg, UINT msg, WPARAM wParam, L ti.uFlags = TTF_IDISHWND;
ti.hwnd = bct->hwnd;
ti.uId = (UINT_PTR)bct->hwnd;
- if (SendMessage(bct->hwndToolTips, TTM_GETTOOLINFO, 0, (LPARAM)&ti)) {
+ if (SendMessage(bct->hwndToolTips, TTM_GETTOOLINFO, 0, (LPARAM)&ti))
SendMessage(bct->hwndToolTips, TTM_DELTOOL, 0, (LPARAM)&ti);
- }
+
if (SendMessage(bct->hwndToolTips, TTM_GETTOOLCOUNT, 0, (LPARAM)&ti) == 0) {
int idx;
TTooltips tt;
@@ -317,6 +303,7 @@ static LRESULT CALLBACK MButtonWndProc(HWND hwndDlg, UINT msg, WPARAM wParam, L break; // DONT! fall thru
case WM_NCDESTROY:
+ SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0);
mir_free(bct);
break;
@@ -373,7 +360,8 @@ static LRESULT CALLBACK MButtonWndProc(HWND hwndDlg, UINT msg, WPARAM wParam, L case WM_THEMECHANGED:
// themed changed, reload theme object
- LoadTheme(bct);
+ if (bct->bIsThemed)
+ LoadTheme(bct);
InvalidateRect(bct->hwnd, NULL, TRUE); // repaint it
break;
@@ -387,7 +375,7 @@ static LRESULT CALLBACK MButtonWndProc(HWND hwndDlg, UINT msg, WPARAM wParam, L PAINTSTRUCT ps;
HDC hdcPaint = BeginPaint(hwndDlg, &ps);
if (hdcPaint) {
- PaintWorker(bct, hdcPaint);
+ bct->fnPainter(bct, hdcPaint);
EndPaint(hwndDlg, &ps);
}
}
@@ -516,6 +504,21 @@ static LRESULT CALLBACK MButtonWndProc(HWND hwndDlg, UINT msg, WPARAM wParam, L }
break;
+ case BUTTONSETCUSTOM:
+ {
+ MButtonCustomize *pCustom = (MButtonCustomize*)lParam;
+ if (pCustom == NULL)
+ break;
+
+ bct = (MButtonCtrl*)mir_realloc(bct, pCustom->cbLen);
+ if (pCustom->cbLen > sizeof(MButtonCtrl))
+ memset(bct+1, 0, pCustom->cbLen - sizeof(MButtonCtrl));
+ bct->fnPainter = pCustom->fnPainter;
+ bct->fnWindowProc = pCustom->fnWindowProc;
+ SetWindowLongPtr(hwndDlg, 0, (LONG_PTR)bct);
+ }
+ break;
+
case WM_SETFOCUS: // set keybord focus and redraw
bct->focus = 1;
InvalidateRect(bct->hwnd, NULL, TRUE);
@@ -552,15 +555,13 @@ static LRESULT CALLBACK MButtonWndProc(HWND hwndDlg, UINT msg, WPARAM wParam, L case WM_LBUTTONUP:
{
int showClick = 0;
- if (bct->bIsPushBtn) {
- if (bct->bIsPushed) bct->bIsPushed = 0;
- else bct->bIsPushed = 1;
- }
+ if (bct->bIsPushBtn)
+ bct->bIsPushed = !bct->bIsPushed;
+
if (bct->stateId != PBS_DISABLED) { // don't change states if disabled
if (bct->stateId == PBS_PRESSED)
showClick = 1;
- if (msg == WM_LBUTTONUP) bct->stateId = PBS_HOT;
- else bct->stateId = PBS_NORMAL;
+ bct->stateId = (msg == WM_LBUTTONUP) ? PBS_HOT : PBS_NORMAL;
InvalidateRect(bct->hwnd, NULL, TRUE);
}
if (showClick) // Tell your daddy you got clicked.
@@ -593,6 +594,7 @@ static LRESULT CALLBACK MButtonWndProc(HWND hwndDlg, UINT msg, WPARAM wParam, L case WM_ERASEBKGND:
return 1;
}
+
return DefWindowProc(hwndDlg, msg, wParam, lParam);
}
|