返回
{***************************************************************}
{*** FVision Unit Version1.0 ***}
{*** 蓝蚂蚁工作室 ***}
{***************************************************************}
{*** 调色板设置单元 ***}
{***************************************************************}
Unit DacDlg;
Interface
Uses
Dos,FTool,FGraph,FView,FEvent,FMouse,
FMenu,FControl,FDac,FExtDrv;
Type
PDacDlg=^TDacDlg;
TDacDlg=object(TWindow)
GtDac:DacType;
Pal:PDacSelect;
ColBroad:PShape;
ColStr:PStaticText;
Scro:Array[1..3] of PScrollBar;
VolText:Array[0..3] of PStaticText;
DacPtr:Pointer;
StaColor:Integer;
ColArr:array[0..255] of Integer;
Constructor Init(var D:DacType;Col:Integer);
Destructor Done;virtual;
Procedure InitMenu;virtual;
Procedure SetNewColor;
Procedure HandleEvent(var Event:TEvent);virtual;
Procedure SetData;virtual;
end;
Implementation
Const
cmDLight = 600;
cmDColor = 601;
cmDNumber = 602;
Constructor TDacDlg.Init;
var
R:TRect;
i:Integer;
But:PButton;
begin
AssignRect(R,0,0,420,295);
Inherited Init(R,'编辑DAC寄存器',True);
System.Move(D,GtDac,768);
DacPtr:=@D;
StaColor:=Col;
AssignRect(R,20,50,400,205);
Insert(New(PShape,Init(gcDBroad+gcHideMouse,R,0,0,0,0,'')));
AssignRect(R,34,55,390,200);
Pal:=New(PDacSelect,Init(R));
Pal^.CurPos:=StaColor;
Insert(Pal);
AssignRect(R,20,210,90,255);
ColBroad:=New(PShape,Init(gcBroad+gcHideMouse,R,1,0,StaColor,0,''));
Insert(ColBroad);
AssignRect(R,20,260,90,280);
Insert(New(PShape,Init(gcBroad+gcHideMouse,R,0,0,10,0,'')));
ColStr:=New(PStaticText,Init(stNormal+stFColor,22,262,'序号:'+IntStr(StaColor),$A4));
Insert(ColStr);
AssignRect(R,100,210,290,280);
Insert(New(PShape,Init(gcDBroad+gcHideMouse,R,0,0,0,0,'')));
AssignRect(R,115,217,140,16);
Insert(New(PStaticText,Init(stNormal,105,R.a.y,'R',4)));
Scro[1]:=New(PScrollBar,Init(SbHor,R,GtDac[StaColor*3+1]/63));
Inc(R.a.y,20);
Insert(New(PStaticText,Init(stNormal,105,R.a.y,'G',4)));
Scro[2]:=New(PScrollBar,Init(SbHor,R,GtDac[StaColor*3+2]/63));
Inc(R.a.y,20);
Insert(New(PStaticText,Init(stNormal,105,R.a.y,'B',4)));
Scro[3]:=New(PScrollBar,Init(SbHor,R,GtDac[StaColor*3+3]/63));
for i:=1 to 3 do Insert(Scro[i]);
for i:=1 to 3 do Scro[i]^.Option:=Scro[i]^.Option and (not opCantSelect);
for i:=1 to 3 do
begin
VolText[i]:=New(PStaticText,Init(stNormal,260,217+(i-1)*20,Intstr(GtDac[StaColor*3+i]),0));
Insert(VolText[i]);
end;
But:=New(PButton,Init(300 ,210,320,230,'※',kbAltL,cmDLight));
But^.SetHint('亮度谱');
Insert(But);
But:=New(PButton,Init(300 ,235,320,255,'☆',0,cmDColor));
But^.SetHint('色度谱');
Insert(But);
But:=New(PButton,Init(300 ,260,320,280,'№',0,cmDNumber));
But^.SetHint('饱和度谱');
Insert(But);
Insert(New(PButton,Init(350 ,210,400,230,'确定',0,cmOk)));
Insert(New(PButton,Init(350 ,235,400,255,'放弃',0,cmCancel)));
Insert(New(PButton,Init(350 ,260,400,280,'帮助',kbF1,cmHelp)));
Next;
Next;
Center;
end;
Destructor TDacDlg.Done;
begin
Dac.SetNewDac(DacType(DacPtr^));
Inherited Done;
end;
Procedure TDacDlg.InitMenu;
var
T:TRect;
begin
Inherited InitMenu;
AssignRect(T,5,27,Broad.b.x-5,44);
Insert(New(PMainMenu,Init(T,False,
NewSubMenu('文件~F~',kbAltF,New(PMenu,Init(
NewMenuItem('读取',kbNoKey,cmOpen,nil,
NewMenuItem('保存',kbNoKey,cmSave,nil,
NewMenuItem('重置',kbNoKey,cmReset,nil,
NewMenuItem('',0,0,nil,
NewMenuItem('关闭 ~Alt+F3~',kbAltF3,cmCloseWin,nil,nil))))))),
NewSubMenu('查看~V~',kbAltV,New(PMenu,Init(
NewMenuItem('亮度谱',kbNoKey,cmDLight,nil,
NewMenuItem('色度谱',kbNoKey,cmDColor,nil,
NewMenuItem('饱和度谱',kbNoKey,cmDNumber,nil,nil))))),
NewSubMenu('帮助~H~',kbAltH,New(PMenu,Init(
NewMenuItem('关于',kbNoKey,cmAbout,nil,nil))),nil))))));
end;
Procedure TDacDlg.SetNewColor;
var
i:Integer;
begin
StaColor:=Pal^.CurPos;
for i:=1 to 3 do
begin
Scro[i]^.NewPos(GtDac[StaColor*3+i]/63);
VolText[i]^.Modify(Intstr(GtDac[StaColor*3+i]));
end;
ColBroad^.Par3:=StaColor;
ColBroad^.Paint;
ColStr^.Modify('序号:'+IntStr(StaColor));
end;
Procedure TDacDlg.HandleEvent;
var
FName:PathStr;
i,Temp:Integer;
begin
Inherited HandleEvent(Event);
case Event.What of
evCommand:case Event.Command of
cmChange:SetNewColor;
cmInterHor:for i:=1 to 3 do
if Event.Index=Scro[i] then
begin
Temp:=Round(Event.InfoReal*63);
if Temp<>GtDac[StaColor*3+i] then
begin
GtDac[StaColor*3+i]:=Temp;
Dac.SetNewDac(GtDac);
Scro[i]^.NewPos(GtDac[StaColor*3+i]/63);
VolText[i]^.Modify(Intstr(GtDac[StaColor*3+i]));
Event.InfoPtr:=Scro[i];
end;
end;
cmLeft:for i:=1 to 3 do
if Event.InfoPtr=Scro[i] then
begin
if GtDac[StaColor*3+i]>0 then
begin
Dec(GtDac[StaColor*3+i]);
Dac.SetNewDac(GtDac);
Scro[i]^.NewPos(GtDac[StaColor*3+i]/63);
VolText[i]^.Modify(Intstr(GtDac[StaColor*3+i]));
end;
end;
cmRight:for i:=1 to 3 do
if Event.InfoPtr=Scro[i] then
begin
if GtDac[StaColor*3+i]<63 then
begin
Inc(GtDac[StaColor*3+i]);
Dac.SetNewDac(GtDac);
Scro[i]^.NewPos(GtDac[StaColor*3+i]/63);
VolText[i]^.Modify(Intstr(GtDac[StaColor*3+i]));
end;
end;
cmOpen:if OpenFile(FName,'读取调色板文件','*.PAL') and Exist_Fi(FName) then
begin
LoadDacFile(FName,GtDac);
Dac.SetNewDac(GtDac);
SetNewColor;
end;
cmSave:if OpenFile(FName,'保存调色板文件','*.PAL') then
begin
FName:=Ch_Name(FName,'PAL');
SaveDacFile(FName,GtDac);
end;
cmReset:begin
System.Move(DacPtr^,GtDac,768);
Dac.SetNewDac(GtDac);
SetNewColor;
end;
cmDLight:begin
for i:=0 to 255 do
ColArr[i]:=(Integer(GtDac[i*3+1])*30+
Integer(GtDac[i*3+2])*59+
Integer(GtDac[i*3+3])*11) div 100;
RunView(New(PDiagramWin,Init('亮度谱',ColArr,256)),Event);
ClearEvent(Event);
end;
cmDColor:begin
for i:=0 to 255 do
ColArr[i]:=(Integer(GtDac[i*3+1])*60+
Integer(GtDac[i*3+2])*28+
Integer(GtDac[i*3+3])*32) div 100;
RunView(New(PDiagramWin,Init('色度谱',ColArr,256)),Event);
ClearEvent(Event);
end;
cmDNumber:begin
for i:=0 to 255 do
ColArr[i]:=(Integer(GtDac[i*3+1])*21+
Integer(GtDac[i*3+2])*52+
Integer(GtDac[i*3+3])*31) div 100;
RunView(New(PDiagramWin,Init('饱和度谱',ColArr,256)),Event);
ClearEvent(Event);
end;
else Exit;
end;
else Exit;
end;
ClearEvent(Event);
end;
Procedure TDacDlg.SetData;
begin
Inherited SetData;
System.Move(GtDac,DacPtr^,768);
end;
end.