📄 winsubclass.pas
字号:
var r:Trect;
begin
result:=true;
case message.msg of
WM_ERASEBKGND: begin
// GetClientRect(hwnd,r);
// FillRect( message.wparam,r,fsd.BGbrush);
message.result:=1;
result:=false;
end;
WM_Paint : begin
wmpaint(message);
result:=false;
end;
else result:=inherited BeforeProc(message);
end;
end;
procedure TSkinStatusBar.DrawControl( dc:HDC; rc:TRect);
var i,n,j,m,w1,h1:integer;
r,r1,r2:Trect;
sb:Tstatusbar;
dwstyle:dword;
bfont,cfont:Hfont;
Flags:TAlignment;
begin
sb:=Tstatusbar(control);
n:= sb.Panels.count;
r1:=rc;
offsetrect(r1,-r1.left,-r1.top);
bg.width:=r1.right;
bg.height:=r1.bottom;
bg.canvas.brush.color:=fsd.colors[csButtonFace];
bg.canvas.fillrect(r1);
bg.canvas.Font := TAcControl(control).Font;
bg.canvas.font.style:=[];
// if fsd.statusbar<>nil then
// bg.canvas.Font.Color:= fsd.statusbar.normalcolor2;
bfont:=sendmessage(hwnd,wm_getfont,0,0);
cfont := selectobject(bg.canvas.handle,bfont);
if fsd.statusbar<>nil then
SetTextColor(bg.canvas.handle,fsd.statusbar.normalcolor2);
if (sb.simplepanel) or (sb.Panels.count=0) then begin
j:=1;
if (sb.IsRightToLeft) then
Flags:=taLeftJustify
else
Flags:=taLeftJustify;
if (fsd.statusbar<>nil) and (not fsd.statusbar.map.empty) then
drawitem(bg.canvas.handle,rc,j,sb.simpletext,Flags)
else
Defaultpaint(bg.canvas.handle,rc,j,sb.simpletext,Flags);
end else begin
m:=0;
for i:= 0 to n-1 do begin
j:=0;
flags:=sb.Panels[i].alignment;
if (sb.Panels[i].bidimode=bdRightToLeft) then begin
if Flags=taLeftJustify then
Flags :=taRightJustify
else if Flags=taRightJustify then
Flags:=taLeftJustify;
end;
if sb.Panels[i].Bevel=pblowered then j:=1;
if sb.Panels[i].Bevel=pbNone then j:=3;
if sb.Panels[i].Bevel=pbRaised then j :=2;
if sendmessage(hwnd,SB_GETRECT,i,integer(@r))<>0 then begin
// InflateRect( r, -2, 0 );
if i=n-1 then r.Right := rc.Right;
if (fsd.statusbar<>nil) and (not fsd.statusbar.map.empty) then
drawitem(bg.canvas.handle,r,j,sb.Panels[i].text,Flags)
else
Defaultpaint(bg.canvas.handle,r,j,sb.Panels[i].text,Flags);
end;
end;
end;
dwstyle:= GetWindowLong(hWnd,GWL_STYLE);
if (dwstyle and SBARS_SIZEGRIP)>0 then begin
r1.Right := rc.Right - 1;
r1.bottom := rc.bottom - 1;
if (fsd.ExtraImages<>nil) and (not fsd.ExtraImages.map.empty) then begin
w1:= fsd.ExtraImages.map.width div fsd.ExtraImages.frame;
h1:= fsd.ExtraImages.map.height;
r1.left:=r1.right - w1 ;
r1.top:= r1.bottom - h1;
DrawSkinMap1( bg.canvas.handle,r1,fsd.ExtraImages.map,5,fsd.ExtraImages.frame);
end;
end;
DrawBuf( dc,rc);
selectobject(bg.canvas.handle,cfont);
end;
{procedure TSkinStatusBar.DrawControl( dc:HDC; rc:TRect);
var i,n,j,m,l,w1,h1:integer;
r,r1,r2:Trect;
bfont,cfont:Hfont;
dwstyle:dword;
issimple:boolean;
Buffer: array[0..128] of Char;
s:string;
begin
// if fsd.statusbar=nil then exit;
n:=sendmessage(hwnd,SB_GETPARTS,0,integer(@l));
r1:=rc;
offsetrect(r1,-r1.left,-r1.top);
bg.width:=r1.right;
bg.height:=r1.bottom;
bg.canvas.brush.color:=fsd.colors[csButtonFace];
bg.canvas.fillrect(r1);
bg.canvas.Font.style := [];
bfont:=sendmessage(hwnd,wm_getfont,0,0);
cfont := selectobject(bg.canvas.handle,bfont);
if fsd.statusbar<>nil then
SetTextColor(bg.canvas.handle,fsd.statusbar.normalcolor2);
issimple:= (sendmessage(hwnd,SB_ISSIMPLE,0,0)>0);
if (issimple) or (n=0) then begin
j:=1;
sendmessage(hwnd,SB_GETTEXT,0,integer(@buffer));
s:=buffer;
if (fsd.statusbar<>nil) and (not fsd.statusbar.map.empty) then
drawitem(bg.canvas.handle,rc,j,s,taLeftJustify)
else
Defaultpaint(bg.canvas.handle,rc,j,s,taLeftJustify);
end else begin
m:=0;
for i:= 0 to n-1 do begin
m:= sendmessage(hwnd,SB_GETTEXT,i,integer(@buffer));
m := m div 16;
s:=buffer;
case m of
0 : j:=1;
SBT_NOBORDERS : j:=0;
SBT_POPOUT : j :=2;
else j:=0;
end;
if sendmessage(hwnd,SB_GETRECT,i,integer(@r))<>0 then begin
if i=n-1 then r.Right := rc.Right;
if (fsd.statusbar<>nil) and (not fsd.statusbar.map.empty) then
drawitem(bg.canvas.handle,r,j,s,taLeftJustify)
else
Defaultpaint(bg.canvas.handle,r,j,s,taLeftJustify);
end;
end;
end;
dwstyle:= GetWindowLong(hWnd,GWL_STYLE);
if (dwstyle and SBARS_SIZEGRIP)>0 then begin
r1.Right := rc.Right - 1;
r1.bottom := rc.bottom - 1;
if (fsd.ExtraImages<>nil) and (not fsd.ExtraImages.map.empty) then begin
w1:= fsd.ExtraImages.map.width div fsd.ExtraImages.frame;
h1:= fsd.ExtraImages.map.height;
r1.left:=r1.right - w1 ;
r1.top:= r1.bottom - h1;
DrawSkinMap1( bg.canvas.handle,r1,fsd.ExtraImages.map,5,fsd.ExtraImages.frame);
end;
end;
DrawBuf( dc,rc);
selectobject(bg.canvas.handle,cfont);
end;}
procedure TSkinStatusBar.drawitem(dc:HDC; rc:TRect;I:integer;text:string='';Align:TAlignment=taLeftJustify);
const
Alignments: array[TAlignment] of Longint = (DT_LEFT, DT_RIGHT, DT_CENTER);
var temp:TBitmap;
FontHeight: Integer;
Flags: Longint;
acolor:Tcolor;
begin
if (rc.right<rc.left) or (rc.bottom<rc.top) then exit;
temp:=GetHMap(rc,fsd.statusbar.map,fsd.statusbar.r,i,3,fsd.statusbar.tile);
BitBlt(dc,rc.left ,rc.top,rc.right-rc.left,rc.bottom-rc.top,
temp.Canvas.Handle ,0 ,0 ,Srccopy);
temp.free;
if text='' then text:=' ';
InflateRect( rc, -2, 0 );
DrawCaption(bg.canvas,rc,text,true,false,Alignments[Align]);
// SetBkMode(DC, TRANSPARENT);
// FontHeight:=2;
// FontHeight := TextHeight('W');
{ Font := TAcControl(control).Font;
font.style:=[];
FontHeight := TextHeight('W');
fcanvas.Font.Color:= fsd.statusbar.normalcolor2;
with rc do begin
Top := ((Bottom + Top) - FontHeight) div 2;
Bottom := Top + FontHeight;
// left:=left+fsd.statusbar.r.left;
left:=left+2;
end;
Flags := DT_EXPANDTABS or DT_VCENTER or Alignments[Align];
// Flags := DrawTextBiDiModeFlags(Flags);
DrawText(dc, PChar(text), -1, rc, Flags); }
end;
procedure TSkinStatusBar.Defaultpaint(dc:HDC; rc:TRect;I:integer;
text:string='';Align:TAlignment=taLeftJustify);
const
Alignments: array[TAlignment] of Longint = (DT_LEFT, DT_RIGHT, DT_CENTER);
var
TopColor, BottomColor: TColor;
FontHeight: Integer;
Flags: Longint;
procedure AdjustColors(Bevel: TStatusPanelBevel);
begin
TopColor := clBtnHighlight;
if Bevel = pbLowered then TopColor := clBtnShadow;
BottomColor := clBtnShadow;
if Bevel = pbLowered then BottomColor := clBtnHighlight;
end;
begin
if i=1 then begin
AdjustColors(pbLowered);
Frame3D(bg.Canvas, Rc, TopColor, BottomColor, 1);
end else if i=2 then begin
AdjustColors(pbRaised);
Frame3D(bg.Canvas, Rc, TopColor, BottomColor, 1);
end;
if text='' then text:=' ';
InflateRect( rc, -2, 0 );
DrawCaption(bg.canvas,rc,text,true,false,Alignments[Align]);
{ with bg.Canvas do begin
Brush.Color := fsd.colors[csButtonFace];
FillRect(rc);
SetBkMode(Handle, TRANSPARENT);
Font := TAcControl(control).Font;
font.style:=[];
FontHeight := TextHeight('W');
with rc do begin
Top := ((Bottom + Top) - FontHeight) div 2;
Bottom := Top + FontHeight;
end;
Flags := DT_EXPANDTABS or DT_VCENTER or Alignments[Align];
// Flags := DrawTextBiDiModeFlags(Flags);
DrawText(Handle, PChar(text), -1, rc, Flags);
end;}
end;
procedure TSkinBox.AfterProc(var Message: TMessage);
begin
end;
Procedure TSkinBox.Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);
begin
// inherited Init(acontrol,sd,acanvas,acolor);
newcolor:=acolor;
fsd:=sd;
fCanvas:=acanvas;
control:=Twincontrol(owner);
hwnd := control.handle;
skinform :=sf;
Twinskinform(sf).addcontrollist(self);
// OldWndProc:= Control.WindowProc;
// Control.WindowProc := NewWndProc;
if newcolor then begin
oldcolor:=Taccontrol(control).color;
Taccontrol(control).color:=fsd.colors[csButtonFace];
end;
end;
Procedure TSkinBox.Unsubclass;
var b:boolean;
begin
b:=true;
if skinstate=skin_destory then b:=false;
if b and newcolor then begin
Taccontrol(control).color:=oldcolor;
end;
skinstate:=skin_uninstall;
end;
function copypchar(pstr:pchar;len:integer):string;
begin
if len>0 then begin
setlength(result,len);
move(pstr,result[1],len);
end;
end;
procedure MyDrawCaption(acanvas: TCanvas; rc:TRect;
text:string; enabled,defaulted:boolean;Alignment: TAlignment=taCenter);
const
Alignments: array[TAlignment] of Word = (DT_LEFT,DT_RIGHT,DT_CENTER );
var
r1: TRect;
DrawStyle: Longint;
begin
DrawStyle := DT_EXPANDTABS or DT_SINGLELINE or Alignments[Alignment];
r1 := rc;
SetBkMode(aCanvas.Handle, TRANSPARENT);
with ACanvas do begin
Brush.Style := bsClear;
font.style:=[];
// Calculate vertical layout
DrawText(ACanvas.Handle,PChar(Text),Length(Text),r1,DrawStyle or DT_CALCRECT or DT_NOCLIP);
OffsetRect(r1, ((rc.right - rc.left) - (r1.right - r1.left)) div 2,
((rc.Bottom - rc.Top) - (r1.Bottom - r1.Top)) div 2);
if not enabled then
Font.Color := clBtnShadow;
DrawText(ACanvas.Handle, PChar(Text),Length(Text),r1,DrawStyle);
end;
end;
procedure DrawArrow(ACanvas: TCanvas; X, Y, Orientation: integer);
begin
case Orientation of
0:
begin
ACanvas.MoveTo(X, Y);
ACanvas.LineTo(X, Y-1);
ACanvas.MoveTo(X + 1, Y + 1);
ACanvas.LineTo(X + 4, Y + 4);
ACanvas.MoveTo(X, Y + 1);
ACanvas.LineTo(X + 3, Y + 4);
ACanvas.MoveTo(X, Y + 2);
ACanvas.LineTo(X + 2, Y + 4);
ACanvas.MoveTo(X - 1, Y + 1);
ACanvas.LineTo(X - 4, Y + 4);
ACanvas.MoveTo(X, Y + 2);
ACanvas.LineTo(X - 3, Y + 4);
ACanvas.MoveTo(X, Y + 1);
ACanvas.LineTo(X - 2, Y + 4);
end;
1:
begin
ACanvas.MoveTo(X, Y+3);
ACanvas.LineTo(X, Y+4);
ACanvas.MoveTo(X + 1, Y + 2);
ACanvas.LineTo(X + 4, Y - 1);
ACanvas.MoveTo(X, Y + 2);
ACanvas.LineTo(X + 3, Y - 1);
ACanvas.MoveTo(X, Y + 1);
ACanvas.LineTo(X + 2, Y + 0);
ACanvas.MoveTo(X - 1, Y + 2);
ACanvas.LineTo(X - 4, Y - 1);
ACanvas.MoveTo(X, Y + 2);
ACanvas.LineTo(X - 3, Y - 1);
ACanvas.MoveTo(X, Y + 1);
ACanvas.LineTo(X - 2, Y + 0);
end;
2://left
begin
ACanvas.MoveTo(X, Y);
ACanvas.lineTo(X+1, Y+2);
ACanvas.LineTo(X+1, Y-2);
ACanvas.LineTo(X-1,Y);
ACanvas.LineTo(X+1,Y+2);
end;
3://right
begin
ACanvas.MoveTo(X, Y);
ACanvas.lineTo(X-1, Y+2);
ACanvas.LineTo(X-1, Y-2);
ACanvas.LineTo(X+1,Y);
ACanvas.LineTo(X-1,Y+2);
end;
end;
end;
procedure MyDrawImgCaption(acanvas: TCanvas; rc:TRect;
ImgList:TCustomImageList;imgIndex:integer;
text:string; enabled,defaulted:boolean;Alignment: TAlignment=taCenter);
const
Alignments: array[TAlignment] of Word = (DT_LEFT,DT_RIGHT,DT_CENTER );
var
r1: TRect;
DrawStyle: Longint;
begin
DrawStyle := DT_EXPANDTABS or DT_SINGLELINE or Alignments[Alignment];
r1.Left := rc.Left + 6;
r1.Top := rc.Top + 1;
r1.Right := r1.Left + 16;
r1.Bottom := r1.Top + 16;
if (ImgIndex>-1) and (ImgIndex <ImgList.Count) then
ImgList.Draw(ACanvas, r1.Left, r1.Top, ImgIndex,Enabled);
rc.left:=r1.right;
r1:=rc;
SetBkMode(aCanvas.Handle, TRANSPARENT);
with ACanvas do begin
Brush.Style := bsClear;
// if Default then
// Font.Style := Font.Style + [fsBold];
font.style:=[];
DrawText(Handle,PChar(Text),Length(Text),r1,DrawStyle or DT_CALCRECT or DT_NOCLIP);
OffsetRect(r1, ((rc.right - rc.left) - (r1.right - r1.left)) div 2,
((rc.Bottom - rc.Top) - (r1.Bottom - r1.Top)) div 2);
if not enabled then
Font.Color := clBtnShadow;
DrawText(Handle, PChar(Text),Length(Text),r1,DrawStyle);
end;
end;
function TSkinTransObj.BeforeProc(var Message: TMessage):boolean;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -