-1 then ImageIndex[Current] := 0;
if Sender = BackImage then Exit;
if inCtrl((Sender as TImage).Tag, X, Y) then begin
SetText(1,(Sender as TImage).Hint); //设置提示.
Current := (Sender as TImage).Tag;
if ssLeft in Shift then ImageIndex[Current] := 2 else ImageIndex[Current] := 1;
end else begin
Current := -1;
ImageIndex[(Sender as TImage).Tag] := 1;
end;
end;
procedure TSkin.CtrlOnMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then ImageIndex[(Sender as TImage).Tag] := 0;
if InCtrl((Sender as TImage).Tag, X, Y) then
SendMessage(Frm.Handle,MYSKIN_BUTTONUP,
Integer(PChar(Ctrls[(Sender as TImage).Tag].Require)),0);
Current := -1;
end;
//鼠标在背景上点击
procedure TSkin.BackOnMouseDown(Sender : TObject; Button : TMouseButton;
Shift : TShiftState; X, Y : Integer);
begin
if (Sender = BackImage)then
if (Button = mbLeft) then //左击.
SendMessage(Frm.Handle,MYSKIN_DOWNBACKRECT,1,0)
else
SendMessage(Frm.Handle,MYSKIN_DOWNBACKRECT,2,0);
end;
//鼠标在文字区域上右击
procedure TSkin.ETextOnMouseDown(Sender : TObject; Button : TMouseButton;
Shift : TShiftState; X, Y : Integer);
begin
if (Button = mbRight) then
SendMessage(Frm.Handle,MYSKIN_RDOWNTEXT,
Integer(Pchar(Texts[(Sender as TImage).Tag].Require)),0);
if (Button = mbLeft) then
SendMessage(Frm.Handle,MYSKIN_LDOWNTEXT,
Integer(Pchar(Texts[(Sender as TImage).Tag].Require)),0);
end;
//设置 Text1 滚动速度.
procedure TSkin.SetTextScrollTimer(const Value: Integer);
begin
If Value < 50 then FTextScrollTimer := 50
else
FTextScrollTimer := Value;
ScrollTimer.Interval:=FTextScrollTimer;
end;
//禁止/激活 Text1 文字滚动.
procedure TSkin.SetTimerEnabled(const Value: Boolean);
begin
FTimerEnabled := Value;
ScrollTimer.Enabled := FTimerEnabled;
end;
//Timer.OnTimer 事件.
procedure TSkin.TextTimer(Sender: TObject);
var m,s : string;
begin
if length(FText1Text)<10 then Exit;
//文本太短,则不要滚动.
s := FText1Text;
m := leftstr(s,1);
FText1Text := midstr(s,2,length(s)-1)+m;
SetText(0,FText1Text);
end;
//鼠标进入某 Rect.
function TSkin.inCtrl(vIndex, X, Y: Integer): Boolean;
begin
Result := PtInRect(Ctrls[vIndex].Ctrl.ClientRect, Point(X, Y));
end;
//转换:Min/Noraml
function TSkin.ReLoadSkin(vFile : String):Boolean;
var
StrMin : string;
a : integer;
t : Array[0..2] of String;
begin
Result := False; //暂存 Text 显示.
for a:=0 to TextCount-1 do t[a]:=Texts[a].EText.Hint;
ClearSkin; //因 Slider 的 Get 和 Set 返回值类型不同.
CtrlCount := 0; //在类中暂存有些麻烦.所以放到了调用函数里.
SliderCount := 0;
TextCount := 0; //重置一些控件.
Isdown := false;
if not MinState then //Normal -> Min.
begin
StrMin:= vFile+''''min\skin.ini''''; //得到皮肤路径.
if LoadSkin(StrMin) then //可以转换.
begin
MinState := not MinState;
Result := True;
end else LoadSkin(vFile+''''skin.ini'''');
end else begin //Min -> Normal.
LoadSkin(vFile+''''skin.ini'''');
MinState := not MinState;
Result := True;
end;
for a:=0 to TextCount-1 do Settext(a,t[a]);//重置.
end;
function TSkin.LoadSkin(vFile: String): Boolean;
var
F : TextFile;
vStr, Key, KeyStr, ValStr : String;
a, vIndex, sIndex,eIndex : Integer;
w1:TBitmap;
rgn: HRGN;
begin
Result := False;
if not FileExists(vFile) then Exit;
ClearSkin;
AssignFile(F, vFile);
Key := '''''''';
vIndex := -1; sIndex := -1; eIndex:=-1;
try
Reset(F);
while not EOF(F) do begin
if ReadFile(F, KeyStr, ValStr) then
begin
Key := LowerCase(Trim(KeyStr));
if Key=''''button'''' then vIndex := CreateCtrl;
if Key=''''slider'''' then sIndex := CreateSlider;
if Key=''''text'''' then eIndex := CreateText;
Continue;
end;
KeyStr := Trim(LowerCase(KeyStr));
if (Key = ''''frm'''') then
begin
if KeyStr = ''''width'''' then frm.Width := StrToIntDef(ValStr, 0);
if KeyStr = ''''height''''then frm.height := StrToIntDef(ValStr, 0);
if KeyStr = ''''frmanysapecolor'''' then FrmAnySapeColor:=RGBtoColor(ValStr);
end; {窗体使用异型样式.}
if (Key = ''''button'''') then begin
if vIndex = -1 then Continue;
if KeyStr = ''''left'''' then Ctrls[vIndex].Ctrl.Left := StrToIntDef(ValStr, 0);
if KeyStr = ''''top'''' then Ctrls[vIndex].Ctrl.Top := StrToIntDef(ValStr, 0);
if KeyStr = ''''width'''' then Ctrls[vIndex].Ctrl.Width := StrToIntDef(ValStr, 0);
if KeyStr = ''''height'''' then Ctrls[vIndex].Ctrl.Height := StrToIntDef(ValStr, 0);
if KeyStr = ''''hint'''' then Ctrls[vIndex].Ctrl.Hint := ValStr;
if KeyStr = ''''require'''' then Ctrls[vIndex].Require := ValStr;
end;
if (Key = ''''slider'''') then begin
if sIndex = -1 then Continue;
if KeyStr = ''''left'''' then sliders[sIndex].Slider.Left := StrToIntDef(ValStr, 0);
if KeyStr = ''''top'''' then sliders[sIndex].Slider.Top := StrToIntDef(ValStr, 0);
if KeyStr = ''''width'''' then sliders[sIndex].Slider.Width := StrToIntDef(ValStr, 0);
if KeyStr = ''''height'''' then sliders[sIndex].Slider.Height := StrToIntDef(ValStr, 0);
if KeyStr = ''''min'''' then sliders[sIndex].min := StrToIntDef(ValStr, 0);
if KeyStr = ''''max'''' then sliders[sIndex].max := StrToIntDef(ValStr, 0);
if KeyStr = ''''style'''' then sliders[sIndex].Style := ValStr;
if KeyStr = ''''hint'''' then sliders[sIndex].Slider.Hint := ValStr;
if KeyStr = ''''require'''' then sliders[sIndex].Require := ValStr;
end;
if (Key = ''''text'''') then begin
if eIndex = -1 then Continue;
if KeyStr = ''''left'''' then Texts[eIndex].EText.Left := StrToIntDef(ValStr, 0);
if KeyStr = ''''top'''' then Texts[eIndex].EText.Top := StrToIntDef(ValStr, 0);
if KeyStr = ''''width'''' then Texts[eIndex].EText.Width := StrToIntDef(ValStr, 0);
if KeyStr = ''''height'''' then Texts[eIndex].EText.Height := StrToIntDef(ValStr, 0);
if KeyStr = ''''fcolor'''' then Texts[eIndex].EText.Canvas.Font.Color := RGBtoColor(ValStr);
if KeyStr = ''''fheight'''' then Texts[eIndex].EText.Canvas.Font.Height := StrToIntDef(ValStr, 0);
if KeyStr = ''''fname'''' then Texts[eIndex].EText.Canvas.Font.Name := ValStr;
if KeyStr = ''''hint'''' then Texts[eIndex].EText.Hint := ValStr;
if KeyStr = ''''require'''' then Texts[eIndex].Require := ValStr;
end;
end;
CloseFile(F);
except
Exit;
end;
try
vStr := ExtractFilePath(vFile);
BKGImage[0].LoadFromFile(vStr + ''''normal.bmp'''');
BKGImage[1].LoadFromFile(vStr + ''''enter.bmp'''');
BKGImage[2].LoadFromFile(vStr + ''''click.bmp'''');
BackImage.Picture := BKGImage[0];
{实现异型窗体.}
w1:=TBitmap.Create;
w1.Assign(BackImage.Picture.Bitmap);
rgn := CreateRegion(w1,FrmAnySapeColor,frm.Handle);
if rgn<>0 then SetWindowRgn(frm.Handle, rgn, true);
w1.Free; {令窗体区域外颜色设置为:TransparentColorValue 即可.}
except {即便是矩形窗口也要执行,好将上一skin还原回矩形样式.}
Exit;
end;
//加载 Button 图片.
for a := 0 to CtrlCount - 1 do ImageIndex[a] := 0;
for a := 0 to SliderCount - 1 do //滚动条.
begin
Sliders[a].Slider.Canvas.CopyRect(Sliders[a].Slider.ClientRect,
BKGImage[1].Bitmap.Canvas,Rect(Sliders[a].Slider.Left, Sliders[a].Slider.Top,
Sliders[a].Slider.Left+Sliders[a].Slider.Width, Sliders[a].Slider.Top+Sliders[a].Slider.Height));
end;
//文字框初始化.
for a := 0 to textCount - 1 do SetText(a,Texts[a].EText.Hint);
Result := True;
end;
function TSkin.ReadFile(var F: TextFile; var KeyStr,
ValStr: String): Boolean;
var vStr : String;
a : Integer;
begin
Readln(F, vStr);
KeyStr := '''''''';
ValStr := '''''''';
Result := False;
vStr := Trim(vStr);
if vStr <> '''''''' then begin
if (Copy(vStr, 1, 2) = ''''//'''') then exit;//注释文本.
if (Copy(vStr, 1, 1) = ''''['''') and (Copy(vStr, Length(vStr), 1) = '''']'''') then begin
Result := True;
KeyStr := Copy(vStr, 2, Length(vStr) - 2);
Exit;
end;
a := Pos(''''='''', vStr);
if a > 0 then begin
KeyStr := UpperCase(Trim(Copy(vStr, 1, a - 1)));
ValStr := Trim(Copy(vStr, a + 1, Length(vStr)));
end;
end;
end;
//设定按钮应显示哪种状态图.
procedure TSkin.SetImageIndex(Index: Integer; const Value: Integer);
begin
Ctrls[Index].Ctrl.Canvas.CopyRect(Ctrls[Index].Ctrl.ClientRect,
BKGImage[Value].Bitmap.Canvas, Rect(Ctrls[Index].Ctrl.Left, Ctrls[Index].Ctrl.Top,
Ctrls[Index].Ctrl.Left + Ctrls[Index].Ctrl.Width, Ctrls[Index].Ctrl.Top + Ctrls[Index].Ctrl.Height));
end;
//设置 Slider 的位置.
function TSkin.SliderSeek(Index : Integer;Offset : Real) : Boolean;
var n : Integer;
begin //Offset 为百分比:1.00-0.00
Result :=False;
if (Index >