Files
foobar2000-sdk/foobar2000/ATLHelpers/Controls.h

167 lines
3.6 KiB
C++

#pragma once
#include "misc.h"
void PaintSeparatorControl(CWindow wnd);
class CStaticSeparator : public CContainedWindowT<CStatic>, private CMessageMap {
public:
CStaticSeparator() : CContainedWindowT<CStatic>(this, 0) {}
BEGIN_MSG_MAP_EX(CSeparator)
MSG_WM_PAINT(OnPaint)
MSG_WM_SETTEXT(OnSetText)
END_MSG_MAP()
private:
int OnSetText(LPCTSTR lpstrText) {
Invalidate();
SetMsgHandled(FALSE);
return 0;
}
void OnPaint(CDCHandle) {
PaintSeparatorControl(*this);
}
};
template<typename TClass>
class CTextControl : public CWindowRegisteredT<TClass> {
public:
BEGIN_MSG_MAP_EX(CTextControl)
MSG_WM_SETFONT(OnSetFont)
MSG_WM_GETFONT(OnGetFont)
MSG_WM_SETTEXT(OnSetText)
CHAIN_MSG_MAP(__super)
END_MSG_MAP()
private:
HFONT OnGetFont() {
return m_font;
}
void OnSetFont(HFONT font, BOOL bRedraw) {
m_font = font;
if (bRedraw) Invalidate();
}
int OnSetText(LPCTSTR lpstrText) {
Invalidate();SetMsgHandled(FALSE); return 0;
}
CFontHandle m_font;
};
#ifndef VSCLASS_TEXTSTYLE
//
// TEXTSTYLE class parts and states
//
#define VSCLASS_TEXTSTYLE L"TEXTSTYLE"
enum TEXTSTYLEPARTS {
TEXT_MAININSTRUCTION = 1,
TEXT_INSTRUCTION = 2,
TEXT_BODYTITLE = 3,
TEXT_BODYTEXT = 4,
TEXT_SECONDARYTEXT = 5,
TEXT_HYPERLINKTEXT = 6,
TEXT_EXPANDED = 7,
TEXT_LABEL = 8,
TEXT_CONTROLLABEL = 9,
};
enum HYPERLINKTEXTSTATES {
TS_HYPERLINK_NORMAL = 1,
TS_HYPERLINK_HOT = 2,
TS_HYPERLINK_PRESSED = 3,
TS_HYPERLINK_DISABLED = 4,
};
enum CONTROLLABELSTATES {
TS_CONTROLLABEL_NORMAL = 1,
TS_CONTROLLABEL_DISABLED = 2,
};
#endif
class CStaticThemed : public CContainedWindowT<CStatic>, private CMessageMap {
public:
CStaticThemed() : CContainedWindowT<CStatic>(this, 0), m_id(), m_fallback() {}
BEGIN_MSG_MAP_EX(CStaticThemed)
MSG_WM_PAINT(OnPaint)
MSG_WM_THEMECHANGED(OnThemeChanged)
MSG_WM_SETTEXT(OnSetText)
END_MSG_MAP()
void SetThemePart(int id) {m_id = id; if (m_hWnd != NULL) Invalidate();}
private:
int OnSetText(LPCTSTR lpstrText) {
Invalidate();
SetMsgHandled(FALSE);
return 0;
}
void OnThemeChanged() {
m_theme.Release();
m_fallback = false;
}
void OnPaint(CDCHandle) {
if (m_fallback) {
SetMsgHandled(FALSE); return;
}
if (m_theme == NULL) {
m_theme.OpenThemeData(*this, L"TextStyle");
if (m_theme == NULL) {
m_fallback = true; SetMsgHandled(FALSE); return;
}
}
CPaintDC dc(*this);
TCHAR buffer[512] = {};
GetWindowText(buffer, _countof(buffer));
const int txLen = pfc::strlen_max_t(buffer, _countof(buffer));
CRect contentRect;
WIN32_OP_D( GetClientRect(contentRect) );
SelectObjectScope scopeFont(dc, GetFont());
dc.SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
dc.SetBkMode(TRANSPARENT);
if (txLen > 0) {
CRect rcText(contentRect);
DWORD flags = 0;
DWORD style = GetStyle();
if (style & SS_LEFT) flags |= DT_LEFT;
else if (style & SS_RIGHT) flags |= DT_RIGHT;
else if (style & SS_CENTER) flags |= DT_CENTER;
if (style & SS_ENDELLIPSIS) flags |= DT_END_ELLIPSIS;
HRESULT retval = DrawThemeText(m_theme, dc, m_id, 0, buffer, txLen, flags, 0, rcText);
PFC_ASSERT( SUCCEEDED( retval ) );
}
}
int m_id;
CTheme m_theme;
bool m_fallback;
};
class CStaticMainInstruction : public CStaticThemed {
public:
CStaticMainInstruction() { SetThemePart(TEXT_MAININSTRUCTION); }
};
class CSeparator : public CTextControl<CSeparator> {
public:
BEGIN_MSG_MAP_EX(CSeparator)
MSG_WM_PAINT(OnPaint)
MSG_WM_ENABLE(OnEnable)
CHAIN_MSG_MAP(__super)
END_MSG_MAP()
static const TCHAR * GetClassName() {
return _T("foobar2000:separator");
}
private:
void OnEnable(BOOL bEnable) {
Invalidate();
}
void OnPaint(CDCHandle dc) {
PaintSeparatorControl(*this);
}
};