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

📄 stoolbar.pas

📁 Alpha Controls.v5.46b Source
💻 PAS
📖 第 1 页 / 共 2 页
字号:
      bWidth := WidthOf(iR);
      bHeight := HeightOf(iR);

      BtnBmp := CreateBmp24(bWidth, bHeight);
      BtnBmp.Canvas.Font.Assign(Font);

      if not Button.Marked and not Button.Indeterminate and ((State = []) or (State = [cdsDisabled])) 
        then Mode := 0
        else if (cdsSelected in State) or (cdsChecked in State) or Button.Marked or Button.Indeterminate
          then Mode := 2
          else Mode := 1;
      SkinIndex := FCommonData.SkinManager.GetSkinIndex(s_TOOLBUTTON);
      ci := MakeCacheInfo(FCommonData.FCacheBmp,
                          BorderWidth * 2 + integer(ebLeft in EdgeBorders) * (integer(EdgeInner <> esNone) + integer(EdgeOuter <> esNone)),
                          BorderWidth * 2 + integer(ebTop in EdgeBorders) * (integer(EdgeInner <> esNone) + integer(EdgeOuter <> esNone)));
      R := Rect(0, 0, bWidth, Button.Height);
      OffsetRect(R, ClientRect.Left, ClientRect.Top);

      PaintItemBg(SkinIndex, s_ToolButton, ci, Mode, R, Point(Button.Left, Button.Top), BtnBmp, FCommonData.SkinManager);
      R.Right := bWidth - AddedWidth;

      ci.X := ci.X + Button.Left;
      ci.Y := ci.Y + Button.Top;
      BorderIndex := FCommonData.SkinManager.GetMaskIndex(SkinIndex, s_ToolButton, s_BordersMask);
      if BorderIndex > -1 then DrawSkinRect(BtnBmp, R, True, ci, FCommonData.SkinManager.ma[BorderIndex], Mode, True);

      DrawBtnCaption;
      DrawBtnGlyph;
      if Button.Style = tbsDropDown then DrawArrow;
      if not Button.Enabled or Button.Indeterminate then BmpDisabledKind(BtnBmp, FDisabledKind, Parent, CI, Point(0, 0));

      BitBlt(Canvas.Handle, Button.Left, Button.Top, bWidth, bHeight, BtnBmp.Canvas.Handle, 0, 0, SRCCOPY);
      FreeAndNil(BtnBmp);
    end
  end
  else begin
    DefaultDraw := True;
    inherited;
  end;
end;

procedure TsToolBar.PrepareCache;
begin
  FCommonData.InitCacheBmp;
  PaintItem(FCommonData, GetParentCache(FCommonData), False, 0,
              Rect(0, 0, WIdth, Height), Point(Left, Top), FCommonData.FCacheBmp, False);
  FCommonData.BGChanged := False;
end;

procedure TsToolBar.RepaintButton(Index : integer);
var
  Flags : TTBCustomDrawFlags;
  Def : boolean;
  DC, SavedDC: HDC;
  RC, RW: TRect;
begin
  if (Index > -1) and Buttons[Index].Visible then begin
    Flags := [tbNoEtchedEffect, tbNoEdges];
    Def := False;
    DC := GetWindowDC(Handle);
    SavedDC := SaveDC(DC);
    try
      Windows.GetClientRect(Handle, RC);
      GetWindowRect(Handle, RW);
      MapWindowPoints(0, Handle, RW, 2);
      OffsetRect(RC, -RW.Left, -RW.Top);
      MoveWindowOrg(DC, -RW.Left, -RW.Top);

      Canvas.Handle := DC;
      OurAdvancedCustomDrawButton(Self, Buttons[Index], [], cdPrePaint, Flags, Def)
    finally
      Canvas.Handle := 0;
      RestoreDC(DC, SavedDC);
      ReleaseDC(Handle, DC);
    end;
  end;
end;

procedure TsToolBar.SetDisabledKind(const Value: TsDisabledKind);
begin
  if FDisabledKind <> Value then begin
    FDisabledKind := Value;
    Repaint;
  end;
end;

procedure TsToolBar.UpdateDividers;
var
  i : integer;
begin
  for i := 0 to ButtonCount - 1 do begin
    if Buttons[i].Style = tbsDivider then begin
      //v4
    end;
  end;
end;

procedure TsToolBar.UpdateEvents;
begin
  if SkinData.Skinned then begin
    inherited OnAdvancedCustomDraw := OurAdvancedCustomDraw;
    if not (csDesigning in ComponentState) then inherited OnAdvancedCustomDrawButton := OurAdvancedCustomDrawButton;
  end
  else begin
    inherited OnAdvancedCustomDraw := nil;
    if not (csDesigning in ComponentState) then inherited OnAdvancedCustomDrawButton := nil;
  end;
end;

procedure TsToolBar.WMNCPaint(var Message: TWMNCPaint);
var
  DC, SavedDC: HDC;
  RC, RW: TRect;
  w, h : integer;
begin
  if FCommonData.Skinned then begin
    FCommonData.Updating := FCommonData.Updating;
    if (csDestroying in ComponentState) or FCommonData.Updating then Exit;
    DC := GetWindowDC(Handle);
    SavedDC := SaveDC(DC);
    try
      Windows.GetClientRect(Handle, RC);
      GetWindowRect(Handle, RW);
      MapWindowPoints(0, Handle, RW, 2);
      OffsetRect(RC, -RW.Left, -RW.Top);
      ExcludeClipRect(DC, RC.Left, RC.Top, RC.Right, RC.Bottom);
      { Draw borders in non-client area }

      w := WidthOf(Rc);
      h := HeightOf(Rc);
      // 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);
