Разберем еще одну версию нашей первой программы, использующей OpenGL
Пример 2
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,
OpenGL;
type
TfrmGL = class(TForm)
btnColor: TButton;
ColorDialog1: TColorDialog;
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btnColorClick(Sender: TObject);
private
hrc : HGLRC;
R, G, B : GLFloat;
procedure ColorToGL (c : TColor; var R, G, B : GLFloat);
end;
var
frmGL: TfrmGL;
implementation
{$R *.DFM}
{=======================================================================
Перевод цвета из TColor в OpenGL}
procedure TfrmGL.ColorToGL (c : TColor; var R, G, B : GLFloat);
begin
R := (c mod $100) / 255;
G := ((c div $100) mod $100) / 255;
B := (c div $10000) / 255;
end;
{=======================================================================
Рисование картинки}
procedure TfrmGL.FormPaint(Sender: TObject);
begin
wglMakeCurrent(Canvas.Handle, hrc);
glClearColor (R, G, B, 1.0); // цвет фона
glClear (GL_COLOR_BUFFER_BIT); // очистка буфера цвета
wglMakeCurrent(0, 0);
end;
{=======================================================================
Формат пикселя}
procedure SetDCPixelFormat (hdc : HDC);
var
pfd : TPixelFormatDescriptor;
nPixelFormat : Integer;
begin
FillChar (pfd, SizeOf (pfd), 0);
nPixelFormat := ChoosePixelFormat (hdc, @pfd);
SetPixelFormat (hdc, nPixelFormat, @pfd);
end;
{=======================================================================
Создание формы}
procedure TfrmGL.FormCreate(Sender: TObject);
begin
SetDCPixelFormat(Canvas.Handle);
hrc := wglCreateContext(Canvas.Handle);
Randomize;
R := random;
G := random;
B := random;
end;
{=======================================================================
Конец работы приложения}
procedure TfrmGL.FormDestroy(Sender: TObject);
begin
wglDeleteContext(hrc);
end;
procedure TfrmGL.btnColorClick(Sender: TObject);
begin
If ColorDialog1.Execute then begin
ColorToGL (ColorDialog1.Color, R, G, B);
Refresh;
end;
end;
end.
Здесь на форму помещена кнопка, при нажатии которой появляется стандартный диалог Windows выбора цвета. После выбора окно окрашивается в выбранный цвет, для чего используются команды OpenGL.
Цвет, возвращаемый диалогом, хранится в свойстве color компонента класса TColorDiaiog. Согласно справке, значение $OOFFFFFF этого свойства соответствует белому цвету, $OOFFOOOO — синему, $OOOOFFOO — зеленому, $OOOOOOFF — красному. То есть для выделения красной составляющей цвета необходимо вырезать первый слева байт, второй байт даст долю зеленого, третий — синего. Максимальное значение байта — 255, минимальное — ноль. Цвета же OpenGL располагаются в интервале от нуля до единицы.
Введена пользовательская процедура, определяющая тройку составляющих цветов для OpenGL по заданному аргументу типа
TColor:
procedure TfrmGL.ColorToGL (с : TCoior; var R, G, В : GLFloat); begin
R := (c mod $100) / 255;
G := «c div $100) mod $100) / 255;
В := {с div $10000) / 255; end;
Из аргумента вырезаются нужные байты и масштабируются в интервал [0; 1].
Те же действия можно сделать и другим, более "продвинутым" способом
R .= (с and $FF) / 255;
G := ((с and $FFOO) shr 8) / 255;
В := ((с and $FFOOOO) shr 16) / 255.
Эта процедура используется в обработчике нажатия кнопки:
If ColorDialogl.Execute then begin
ColorToGL (ColorDialogl.Color, R, G, B);
Refresh; end;
В примере для простоты окно перекрашивается обычным для Delphi способом — через вызов метода Refresh формы.