C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как сделать градиентную заливку ?, через GradientFill из msimg32.dll (lib)
Rius
Отправлено: 17.04.2005, 19:59


Мастер участка

Группа: Участник
Сообщений: 321



Почему не работает код градиентной заливки? Точнее заливает черным цветом.

//-------
Все, нашел. Цвета здесь не 8, а 16 бит.
CODE
//---------------------------------------------------------------------------
bool GradientRect(HDC hDC, TRect &Rect, bool Vert, TColor Start, TColor End)
{
   TRIVERTEX vert[2];
   TColor start, end;

   start = clBlack;
   end = clWhite;

//    HDC hDC = GetDC(PaintBox1);

   vert[0].x = Rect.Left;
   vert[0].y = Rect.Top;
   vert[0].Red   = GetRValue(start)<<8;
   vert[0].Green = GetGValue(start)<<8;
   vert[0].Blue  = GetBValue(start)<<8;
   vert[0].Alpha = 0;

   vert[1].x = Rect.Right;
   vert[1].y = Rect.Bottom;
   vert[1].Red   = GetRValue(end)<<8;
   vert[1].Green = GetGValue(end)<<8;
   vert[1].Blue  = GetBValue(end)<<8;
   vert[1].Alpha = 10;

   GRADIENT_RECT gRect;
   gRect.UpperLeft = 0;
   gRect.LowerRight = 1;

   DWORD Direction = GRADIENT_FILL_RECT_H | GRADIENT_FILL_RECT_V;

   return GradientFill(hDC, &vert[0], 2, &gRect, 1, Direction);
}


Отредактировано Rius — 17/04/2005, 23:14
Sl@Sh
Отправлено: 17.04.2005, 20:56


Мастер участка

Группа: Участник
Сообщений: 383



1) Зачем в функции объявлять TColor start, end; если эти цвета передаются как параметры функции ?

2) Использование этого способа для вас принципиально важно ?
Просто наиболее распространённый вариант имеет длину (в строчках),
где-то такую же, и работает думаю не хуже.

P.S.: Если вам просто нужно реализовать градиент, скажите, я напишу.
Rius
Отправлено: 17.04.2005, 21:12


Мастер участка

Группа: Участник
Сообщений: 321



Sl@Sh
Спасибо, я тоже заметил глюки, но уже при прорисовке компонента. Исправил:
CODE
//---------------------------------------------------------------------------
bool GradientRect(HDC hDC, TRect &Rect, bool IsVertical, TColor Start, TColor End)
{
TRIVERTEX vert[2];

vert[0].x = Rect.Left;
vert[0].y = Rect.Top;
vert[0].Red = GetRValue(Start)<<8;
vert[0].Green = GetGValue(Start)<<8;
vert[0].Blue = GetBValue(Start)<<8;
vert[0].Alpha = 0;

vert[1].x = Rect.Right;
vert[1].y = Rect.Bottom;
vert[1].Red = GetRValue(End)<<8;
vert[1].Green = GetGValue(End)<<8;
vert[1].Blue = GetBValue(End)<<8;
vert[1].Alpha = 10;

GRADIENT_RECT gRect;
gRect.UpperLeft = 0;
gRect.LowerRight = 1;

DWORD Direction = (IsVertical ? GRADIENT_FILL_RECT_V : GRADIENT_FILL_RECT_H);

return GradientFill(hDC, &vert[0], 2, &gRect, 1, Direction);
}

Другие варианты пробовал и ручные, где-то даже завалялось описание на самые разные способы заливки.
Принципиально использование библиотеки винды (интересно просто). Раньше таскал ресурс JPEG с этой заливкой smile.gif
В этой же библиотеке есть прорисовка bitmap с альфа-каналами, скоро может ещё пригодится.

Новый вопрос: компонент теперь юзает библиотеку msimg32. После установке на форму проекта линкер ругается на unresolved external (когда-то эта ошибка вводила меня в ступор smile.gif ), приходится подключать вручную библиотеку.
Как сделать, чтобы при становке компонента на форму msimg32.lib сама подключалась к проекту?
Макрос USELIB почему-то не срабатывает.

Отредактировано Rius — 18/04/2005, 00:15
Sl@Sh
Отправлено: 18.04.2005, 16:56


Мастер участка

Группа: Участник
Сообщений: 383



Вы создаёте компонент ? Чесно говоря никогда этого не делал, хотя есть соответствующая литература. USELIB поидее должен работать. У вас библиотека рядом с проектом лежит ?
Rius
Отправлено: 18.04.2005, 18:19


Мастер участка

Группа: Участник
Сообщений: 321



Нет, лежит она в $BCB$\Lib\Psdk.
Вот что в хэлпе нашел:
QUOTE
Use macros no longer used

File information is now stored in section of the project options file (bpr or bpk).

As a consequence, the following use macros are ignored as of C++Builder 6:

#define USEFORMRES(FileName, FormName, AncestorName)

#define USEUNIT(ModName)
#define USEOBJ(FileName)
#define USERC(FileName)
#define USEASM(FileName)
#define USEDEF(FileName)
#define USERES(FileName)
#define USETLB(FileName)
#define USELIB(FileName)
#define USEFILE(FileName)
#define USEPACKAGE(FileName)
#define USEIDL(FileName)
#define USE(FileName, ContainerId)

These macros are often used to alter the build order of a project. They are not removed when you update your project to C++Builder 6. You don't have to remove them from your code and they will not affect your builds. To change the order in which your files are compiled, display the Project Manager and drag and drop the files so they appear in the order you want them built.

Короче похоже такой макрос в билдере 6 игнорируется.
Это можно как-нибудь обойти?
Sl@Sh
Отправлено: 19.04.2005, 15:50


Мастер участка

Группа: Участник
Сообщений: 383



Могу сказать одно, что при создании библиотеки, USELIB точно не катит и нужно всё к проекту ручками подключать

Альтернатива : Может как-то можно редактировать сам bpr файл. А именно строку <SPARELIBS value="vcl.lib> &
Rius
Отправлено: 19.04.2005, 19:06


Мастер участка

Группа: Участник
Сообщений: 321



Значит ручками, через Project->Add, спасибо борланду за ещё одну "фичу" wink.gif
FataLL
Отправлено: 20.04.2005, 03:11


Дежурный стрелочник

Группа: Участник
Сообщений: 37



Может, путь прописать в Environment Options? wink.gif
Rius
Отправлено: 20.04.2005, 07:17


Мастер участка

Группа: Участник
Сообщений: 321



FataLL Tools/Enviroment Options/Library/Library path, уже прописано:
$(BCB)\Lib;$(BCB)\Bin;$(BCB)\Imports;$(BCB)\Projects\Bpl;$(BCB)\Projects\Lib;C:\Program Files\Steema Software\TeeChart 6 for C++ Builder 6\CBuilder6\Lib;C:\Borland\CBuilder6\TeeChart\CBuilder6\Lib;c:\borland\cbuilder6\projects\components;c:\borland\cbuilder6\lib\psdk

Отредактировано Rius — 20/04/2005, 10:18

Вернуться в Вопросы программирования в C++Builder