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

📄 accoolbar.pas

📁 Alpha Controls 界面控件包
💻 PAS
📖 第 1 页 / 共 2 页
字号:
      if Adjust then Inc(Result, 2);
      if Images <> nil then begin
        Adjust := True;
        if Vertical then Inc(Result, Images.Height) else Inc(Result, Images.Width)
      end
      else if not Adjust then Inc(Result, ControlMargin);
    end;
    if Adjust then Inc(Result, ControlMargin);
    inc(Result, GetGripSize(Band));
  end;
end;
{
function TsCoolBar.ImageRect(Band: TCoolBand): TRect;
begin
  Result.Left := Band.Control.Left;
  Result.Top := Band.Control.Top;
  if Vertical then begin
    dec(Result.Top, GetCaptionSize(Band) - GetGripSize(Band));
    inc(Result.Left, (Band.Width - Images.Width) div 2);
  end
  else begin
    dec(Result.Left, GetCaptionSize(Band) - GetGripSize(Band));
    inc(Result.Top, (Band.Height - Images.Height) div 2);
  end;
  Result.Right := Result.Left;
  Result.Bottom := Result.Top;
  if Assigned(Images) and (Band.ImageIndex > -1) then begin
    inc(Result.Right, Images.Width);
    inc(Result.Bottom, Images.Height);
  end;
end;
}
procedure TsCoolBar.Loaded;
begin
  inherited;
  FCommonData.Loaded;
  UpdateGripIndex;
end;

procedure TsCoolBar.PrepareCache;
var
  CI : TCacheInfo;
begin
  FCommonData.InitCacheBmp;
  CI := GetParentCache(FCommonData);
  PaintItem(FCommonData, CI, False, 0, Rect(0, 0, width, Height), Point(Left, Top), FCommonData.FCacheBMP, False);
  FCommonData.BGChanged := False;
end;

procedure TsCoolBar.WMEraseBkgnd(var Message: TWMEraseBkgnd);
begin
  if not FCommonData.Skinned then inherited else begin
    Message.Result := 1;
  end;
end;

procedure TsCoolBar.WMNCPaint(var Message: TWMNCPaint);
var
  DC, SavedDC: HDC;
  RC, RW: TRect;
  w, h : integer;
begin                                 
  if FCommonData.Skinned then begin
    if (csDestroying in ComponentState) or FCommonData.Updating then Exit;
    DC := GetWindowDC(Handle);
    SavedDC := SaveDC(DC);
    try
      RC := ACClientRect(Handle);
      ExcludeClipRect(DC, RC.Left, RC.Top, RC.Right, RC.Bottom);
      { Draw borders in non-client area }
      w := WidthOf(Rc);
      h := HeightOf(Rc);

      if FCommonData.BGChanged then PrepareCache;
      // Top
      BitBlt(DC, 0, 0, Width, Rc.Top, SkinData.FCacheBmp.Canvas.Handle, 0, 0, SRCCOPY);
      // Left
      BitBlt(DC, 0, Rc.Top, Rc.Left, h, SkinData.FCacheBmp.Canvas.Handle, 0, Rc.Top, SRCCOPY);
      // Bottom
      BitBlt(DC, 0, Rc.Bottom, Width, Height - h - Rc.Top, SkinData.FCacheBmp.Canvas.Handle, 0, Rc.Bottom, SRCCOPY);
      // Right
      BitBlt(DC, Rc.Right, Rc.Top, Width - Rc.Left - w, h, SkinData.FCacheBmp.Canvas.Handle, Rc.Right, Rc.Top, SRCCOPY);

      IntersectClipRect(DC, RW.Left, RW.Top, RW.Right, RW.Bottom);
    finally
      RestoreDC(DC, SavedDC);
      ReleaseDC(Handle, DC);
    end;
  end
  else inherited;
end;

procedure TsCoolBar.WMPaint(var Message: TWMPaint);
var
  PS : TPaintStruct;
  DC, SavedDC : hdc;
  cR : TRect;
