Форум: "Основная";
Текущий архив: 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