Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.18;
Скачать: CL | DM;

Вниз

Как сделать плавный переход одного цвета в другой?   Найти похожие ветки 

 
Dmittry   (2002-11-07 19:18) [0]

Для примера есть два цвета(нанальный-Blue и конечный-Black) как в Bitmap сделать переход первого цвета во второй(типа фона у многих инсталляторов программ)?


 
Геннадий ©   (2002-11-07 20:05) [1]

Я не дизайнер, но с моей точки зрения так. Каждый цвет раскладывается на три составляющие. RGB. Это ведь цифры. Находится разница между каждой соответсвующей составляющей. Далее определяется разница в расстоянии. То есть между двумя концами - 10 точек. Далее Разница в составляющей делится на расстояние. Получаем приращение на каждую новую точку для каждой составляющей. Затем всё это выводится на Canvas. Я это не проверял - просто мысли вслух.


 
mukha ©   (2002-11-07 21:06) [2]

Можно сделать так:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormPaint(Sender: TObject);
var
Row,Ht:Word;
begin
Ht:=(ClientHeight+255) div 256;
for row:=0 to 255 do
with Canvas do
begin
Brush.Color:=RGB(0,0,Row);
FillRect(Rect(0,Row*Ht,clientWidth,(Row+1)*Ht));
end;
end;

end.


 
Almaz ©   (2002-11-08 05:46) [3]

А еще есть API функция GradientFill

Удачи.


 
Николай Быков ©   (2002-11-08 06:08) [4]

А можно сделать проще и во МНОГО раз быстрее

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OpenGL, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure PAINT(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
DC:HDC;
HRC:HGLRC;
// BMP:TBitmap;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var pfd:TPixelFormatDescriptor;nPixelFormat:integer;
begin
DC:=GetDC(Handle);
FillChar(pfd,SizeOf(pfd),0);
nPixelFormat:=ChoosePixelFormat(DC,@pfd);
SetPixelFormat(DC,nPixelFormat,@pfd);
hrc:=wglCreateContext(dc);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
wglDeleteContext(hrc);
end;

procedure TForm1.PAINT(Sender: TObject);
begin
wglMakeCurrent(dc,hrc);
glViewPort(0,0,ClientWidth, ClientHeight);
glColor3f(0,0,0);
glPointSize(20);
glBegin(GL_QUADS);
glVertex2f(-1,1);

glVertex2f(-1,-1);
glColor3f(1,1,1);
glVertex2f(1,-1);

glVertex2f(1,1);
glEnd;
wglMakeCurrent(0,0);
end;

end.

Вот так будет рисоваться переход на форме
В засвисимости от того, куда постваить glColor3f(1,1,1) рисоваться переход будет в ту сторону. Поэкспериментируйте! Очень интересно


 
Николай Быков ©   (2002-11-08 06:13) [5]

И еще
в строчке dc:=GetDC(Handle); можно вставить Handle практически от любого компонента, напрмер, Button1.Handle, Panel1.Handle и т.д. Тогда рисоваться будет не на форме а на этом компоненте


 
Геннадий ©   (2002-11-08 08:25) [6]

==>> Николай Быков ©

А как устанавливать сами цвета? От какого к какому переход. У меня он только ч/б рисует...


 
Николай Быков ©   (2002-11-08 08:39) [7]


> Геннадий © (08.11.02 08:25)

Строчка glColor3f(0,0,0); определяет начальный цвет
Строчка glColor3f(1,1,1); определяет конечный цвет в этом исходнике.

все три числа этих процедур изменять надо от 0 до 1 (напрмер 0.003; 0.75 и т.п.) каждое число отвечает за составляющее цвета

они идут в таком порядке RED, GREEN, BLUE соответвенно.

Моя любимая комбинация такая glColor3f(0.25, 0.75, 1.0);
0.25 красного; 0.75 зеленого; 1.0 синего;

Также можно использовать процедуру glColor3i (red, green, blue:integer);
Здесь параметры имеют тип integer


 
Николай Быков ©   (2002-11-08 08:49) [8]

Расскажите если не получилось/получилось, поняли/не поняли.
Может что-нибудь еще рассказать?


 
Геннадий ©   (2002-11-08 10:22) [9]

Спасибо за объяснение. Я вот тут твой код слегка изменил и превратил в отдельную процедуру:


unit TurnColorUnit;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OpenGL, StdCtrls, ExtCtrls;

type
TTurnColorForm = class(TForm)
DoPaintButton: TButton;
Panel: TPanel;
StartColorBox: TColorBox;
StaticText1: TStaticText;
EndColorBox: TColorBox;
StaticText2: TStaticText;
Shape: TShape;
procedure DoPaintButtonClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
TurnColorForm: TTurnColorForm;

implementation

{$R *.dfm}



procedure TurnPaint(WinCon: TWinControl; StCol, EndCol: TColor);
var
pfd : TPixelFormatDescriptor;
nPixelFormat : Integer;
DC : HDC;
HRC : HGLRC;

begin
DC:=GetDC(WinCon.Handle);
FillChar(pfd, SizeOf(pfd), 0);
nPixelFormat:= ChoosePixelFormat(DC, @pfd);
SetPixelFormat(DC, nPixelFormat, @pfd);
hrc:= wglCreateContext(dc);


wglMakeCurrent(dc, hrc);
glViewPort(0, 0, WinCon.ClientWidth, WinCon.ClientHeight);
glColor3f(GetRValue(StCol), GetGValue(StCol), GetBValue(StCol)); //начальный цвет в RGB от 0 до 1 для glColor3f и в Integer для glColor3i // но почему-то F и для Byte работает...
glPointSize(20);
glBegin(GL_QUADS);
glVertex2f(-1, 1);

glVertex2f(-1, -1);
glColor3f(GetRValue(EndCol), GetGValue(EndCol), GetBValue(EndCol)); //конечный цвет в RGB
glVertex2f(1, -1);

glVertex2f(1, 1);
glEnd;
wglMakeCurrent(0, 0);


wglDeleteContext(hrc);

end;


procedure TTurnColorForm.DoPaintButtonClick(Sender: TObject);
begin
TurnPaint(Self.Panel, StartColorBox.Selected, EndColorBox.Selected);
end;

end.


 
Николай Быков ©   (2002-11-08 10:43) [10]


> Геннадий © (08.11.02 10:22)

Cool!!! Я раньше даже и принимал в рассмотрение случай, что можно выбирать формат пикселя для каждого компонента отдельно :-)