begin
  if not FCommonData.Skinned then inherited else begin
    BeginPaint(Handle, PS);
    SavedDC := 0;
    if Message.DC = 0 then begin
      DC := GetDC(Handle);
      SavedDC := SaveDC(DC);
    end
    else DC := Message.DC;
    try
      cR := Rect(1, 1, 1, 1);
      GetClipBox(DC, cR);
      ACPaint(DC);
    finally
      if Message.DC = 0 then begin
        RestoreDC(DC, SavedDC);
        ReleaseDC(Handle, DC);
      end;
      EndPaint(Handle, PS);
    end;
  end;
end;

procedure TsCoolBar.WndProc(var Message: TMessage);
var
  rc : TRect;
  i, w, h : integer;
  SavedDC : hdc;
begin
{$IFDEF LOGGED}
  AddToLog(Message);
{$ENDIF}
  if Message.Msg = SM_ALPHACMD
    then case Message.WParamHi of
    AC_CTRLHANDLED : begin Message.LParam := 1; Exit end; // AlphaSkins supported
    AC_GETAPPLICATION : begin Message.Result := longint(Application); Exit end;
    AC_REMOVESKIN : if (LongWord(Message.LParam) = LongWord(SkinData.SkinManager)) then begin
      CommonWndProc(Message, FCommonData);
      UpdateGripIndex;
      if HandleAllocated then RedrawWindow(Handle, nil, 0, RDW_INVALIDATE or RDW_ERASE or RDW_FRAME);
      AlphaBroadCast(Self, Message);
      exit
    end;
    AC_SETNEWSKIN : if (LongWord(Message.LParam) = LongWord(SkinData.SkinManager)) then begin
      AlphaBroadCast(Self, Message);
      CommonWndProc(Message, FCommonData);
      UpdateGripIndex;
      exit
    end;
    AC_REFRESH : if (LongWord(Message.LParam) = LongWord(SkinData.SkinManager)) then begin
      CommonWndProc(Message, FCommonData);
      AlphaBroadCast(Self, Message);
      Repaint;
      SendMessage(Handle, WM_NCPAINT, 0, 0);
      exit
    end;
    AC_GETCACHE : begin
      GlobalCacheInfo.X := ACClientRect(Handle).Left;
      GlobalCacheInfo.Y := ACClientRect(Handle).Top;
      if SkinData.Skinned then GlobalCacheInfo.Bmp := FCommonData.FCacheBmp else GlobalCacheInfo.Bmp := nil;
      GlobalCacheInfo.Ready := GlobalCacheInfo.Bmp <> nil;
      Exit;
    end;
  end;
  if Message.Msg = SM_ALPHACMD then case Message.WParamHi of
    AC_ENDPARENTUPDATE : if FCommonData.Updating then {????} begin
      FCommonData.Updating := False;
      Repaint;
      SendMessage(Handle, WM_NCPAINT, 0, 0);
    end;
    AC_PREPARING       : begin
      Message.LParam := integer(FCommonData.BGChanged or FCommonData.Updating);
    end;
    AC_URGENTPAINT : begin // v4.08
      CommonWndProc(Message, FCommonData);
      if FCommonData.UrgentPainting then begin
        FCommonData.InitCacheBmp;
        PaintItem(FCommonData, GetParentCache(FCommonData), False, 0, Rect(0, 0, width, Height), Point(Left, Top), FCommonData.FCacheBMP, False);
        FCommonData.BGChanged := False;
      end;
    end
    else CommonMessage(Message, FCommonData);
  end
  else begin
    case Message.Msg of
      CM_VISIBLECHANGED : begin
        FCommonData.BGChanged := True;
        if not FCommonData.Updating then Repaint;
        inherited;
        Exit;
      end;
      WM_KILLFOCUS, WM_SETFOCUS: begin inherited; exit end; // v4.12
      WM_PRINT : begin
        FCommonData.Updating := False;
        try
          RC := ACClientRect(Handle);
          w := WidthOf(Rc);
          h := HeightOf(Rc);

          if FCommonData.BGChanged then PrepareCache;
          // Top
          BitBlt(TWMPaint(Message).DC, 0, 0, Width, Rc.Top, SkinData.FCacheBmp.Canvas.Handle, 0, 0, SRCCOPY);
          // Left
          BitBlt(TWMPaint(Message).DC, 0, Rc.Top, Rc.Left, h, SkinData.FCacheBmp.Canvas.Handle, 0, Rc.Top, SRCCOPY);
          // Bottom
          BitBlt(TWMPaint(Message).DC, 0, Rc.Bottom, Width, Height - h - Rc.Top, SkinData.FCacheBmp.Canvas.Handle, 0, Rc.Bottom, SRCCOPY);
          // Right
          BitBlt(TWMPaint(Message).DC, Rc.Right, Rc.Top, Width - Rc.Left - w, h, SkinData.FCacheBmp.Canvas.Handle, Rc.Right, Rc.Top, SRCCOPY);

          MoveWindowOrg(TWMPaint(Message).DC, Rc.Left, Rc.Top);
          IntersectClipRect(TWMPaint(Message).DC, 0, 0, w, h);
          ACPaint(TWMPaint(Message).DC);
          for i := 0 to Bands.Count - 1 do if Bands[i].Control <> nil then begin
            SavedDC := SaveDC(TWMPaint(Message).DC);
            MoveWindowOrg(TWMPaint(Message).DC, Bands[i].Control.Left, Bands[i].Control.Top);
            IntersectClipRect(TWMPaint(Message).DC, 0, 0, Bands[i].Control.Width, Bands[i].Control.Height);
            Bands[i].Control.Perform(WM_PAINT, Message.WParam, Message.LParam);
            RestoreDC(TWMPaint(Message).DC, SavedDC);
          end;
        finally
        end;
        Exit;
      end;
    end;
    CommonWndProc(Message, FCommonData);
    inherited;
    if FCommonData.Skinned then begin
      case Message.Msg of
        WM_SIZE : begin
          FCOmmonData.BGChanged := True;
          Perform(WM_NCPAINT, 0, 0);
        end;
      end;
    end
  end;
