![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сделать плавный переход одного цвета в другой? [D5, Win95/98, WinME, NT4, Win2k, WinXP]
Dmittry © (2002-11-07 19:18:00)Для примера есть два цвета(нанальный-Blue и конечный-Black) как в Bitmap сделать переход первого цвета во второй(типа фона у многих инсталляторов программ)?
Геннадий (2002-11-08 16:35:00) [1]А ещё такой вопрос. Если свернут окно, затем его восстановить - то весь рисунок стирается. Как сделать его устойчевым?
Кот Бегемот (2002-11-08 16:24:00) [2]2Николай Быков ©
Чего то твой супер-пупер код на 256 цветах не работает :(
И моргание заметно :(((
Геннадий (2002-11-08 13:26:00) [3]А про OpenGL можно где-нибудь по-русски почитать?
Николай Быков (2002-11-08 10:43:00) [4]
> Геннадий © (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 10:22:00) [5]Спасибо за объяснение. Я вот тут твой код слегка изменил и превратил в отдельную процедуру:
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 08:49:00) [6]Расскажите если не получилось/получилось, поняли/не поняли.
Может что-нибудь еще рассказать?
Николай Быков (2002-11-08 08:39:00) [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:25:00) [8]==>> Николай Быков ©
А как устанавливать сами цвета? От какого к какому переход. У меня он только ч/б рисует...
Николай Быков (2002-11-08 06:13:00) [9]И еще
в строчке dc:=GetDC(Handle); можно вставить Handle практически от любого компонента, напрмер, Button1.Handle, Panel1.Handle и т.д. Тогда рисоваться будет не на форме а на этом компоненте
Николай Быков (2002-11-08 06:08:00) [10]А можно сделать проще и во МНОГО раз быстрее
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) рисоваться переход будет в ту сторону. Поэкспериментируйте! Очень интересно
Almaz (2002-11-08 05:46:00) [11]А еще есть API функция
GradientFill
Удачи.
mukha (2002-11-07 21:06:00) [12]Можно сделать так:
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.
Геннадий (2002-11-07 20:05:00) [13]Я не дизайнер, но с моей точки зрения так. Каждый цвет раскладывается на три составляющие. RGB. Это ведь цифры. Находится разница между каждой соответсвующей составляющей. Далее определяется разница в расстоянии. То есть между двумя концами - 10 точек. Далее Разница в составляющей делится на расстояние. Получаем приращение на каждую новую точку для каждой составляющей. Затем всё это выводится на Canvas. Я это не проверял - просто мысли вслух.