Кстати если интересно, то так можно создавать любые многоугольники и прочие геометрические фигуры.
Если посмотреть в Деьфийском хелпе по Windows SDK то там можно увидеть и другие константы для glBegin().
+ можно апгрейдить эту процедуру, чтобы она рисовала градиент только в строго обозначенном TRect.

glViewPort(x,y,width,height); параметры: левый нижний угол, ширина, высота.
Ограничивает поле для рисования примитивов (линии, прямоугольники, многоугольники, треугольники). В этом поле
центр имеет координаты (0;0). правый верхинй край координаты (1;1), левый верхний - (-1;1), правый нижний (1;-1), левый нижний (-1;-1).
Проще говоря ограничивает координатную плоскость.

glScissor(те же параметры, что и для glViewPort).
Ограничивает поле вывода любой графики (не изменяет ограничение для координатной плоскости).
То есть если вы сделали так

glViewPort(0,0,200,200);
glEnable(GL_SCISSOR_TEST);//необходимо для работы glScissor();
glScissor(0,0,100,100);

то графику вы увидите только на квадрате 100х100. Несмотря на это центр координатной плоскости будет находиться в точке (100;100), т.к. вся плоскость уладывается в квадрате 200х200 (glViewPort(0,0,200,200))


 
Геннадий ©   (2002-11-08 13:26) [11]

А про OpenGL можно где-нибудь по-русски почитать?


 
Кот Бегемот ©   (2002-11-08 16:24) [12]

2Николай Быков ©
Чего то твой супер-пупер код на 256 цветах не работает :(
И моргание заметно :(((


 
Геннадий ©   (2002-11-08 16:35) [13]

А ещё такой вопрос. Если свернут окно, затем его восстановить - то весь рисунок стирается. Как сделать его устойчевым?



Страницы: 1 вся ветка

Текущий архив: 2002.11.18;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.014 c
4-59475
Donatas
2002-10-06 18:27
2002.11.18
HOOK и и тд


14-59395
}{unter
2002-10-30 15:21
2002.11.18
ERSI и GIS


14-59370
iNew
2002-10-30 07:13
2002.11.18
Проинсталировал Delphi_6.0, инсталаяция прошла успешно, а


1-59094
_Nicola_
2002-11-05 17:45
2002.11.18
Сохранить набор иконок в 1 файле


14-59393
Georg
2002-10-27 20:15
2002.11.18
Shell не подоshеll