end;

function TsCoolBar.GetGripSize(Band: TCoolBand) : integer;
begin
  Result := 0;
  if (not FixedOrder or (Band.ID and IDMask > 0)) and not Band.FixedSize then begin
    Inc(Result, ControlMargin);
    if GetComCtlVersion < ComCtlVersionIE4 then Inc(Result, GripSizeIE3) else Inc(Result, GripSizeIE4);
  end;
end;

procedure TsCoolBar.UpdateGripIndex;
begin
  if FCommonData.Skinned then begin
    if Vertical then FGripsection := s_GripV else FGripsection := s_GripH;
    FGripIndex := SkinData.SkinManager.GetSkinIndex(FGripsection);
    if FGripIndex <> -1 then begin
      FGripMask := SkinData.SkinManager.GetMaskIndex(FGripsection, s_BordersMask);
      FGripTexture := SkinData.SkinManager.GetTextureIndex(FGripIndex, FGripsection, s_Pattern);
//        if (SkinData.SkinManager.gd[FGripIndex].ImagePercent = 0) and SkinData.SkinManager.IsValidImgIndex(FGripTexture) and (SkinData.SkinManager.ma[FGripTexture].DrawMode in [ord(ord(fmDisTiled))])
//          then SkinData.SkinManager.gd[FGripIndex].ImagePercent := -1;
    end
    else begin
      FGripsection := s_ProgressV;//s_Button;
      FGripIndex := SkinData.SkinManager.GetSkinIndex(FGripsection);
      FGripMask := SkinData.SkinManager.GetMaskIndex(FGripsection, s_BordersMask);
    end;
  end
  else begin
    FGripIndex := -1;
    FGripMask := -1;
    FGripTexture := -1;
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -