高分求解关于调色板的问题(200分)

D

dlluli

Unregistered / Unconfirmed
GUEST, unregistred user!
我想改变delphi的调色板控件的颜色索引表。想用一副位图的颜色表来改变它。但是TcolorGrid.FPaletteEntries
好像是只读的。请问有什么方法可以改变它吗?
我用的是如下方法:
for I:=0 to NumberColor-1 do
begin
with FPaletteEntries do
begin
peRed := ColorTab.rgbRed;//ColorTab是一幅位图的颜色表。ColorTab:Array of RGBQUAD
peGreen := ColorTab.rgbGreen;
peBlue := ColorTab.rgbBlue;
end;
end;
愿以200分相赠。
 
好像没有办法,FPaletteEntries是私有成员,
除非你修改TcolorGrid的源文件
 
从这个类继承,然后把这个属性用自己的代码重新写把DELPHI带的给覆盖掉。
 
等我回去查一下资料
 
传道兼灌水^_^

unit Paltst;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, ExtCtrls, Menus, Buttons;
type
TForm1 = class(TForm)
Image1: TImage;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
procedure QNewPalette(var Msg: TWMQueryNewPalette); message WM_QueryNewPalette;
procedure PalChanged(var Msg: TWMPaletteChanged); message WM_PaletteChanged;
public
{ Public declarations }
end;

var
Form1: TForm1;
Bmap: TBitmap;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
i: Word;
begin
Bmap := TBitmap.Create;
Bmap.LoadFromFile('Test.bmp');
Image1.Canvas.StretchDraw(Image1.BoundsRect, Bmap);
end;

procedure TForm1.QNewPalette(var Msg: TWMQueryNewPalette);
var
i: Word;
DC: HDC;
HPold: HPalette;
begin
DC := Form1.Canvas.Handle;
HPold := SelectPalette(DC, Bmap.Palette, False);
i := RealizePalette(DC);
SelectPalette(DC, HPold, False);
if (i > 0) then
InvalidateRect(Handle, Nil, False);
Msg.Result := i;
end;

procedure TForm1.PalChanged(var Msg: TWMPaletteChanged);
var
i: Word;
DC: HDC;
HPold: HPalette;
begin
if (Msg.PalChg = Handle) then
Msg.Result := 0
else
begin
DC := Form1.Canvas.Handle;
HPold := SelectPalette(DC, Bmap.Palette, True);
i := RealizePalette(DC);
UpdateColors(DC);
SelectPalette(DC, HPold, False);
end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Bmap.Free;
end;

end.
 
接受答案了.
 
顶部