//      if Message.DC = 0 then
      ReleaseDC(Handle, DC);
    end;
  end
  else inherited;
end;

procedure TsToolBar.WndProc(var Message: TMessage);
var
  i, OldIndex, w, h : integer;
  rc : TRect;
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_SETNEWSKIN : if (LongWord(Message.LParam) = LongWord(SkinData.SkinManager)) then begin
      if not (csDesigning in ComponentState) and (@Ac_SetWindowTheme <> nil) then Ac_SetWindowTheme(Handle, ' ', ' ');
      AlphaBroadCast(Self, Message);
      CommonWndProc(Message, FCommonData);
      exit
    end;
    AC_ENDPARENTUPDATE : {if FCommonData.Updating then v5.42}begin
      FCommonData.Updating := False;
      FCommonData.BGChanged := True;
      RedrawWindow(Handle, nil, 0, RDW_UPDATENOW or RDW_ERASE or RDW_INVALIDATE or RDW_INTERNALPAINT or RDW_ERASENOW);
      Exit
    end;
    AC_REFRESH : if (LongWord(Message.LParam) = LongWord(SkinData.SkinManager)) then begin
      DroppedButton := nil;
      CommonWndProc(Message, FCommonData);
      AlphaBroadcast(Self, Message);
      UpdateEvents;
      Repaint;
      SendMessage(Handle, WM_NCPAINT, 0, 0);
      exit
    end;
    AC_REMOVESKIN : if (LongWord(Message.LParam) = LongWord(SkinData.SkinManager)) then begin
      DroppedButton := nil;
      CommonWndProc(Message, FCommonData);
      if not (csDesigning in ComponentState) and (@Ac_SetWindowTheme <> nil) then Ac_SetWindowTheme(Handle, nil, nil);
      AlphaBroadcast(Self, Message);
      UpdateEvents;
      Repaint;
      SendMessage(Handle, WM_NCPAINT, 0, 0);
      exit
    end
  end;
  if not ControlIsReady(Self) or not FCommonData.Skinned then inherited else begin
    if Message.Msg = SM_ALPHACMD then case Message.WParamHi of
      AC_GETCACHE : begin
        GlobalCacheInfo.Ready := False;
        if not Assigned(FCommonData.FCacheBmp) then Exit;
        GlobalCacheInfo.X := BorderWidth * 2 + integer(ebLeft in EdgeBorders) * (integer(EdgeInner <> esNone) + integer(EdgeOuter <> esNone));
        GlobalCacheInfo.Y := BorderWidth * 2 + integer(ebTop in EdgeBorders) * (integer(EdgeInner <> esNone) + integer(EdgeOuter <> esNone));
        GlobalCacheInfo.Bmp := FCommonData.FCacheBmp;
        GlobalCacheInfo.Ready := True;
        Exit;
      end;
    end
    else case Message.Msg of
      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);
          SendMessage(Handle, WM_PAINT, Message.WParam, 0);
        finally
        end;
        Exit;
      end;
      WM_ERASEBKGND : Exit;
      WM_SIZE : SkinData.BGChanged := True;
      CM_TEXTCHANGED : begin Repaint; Exit end;
      CN_NOTIFY : with TWMNotify(Message) do case NMHdr^.code of
        TBN_DROPDOWN: with PNMToolBar(NMHdr)^ do if Perform(TB_GETBUTTON, iItem, Longint(@tbButton)) <> 0 then begin
          DroppedButton := TToolButton(tbButton.dwData);
          DroppedButton.Repaint
        end;
        TBN_DELETINGBUTTON : if HotButtonIndex >= ButtonCount then HotButtonIndex := -1;
      end;
    end;
    CommonWndProc(Message, FCommonData);
    try
      inherited;
    except
    end;
    case Message.Msg of
      CN_DROPDOWNCLOSED : begin
        if DroppedButton <> nil then begin
          HotButtonIndex := -1;
          i := DroppedButton.Index;
          DroppedButton := nil;
          RepaintButton(i);
        end;
      end;
      CM_MOUSELEAVE : if not Flat and not (csDesigning in ComponentState) then begin
        OldIndex := HotButtonIndex;
        HotButtonIndex := -1;
        if (OldIndex > -1) and not Buttons[OldIndex].Down then RepaintButton(OldIndex);
        HotButtonIndex := -1;
      end;
      WM_MOUSEMOVE : if not Flat and not (csDesigning in ComponentState) then with TWMMouse(Message) do begin
        i := IndexByMouse(Point(TWMMouse(Message).XPos, TWMMouse(Message).YPos));
        if (i <> HotButtonIndex) then begin
          if (i > -1) and not Buttons[i].Enabled then Exit; // v4.50
          OldIndex := HotButtonIndex;
          HotButtonIndex := i;
          if (OldIndex > -1) and not Buttons[OldIndex].Down then RepaintButton(OldIndex);
          if (HotButtonIndex > -1) and not Buttons[HotButtonIndex].Down then RepaintButton(HotButtonIndex);
        end;
      end;
      WM_SIZE, CM_VISIBLECHANGED, CM_ENABLEDCHANGED : begin
        FCommonData.BGChanged := True;
        InvalidateRect(Handle, nil, False);
        Exit;
      end;
    end;
  end;
end;

end.

⌨️ 快捷键说明

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