⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winsubclass.pas

📁 超级报表系统软件VclSkin.v2.60.4.29.完整源代码版.rar
💻 PAS
📖 第 1 页 / 共 5 页
字号:
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 + -