Componentes.Terceros.jvcl/official/3.32/examples/JvGIFAnimator/GIFPAL.PAS

209 lines
6.2 KiB
Plaintext

{******************************************************************
JEDI-VCL Demo
Copyright (C) 2002 Project JEDI
Original author:
Contributor(s):
You may retrieve the latest version of this file at the JEDI-JVCL
home page, located at http://jvcl.sourceforge.net
The contents of this file are used with permission, subject to
the Mozilla Public License Version 1.1 (the "License"); you may
not use this file except in compliance with the License. You may
obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1_1Final.html
Software distributed under the License is distributed on an
"AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
******************************************************************}
{*******************************************************}
{ }
{ Delphi VCL Extensions (RX) demo program }
{ }
{ Copyright (c) 1997 Master-Bank }
{ }
{*******************************************************}
unit GIFPal;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, Grids, JvGrids, JvExGrids;
const
NumPaletteEntries = 256;
type
TPaletteForm = class(TForm)
RightPanel: TPanel;
OkBtn: TButton;
CancelBtn: TButton;
GridPanel: TPanel;
ColorGrid: TJvDrawGrid ;
procedure ColorGridDrawCell(Sender: TObject; Col, Row: Longint;
Rect: TRect; State: TGridDrawState);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FPaletteEntries: array[0..NumPaletteEntries - 1] of TPaletteEntry;
FPalette: HPALETTE;
FCount: Integer;
function CellColor(Row, Col: Longint): TColor;
procedure DrawSquare(Row, Col: Longint; CellRect: TRect; ShowSelector: Boolean);
procedure ColorToCell(AColor: TColor; var Col, Row: Longint);
protected
function GetPalette: HPALETTE; override;
public
{ Public declarations }
procedure SetPalette(Palette: HPALETTE);
end;
var
PaletteForm: TPaletteForm;
function SelectColor(Palette: HPALETTE; AColor: TColor): TColor;
implementation
uses JvJVCLUtils, Math;
{$R *.DFM}
function SelectColor(Palette: HPALETTE; AColor: TColor): TColor;
var
Col, Row: Longint;
begin
Result := AColor;
if Palette = 0 then begin
Beep; Exit;
end;
with TPaletteForm.Create(Application) do
try
SetPalette(Palette);
ColorToCell(AColor, Col, Row);
ColorGrid.Col := Col;
ColorGrid.Row := Row;
ActiveControl := ColorGrid;
if ShowModal = mrOk then begin
Result := CellColor(ColorGrid.Row, ColorGrid.Col);
end;
finally
Free;
end;
end;
procedure TPaletteForm.ColorToCell(AColor: TColor; var Col, Row: Longint);
var
I: Word;
begin
I := GetNearestPaletteIndex(FPalette, ColorToRGB(AColor));
if I < FCount then begin
Row := I div ColorGrid.RowCount;
Col := I - (ColorGrid.ColCount * Row);
end
else begin
Col := -1;
Row := -1;
end;
end;
function TPaletteForm.CellColor(Row, Col: Longint): TColor;
var
PalIndex: Integer;
begin
PalIndex := Col + (Row * ColorGrid.ColCount);
with FPaletteEntries[PalIndex] do
Result := TColor(RGB(peRed, peGreen, peBlue));
end;
procedure TPaletteForm.DrawSquare(Row, Col: Longint; CellRect: TRect;
ShowSelector: Boolean);
var
SavePal: HPalette;
begin
ColorGrid.Canvas.Pen.Color := clBtnFace;
with CellRect do ColorGrid.Canvas.Rectangle(Left, Top, Right, Bottom);
InflateRect(CellRect, -1, -1);
Frame3D(ColorGrid.Canvas, CellRect, clBtnShadow, clBtnHighlight, 2);
SavePal := 0;
if FPalette <> 0 then begin
SavePal := SelectPalette(ColorGrid.Canvas.Handle, FPalette, False);
RealizePalette(ColorGrid.Canvas.Handle);
end;
ColorGrid.Canvas.Brush.Color := PaletteColor(CellColor(Row, Col));
ColorGrid.Canvas.Pen.Color := PaletteColor(CellColor(Row, Col));
with CellRect do
ColorGrid.Canvas.Rectangle(Left, Top, Right, Bottom);
if FPalette <> 0 then
SelectPalette(ColorGrid.Canvas.Handle, SavePal, True);
if ShowSelector then begin
ColorGrid.Canvas.Brush.Color := Self.Color;
ColorGrid.Canvas.Pen.Color := Self.Color;
InflateRect(CellRect, -1, -1);
ColorGrid.Canvas.DrawFocusRect(CellRect);
end;
end;
function TPaletteForm.GetPalette: HPALETTE;
begin
if FPalette <> 0 then Result := FPalette
else Result := inherited GetPalette;
end;
procedure TPaletteForm.SetPalette(Palette: HPALETTE);
var
I: Integer;
begin
FCount := Min(PaletteEntries(Palette), NumPaletteEntries);
FPalette := Palette;
GetPaletteEntries(Palette, 0, FCount, FPaletteEntries);
if FCount <= 16 then begin
ColorGrid.RowCount := 2;
ColorGrid.ColCount := 8;
ColorGrid.DefaultColWidth := 31;
ColorGrid.DefaultRowHeight := 31;
end
else begin
ColorGrid.RowCount := FCount div 16;
if FCount mod 16 > 0 then
ColorGrid.RowCount := ColorGrid.RowCount + 1;
ColorGrid.ColCount := 16;
ColorGrid.DefaultColWidth := 18;
ColorGrid.DefaultRowHeight := 18;
end;
for I := FCount to NumPaletteEntries - 1 do
FillChar(FPaletteEntries[I], SizeOf(TPaletteEntry), $80);
ClientWidth := (ColorGrid.ColCount * ColorGrid.DefaultColWidth) +
(GridPanel.BorderWidth * 2) + RightPanel.Width +
(ColorGrid.Width - ColorGrid.ClientWidth);
ClientHeight := (ColorGrid.RowCount * ColorGrid.DefaultRowHeight) +
(GridPanel.BorderWidth * 2) + (ColorGrid.Height - ColorGrid.ClientHeight);
if HandleAllocated then PostMessage(Handle, WM_QUERYNEWPALETTE, 0, 0);
end;
procedure TPaletteForm.ColorGridDrawCell(Sender: TObject; Col,
Row: Longint; Rect: TRect; State: TGridDrawState);
begin
DrawSquare(Row, Col, Rect, gdFocused in State);
end;
procedure TPaletteForm.FormCreate(Sender: TObject);
begin
with ColorGrid.Canvas do begin
Brush.Style := bsSolid;
Pen.Color := clBlack;
end;
end;
end.