Я хотел бы обновить код, похожий на панель инструментов, нам нужно иметь округлость градиента Vista / Win7.
В настоящее время кнопки выглядят как Windows 2000: блочные, однотонные.
Я играл с темами XP, используя DrawThemeBackground, DrawThemeEdge и т. Д .;но я очень недоволен механикой рисования темы (кнопки большие, а тема рисует их в виде 2-х тонов, верхней половины и нижней половины, что выглядит хорошо, когда кнопки маленькие - это дает им наполовину приличный видбудучи градиентом или имеет округлое качество для них. Но как бы ни велики эти кнопки, они выглядят глупо.
Экспериментируя, просто наблюдая, сколько элементов управления нарисовано в различных приложениях и элементах управления, я могу видеть, чтобольшинство из них, кажется, используют градиенты - когда верхняя часть элемента управления выглядит светлым и постепенно переходит в нижнюю часть к более темному цвету - ИЛИ - где он светлее, чем фон в верхней части, увеличивается почти до белого цвета напосередине, затем постепенно возвращается к более темному цвету внизу.
Я не совсем уверен, куда идти дальше. DrawThemeXXX кажется неадекватным. Я действительно не хочу заменять весь элемент управления нановый, который улучшил рисование, но потребовал бы, чтобы я поменял часть кода длякак работает текущий пользовательский элемент управления, и рискуйте различными проблемами с какой-либо другой библиотекой. Я бы предпочел просто нарисовать произвольные объекты в стиле текущей версии Windows, на которой я работаю. Я бы подумал, что функции рисования темы могли бы охватить это.Но они довольно сильно повреждены, как я описал.
Может кто-нибудь указать мне на 'Как современные приложения C ++ должны рисовать пользовательские элементы графического интерфейса, чтобы они могли разумно ожидать изящного внешнего вида под XP,Vista и Windows 7? '
В нашем коде в настоящее время мы используем API MFC, Gdiplus и сырые Win32.
Надеемся, что кто-то знает, как много рисовать современные графические интерфейсы.под Windows из C ++!
Только для того, чтобы это не стена текста, вот текущая версия обработчика рисования, который рисует кнопку с выгравированной границей при «горячем отслеживании» и одновременно с травлениемрамка и значок + текст «нажаты» (смещены на 1,1) в состоянии нажатия:
void CPlacesButton::PaintButton(CDC & dc, CRect & rcClient)
{
const int kLabelHeight = 8;
COLORREF clrHiLt = GetSysColor(COLOR_BTNHIGHLIGHT);
COLORREF clrShdo = GetSysColor(COLOR_BTNSHADOW);
COLORREF clrText = GetSysColor(COLOR_BTNTEXT);
COLORREF clrFace = GetSysColor(COLOR_BTNFACE);
// draw the button's background & border
if (m_bPressed || m_bDrawPressed || m_bMouseOnButton)
{
COLORREF clrDarkened = Darken(clrFace, -0.01f);
dc.FillRect(rcClient, &CBrush(clrDarkened));
//dc.Draw3dRect(rcClient, clrShdo, clrHiLt);
//dc.RoundRect(&rcClient, CPoint(10,10));
dc.DrawEdge(&rcClient, EDGE_ETCHED, BF_RECT|BF_FLAT);
//dc.DrawFrameControl(&rcClient, DFC_BUTTON, DFCS_BUTTONPUSH|DFCS_PUSHED);
}
// else if (m_bMouseOnButton) // hot draw
// //dc.Draw3dRect(rcClient, clrShdo, clrHiLt);
// dc.DrawEdge(&rcClient, EDGE_ETCHED, BF_RECT);
// //dc.RoundRect(&rcClient, CPoint(10,10));
else
dc.FillRect(rcClient, &CBrush(clrFace));
// use transparent mode for everything that follows
dc.SetBkMode(TRANSPARENT);
// center icon
CPoint ptIcon((rcClient.Width() - m_nIconSize) / 2, ((rcClient.Height() - m_nIconSize) / 2) - kLabelHeight);
if (m_bPressed || m_bDrawPressed)
ptIcon.Offset(1, 1);
// determine the state to draw ourselves in
const UINT nState = DST_ICON | (IsEnabled() ? DSS_NORMAL : DSS_DISABLED);
// draw our icon
dc.DrawState(ptIcon, CSize(m_nIconSize, m_nIconSize), m_hIcon, nState, (HBRUSH)NULL);
// create & select the font to use for the button's label
CFont guiFont;
VERIFY(guiFont.CreateStockObject(DEFAULT_GUI_FONT));
AutoSelectGDIObject select_font(dc, guiFont);
// determine clipping rect for label
CRect rcText(0, ptIcon.y+m_nIconSize+kLabelHeight, rcClient.Width(), ptIcon.y+m_nIconSize+kLabelHeight);
rcText.InflateRect(0,20);
if (m_bPressed || m_bDrawPressed)
rcText.OffsetRect(1, 1);
dc.SetTextColor(clrText);
if (IsEnabled())
dc.DrawText(m_strCaption, rcText, DT_VCENTER|DT_SINGLELINE|DT_CENTER);
else
dc.GrayString(NULL, NULL, (LPARAM)(LPCTSTR)m_strCaption, 0, rcText.TopLeft().x, rcText.TopLeft().y, rcText.Width(), rcText.Height());
}
Я оставил некоторые закомментированные варианты в коде, чтобы указать некоторые подсказки относительно того, что другоевозможности, которые я пробовалОднако это всего лишь подсказка, поскольку полных альтернативных примеров нет.