Среда, 16.07.2025, 18:41
Приветствую Вас Проходимец | RSS

Хотите Заработать!? ↓

Поиск

Статьи

Главная » Статьи » Обучение » Delphi

Урок 5. Тип TColor и цвет в OpenGL Delphi Обучение уроки [фрукт]

Разберем еще одну версию нашей первой программы, использующей 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 формы.


Категория: Delphi | Добавил: LimansK (14.07.2009)
Просмотров: 2698 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

DN™ © 2025
Хостинг от uCoz