186 lines
5.1 KiB
C++
186 lines
5.1 KiB
C++
#pragma once
|
|
|
|
#pragma comment(lib, "uxtheme")
|
|
|
|
#include "oxdllext.h"
|
|
|
|
#include <shlwapi.h>
|
|
|
|
#pragma warning (push,3)
|
|
#include <vector>
|
|
#pragma warning (pop)
|
|
|
|
using namespace std;
|
|
|
|
// The following declarations are for the XP theme API (for pre-XP OS support)
|
|
typedef HANDLE HTHEME;
|
|
#define WM_THEMECHANGED 0x031A
|
|
|
|
#define TMT_TEXTCOLOR 3803
|
|
#define TMT_FONT 210
|
|
|
|
bool G_LoadThemeLibrary();
|
|
|
|
typedef HANDLE(__stdcall *OPENTHEMEDATA)(HWND hwnd, LPCTSTR pszClassList);
|
|
HTHEME G_OpenThemeData(HWND hwnd, LPCWSTR pszClassList);
|
|
|
|
typedef HRESULT(__stdcall *CLOSETHEMEDATA)(HANDLE hTheme);
|
|
HRESULT G_CloseThemeData(HTHEME hTheme);
|
|
|
|
typedef HRESULT(__stdcall *DRAWTHEMEBACKGROUND)(HANDLE hTheme, HDC hdc,
|
|
int iPartId, int iStateId, const RECT *pRect, const RECT *pClipRect);
|
|
HRESULT G_DrawThemeBackground(HTHEME hTheme, HDC hdc,
|
|
int iPartId, int iStateId, const RECT *pRect, OPTIONAL const RECT *pClipRect);
|
|
|
|
typedef HRESULT (__stdcall *DRAWTHEMETEXT)(HANDLE hTheme, HDC hdc, int iPartId,
|
|
int iStateId, LPCWSTR pszText, int iCharCount, DWORD dwTextFlags,
|
|
DWORD dwTextFlags2, const RECT *pRect);
|
|
HRESULT G_DrawThemeText(HTHEME hTheme, HDC hdc, int iPartId,
|
|
int iStateId, LPCTSTR pszText, int iCharCount, DWORD dwTextFlags,
|
|
DWORD dwTextFlags2, const RECT *pRect);
|
|
|
|
typedef HRESULT (__stdcall *DRAWTHEMEEDGE)(HANDLE hTheme, HDC hdc, int iPartId, int iStateId,
|
|
const RECT *pDestRect, UINT uEdge, UINT uFlags, RECT *pContentRect);
|
|
HRESULT G_DrawThemeEdge(HTHEME hTheme, HDC hdc, int iPartId, int iStateId,
|
|
const RECT *pDestRect, UINT uEdge, UINT uFlags, OPTIONAL OUT RECT *pContentRect);
|
|
|
|
typedef HRESULT (__stdcall *GETTHEMECOLOR)(HTHEME hTheme, int iPartId,
|
|
int iStateId, int iPropId, OUT COLORREF *pColor);
|
|
HRESULT G_GetThemeColor(HTHEME hTheme, int iPartId,
|
|
int iStateId, int iPropId, OUT COLORREF *pColor);
|
|
|
|
typedef HRESULT (__stdcall *GETTHEMEFONT)(HTHEME hTheme, OPTIONAL HDC hdc, int iPartId,
|
|
int iStateId, int iPropId, OUT LOGFONT *pFont);
|
|
HRESULT G_GetThemeFont(HTHEME hTheme, OPTIONAL HDC hdc, int iPartId,
|
|
int iStateId, int iPropId, OUT LOGFONT *pFont);
|
|
|
|
#define ANIMATIONTIMERID 3001
|
|
#define REVANIMATIONTIMERID 3002
|
|
#define ANIMATIONINTERVAL 60
|
|
#define NUMANIMSTEPS 8
|
|
|
|
enum GroupType
|
|
{
|
|
GTList
|
|
};
|
|
|
|
class Item
|
|
{
|
|
friend class COXTaskPanel;
|
|
friend struct TaskGroup;
|
|
private:
|
|
CRect m_ItemRect;
|
|
public:
|
|
Item():m_bIsMouseHovered(false)
|
|
{
|
|
}
|
|
CString m_strText;
|
|
UINT m_nIconID;
|
|
CString m_strCmd;
|
|
bool m_bIsMouseHovered;
|
|
};
|
|
|
|
struct TaskGroup
|
|
{
|
|
TaskGroup(CString group = _T("")):m_strGroupName(group),
|
|
m_bIsMouseHovered(false), m_GroupType(GTList),
|
|
m_bIsCollapsed(true),m_bAnimationEnabled(false)
|
|
{
|
|
}
|
|
|
|
CString m_strGroupName;
|
|
operator CString()
|
|
{
|
|
return m_strGroupName;
|
|
}
|
|
CRect m_HeaderRect;
|
|
bool m_bIsMouseHovered;
|
|
GroupType m_GroupType;
|
|
bool m_bIsCollapsed;
|
|
bool m_bAnimationEnabled;
|
|
|
|
void AddItem(const Item& item)
|
|
{
|
|
m_vecItems.push_back(item);
|
|
}
|
|
|
|
Item* FindItemWithPt(const CPoint& pt)
|
|
{
|
|
for(vector<Item>::iterator it = m_vecItems.begin(); it != m_vecItems.end(); it++)
|
|
{
|
|
if(it->m_ItemRect.PtInRect(pt))
|
|
{
|
|
return &(*it);
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
vector<Item> m_vecItems;
|
|
};
|
|
|
|
// COXTaskPanel
|
|
|
|
#ifndef OCR_HAND
|
|
#define OCR_HAND 32649
|
|
#endif
|
|
|
|
enum PanelDimensions
|
|
{
|
|
PDPanelFixedWidth = 225,
|
|
PDLeftMargin = 10,
|
|
PDTopMargin = 10,
|
|
PDHeaderWidth = 190,
|
|
PDHeaderHeight = 25,
|
|
PDHeaderTextDisplacement = 9,
|
|
PDHeaderIconDisplacement = 170,
|
|
PDGroupSeparatorWidth = 40,
|
|
PDGroupItemHeight = 20,
|
|
PDGroupItemLeftMargin = 35,
|
|
PDGroupIconLeftMargin = 9,
|
|
PDGroupIconVerticalDisplacement = 1
|
|
};
|
|
|
|
class OX_CLASS_DECL COXTaskPanel : public CWnd
|
|
{
|
|
DECLARE_DYNAMIC(COXTaskPanel)
|
|
|
|
public:
|
|
COXTaskPanel();
|
|
virtual ~COXTaskPanel();
|
|
protected:
|
|
HTHEME m_hTheme;
|
|
vector<TaskGroup> m_vecGroups;
|
|
bool m_bLastHover;
|
|
Item* m_ActiveItem;
|
|
bool m_bMouseOnControl;
|
|
bool m_bIgnoreButtonUp;
|
|
int m_nAnimSteps;
|
|
CWnd* pOldFocus;
|
|
|
|
protected:
|
|
DECLARE_MESSAGE_MAP()
|
|
public:
|
|
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
|
|
afx_msg void OnClose();
|
|
afx_msg void OnPaint();
|
|
afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
|
|
afx_msg LRESULT OnThemeChanged(WPARAM wParam, LPARAM lParam);
|
|
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
|
|
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
|
|
virtual BOOL Create(RECT rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
|
|
TaskGroup* AddGroup(LPCTSTR szGroupName);
|
|
static bool IsThemed();
|
|
private:
|
|
void DrawGroups(HDC hDC);
|
|
void DrawGroupHeader(HDC hDC, const CRect& recGroupHeader, vector<TaskGroup>::iterator it);
|
|
void DrawGroupItem(HDC hDC, const CRect& recGroupItem, vector<Item>::iterator it);
|
|
void DrawDownArrow(HDC hDC, const CRect& recGroupIcon);
|
|
void DrawUpArrow(HDC hDC, const CRect& recGroupIcon);
|
|
bool RenderAlphaBlend(HDC hDC, HDC tmpDC, CRect recGroupBodyTarget, CRect recGroupBodySource);
|
|
void AdjustScrollBars(CRect recGroupHeader);
|
|
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
|
|
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
|
|
afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
|
|
afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
|
|
afx_msg void OnTimer(UINT_PTR nIDEvent);
|
|
}; |