Есть ToolBar, который прорисовывается своими средствами (для чего так, даже не спрашивайте, имею то, что имею). В случае, если в XP включены стили, естественно возникает желание прорисовать ToolBar тоже этим же стилем, но тут неприятность, константы, описанные здесь не позволяют отрисовать тулбар градиентом, как, к примеру, это сделано в IE (да не только там, практически везде). Создается впечатление, что этот список не полный, но где тогда взять полный?
Здравствуйте, Alexx_id, Вы писали:
A_>Есть ToolBar, который прорисовывается своими средствами (для чего так, даже не спрашивайте, имею то, что имею). В случае, если в XP включены стили, естественно возникает желание прорисовать ToolBar тоже этим же стилем, но тут неприятность, константы, описанные здесь не позволяют отрисовать тулбар градиентом, как, к примеру, это сделано в IE (да не только там, практически везде). Создается впечатление, что этот список не полный, но где тогда взять полный?
Поищи здесь в исходниках файл tmschema.h, в нем и должен быть искомый список.
A_>Есть ToolBar, который прорисовывается своими средствами (для чего так, даже не спрашивайте, имею то, что имею). В случае, если в XP включены стили, естественно возникает желание прорисовать ToolBar тоже этим же стилем, но тут неприятность, константы, описанные здесь не позволяют отрисовать тулбар градиентом, как, к примеру, это сделано в IE (да не только там, практически везде). Создается впечатление, что этот список не полный, но где тогда взять полный?
Да вроде все там есть... SBP_UPPERTRACKVERT, SBP_THUMBBTNVERT, SBP_LOWERTRACKVERT
Здравствуйте, in trance, Вы писали:
IT>Поищи здесь в исходниках файл tmschema.h, в нем и должен быть искомый список.
Файла я там такого не нашел, но прога полезная, чтобы не искать константы методом тыка. К сожалению, в моем вопросе не прояснилось ни на грамм.. Нет там описанного выше градиента для Toolbar
Здравствуйте, Alexx_id, Вы писали:
A_>Файла я там такого не нашел, но прога полезная, чтобы не искать константы методом тыка. К сожалению, в моем вопросе не прояснилось ни на грамм.. Нет там описанного выше градиента для Toolbar
Здравствуйте, in trance, Вы писали:
IT>Сорри, мне казалось, что я его именно там нашел.
Файлец интересный, но опять же его возможности не выходят за пределы данных той ссылки, что я указывал в самом начале.
Начал разбирать исходники FireFox, там во всяком случае есть "свои" тулбары и они прорисовываются правильно. Посмотрю, как они решили этот вопрос
Здравствуйте, Alexx_id, Вы писали:
A_>Есть ToolBar, который прорисовывается своими средствами (для чего так, даже не спрашивайте, имею то, что имею). В случае, если в XP включены стили, естественно возникает желание прорисовать ToolBar тоже этим же стилем, но тут неприятность, константы, описанные здесь не позволяют отрисовать тулбар градиентом, как, к примеру, это сделано в IE (да не только там, практически везде). Создается впечатление, что этот список не полный, но где тогда взять полный?
Если в IE, то там тулбар "не прорисовывается", он прозрачен, а градиент от CoolBar-а. Что-бы добиться прозрачности надо юзать DrawThemeParentBackground (см. статью Поддержка Windows Visual Styles (Themes) API в Ваших органах управления)
а если градиент надо, то так (ВСВ)
#pragma comment (lib, "msimg32.lib")
void DrawGradient(TCanvas* pDC,TRect& Rect,
COLORREF StartColor,COLORREF EndColor,
BOOL bHorizontal,BOOL bUseSolid)
{
int Count = ::GetDeviceCaps(pDC->Handle, NUMCOLORS);
if(Count==-1)
bUseSolid = FALSE;
// for running under win95 and WinNt 4.0 without loading Msimg32.dll
if(!bUseSolid )
{
TRIVERTEX vert[2] ;
GRADIENT_RECT gRect;
vert [0].y = Rect.Top;
vert [0].x = Rect.Left;
vert [0].Red = COLOR16(COLOR16(GetRValue(StartColor))<<8);
vert [0].Green = COLOR16(COLOR16(GetGValue(StartColor))<<8);
vert [0].Blue = COLOR16(COLOR16(GetBValue(StartColor))<<8);
vert [0].Alpha = 0x0000;
vert [1].y = Rect.Bottom;
vert [1].x = Rect.Right;
vert [1].Red = COLOR16(COLOR16(GetRValue(EndColor))<<8);
vert [1].Green = COLOR16(COLOR16(GetGValue(EndColor))<<8);
vert [1].Blue = COLOR16(COLOR16(GetBValue(EndColor))<<8);
vert [1].Alpha = 0x0000;
gRect.UpperLeft = 0;
gRect.LowerRight = 1;
if(bHorizontal)
{
GradientFill(pDC->Handle,vert,2,&gRect,1,GRADIENT_FILL_RECT_H);
}
else
{
GradientFill(pDC->Handle,vert,2,&gRect,1,GRADIENT_FILL_RECT_V);
}
}
else
{
BYTE StartRed = GetRValue(StartColor);
BYTE StartGreen = GetGValue(StartColor);
BYTE StartBlue = GetBValue(StartColor);
BYTE EndRed = GetRValue(EndColor);
BYTE EndGreen = GetGValue(EndColor);
BYTE EndBlue = GetBValue(EndColor);
int n = (bHorizontal)?Rect.Width():Rect.Height();
// only need for the rest, can be optimized
{
if(bUseSolid)
{
// We need a solid brush (can not be doted)
TColor oldcolor = pDC->Brush->Color;
pDC->Brush->Color = ::GetNearestColor(pDC->Handle, EndColor);
pDC->FillRect(Rect);//FillSolidRect(Rect,pDC->GetNearestColor(EndColor));
pDC->Brush->Color = oldcolor;
}
else
{
// We need a brush (can be doted)
TColor oldcolor = pDC->Brush->Color;
pDC->Brush->Color = EndColor;
pDC->FillRect(Rect);
pDC->Brush->Color = oldcolor;
}
}
int dy = 2;
n-=dy;
for(int dn=0;dn<=n;dn+=dy)
{
BYTE ActRed = (BYTE)(MulDiv(int(EndRed)-StartRed,dn,n)+StartRed);
BYTE ActGreen = (BYTE)(MulDiv(int(EndGreen)-StartGreen,dn,n)+StartGreen);
BYTE ActBlue = (BYTE)(MulDiv(int(EndBlue)-StartBlue,dn,n)+StartBlue);
TRect TempRect;
if(bHorizontal)
{
TempRect = TRect(TPoint(Rect.left+dn,Rect.top),TPoint(dy,Rect.Height()));
}
else
{
TempRect = TRect(TPoint(Rect.left,Rect.top+dn),TPoint(Rect.Width(),dy));
}
if(bUseSolid)
{
TColor oldcolor = pDC->Brush->Color;
pDC->Brush->Color = ::GetNearestColor(pDC->Handle, RGB(ActRed,ActGreen,ActBlue));
pDC->FillRect(TempRect);
pDC->Brush->Color = oldcolor;
}
else
{
//CBrush TempBrush(RGB(ActRed,ActGreen,ActBlue));
TColor oldcolor = pDC->Brush->Color;
pDC->Brush->Color = RGB(ActRed,ActGreen,ActBlue);
pDC->FillRect(TempRect);
pDC->Brush->Color = oldcolor;
}
}
}
}
ДА!!! Это то, что нужно было. Откуда у тебя эти числа? Недокументированные возможности? Есть еще что подобное? Случайно не встречались константы для EDIT'а? Перечисленные в офиц. доке не позволяют правильно прорисовать Readonly (специально чтоли скрывают?)
Здравствуйте, _GIZMO, Вы писали:
PK>> HTHEME hTheme = OpenThemeData(hWnd /*toolbar window handle*/, _GI>почему здесь — /*toolbar window handle*/
Здесь HWND окна для рисования которого применяется тема.
Кстати потом ее желательно закрыть с помощью CloseThemeData(hTheme). PK>> L"Rebar"); _GI>а схема для — L"Rebar"?
Не понял вопроса.
Здравствуйте, Alexx_id, Вы писали: A_>ДА!!! Это то, что нужно было. Откуда у тебя эти числа? Недокументированные возможности? Есть еще что подобное? Случайно не встречались константы для EDIT'а? Перечисленные в офиц. доке не позволяют правильно прорисовать Readonly (специально чтоли скрывают?)
Честно говоря, получено методом проб и ошибок.
Все что можно нарисовать с помощью Visual Styles можно посмотреть в ресурсах (dll) соответствующих тем Windows, например Luna.
Там это хранится в виде растров.
Вообще говоря, Visual Styles слабо документированы.
Насчет EDIT'а я точно не знаю. По-моему там просто надо использовать DrawThemeText.
А вообще, можно попробовать "поиграть" значениями iPartId и iStateId (они небольшие).
Здравствуйте, Peter K., Вы писали:
A_>>ДА!!! Это то, что нужно было. Откуда у тебя эти числа? Недокументированные возможности? Есть еще что подобное? Случайно не встречались константы для EDIT'а? Перечисленные в офиц. доке не позволяют правильно прорисовать Readonly (специально чтоли скрывают?) PK>Честно говоря, получено методом проб и ошибок. PK>Все что можно нарисовать с помощью Visual Styles можно посмотреть в ресурсах (dll) соответствующих тем Windows, например Luna. PK>Там это хранится в виде растров. PK>Вообще говоря, Visual Styles слабо документированы.
PK>Насчет EDIT'а я точно не знаю. По-моему там просто надо использовать DrawThemeText. PK>А вообще, можно попробовать "поиграть" значениями iPartId и iStateId (они небольшие).
Здравствуйте, Alexx_id, Вы писали:
A_>ДА!!! Это то, что нужно было. Откуда у тебя эти числа? Недокументированные возможности? Есть еще что подобное? Случайно не встречались константы для EDIT'а? Перечисленные в офиц. доке не позволяют правильно прорисовать Readonly (специально чтоли скрывают?)
я что-то совсем запутался... эффект этого кода какой? У меня не получается отрисовать прозрачный тулбар
Здравствуйте, _GIZMO, Вы писали:
A_>>ДА!!! Это то, что нужно было. Откуда у тебя эти числа? Недокументированные возможности? Есть еще что подобное? Случайно не встречались константы для EDIT'а? Перечисленные в офиц. доке не позволяют правильно прорисовать Readonly (специально чтоли скрывают?) _GI>я что-то совсем запутался... эффект этого кода какой? У меня не получается отрисовать прозрачный тулбар
Прозрачный тулбар и не требовался, нужен был тулбар с фоном в виде градиента.
Здравствуйте, _GIZMO, Вы писали: _GI>я что-то совсем запутался... эффект этого кода какой? У меня не получается отрисовать прозрачный тулбар
Что значит прозрачный тулбар?
Этот код как-раз заполняет фон тулбара (или окна, которое должно выглядеть как тулбар).
Также его можно применить для заполнения общего (т.е. одного на все) фона ребара, на котором могут быть расположены несколько тулбаров.
Тогда в самих тулбарах фон надо заполнять с помощью DrawThemeParentBackground, а затем рисовать их собственные элементы — кнопки, gripper'ы, шевроны и т.п.