Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.11.18;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.009 c
1-59095
Митяй2
2002-11-07 09:50
2002.11.18
Двоичная запись


1-59212
Sergic
2002-11-06 14:14
2002.11.18
создание собственных типов при использовании COM


3-59075
sky3d
2002-10-30 13:13
2002.11.18
String Code Generation (для знатоков PL_SQL)


6-59317
Кеплин Сергей
2002-09-15 00:15
2002.11.18
Заполнить INPUT в интернете и нажать програмно SUBMIT...


1-59239
TTCustomDelphiMaster
2002-11-06 14:45
2002.11.18
Пользовательские сообщения





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский