返回
{***************************************************************}
{***               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.