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

📄 sgroupbox.pas

📁 Alpha Controls 界面控件包
💻 PAS
📖 第 1 页 / 共 2 页
字号:
        AlphaBroadCast(Self, Message);
        Repaint;
      end
      else AlphaBroadCast(Self, Message);
      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_PREPARING : begin
        Message.LParam := integer(FCommonData.BGChanged or FCommonData.Updating {or (Name = '')});
        exit
      end;
      AC_URGENTPAINT : begin // v4.08
        CommonWndProc(Message, FCommonData);
        if FCommonData.UrgentPainting then PrepareCache;
        Exit
      end;
      AC_ENDPARENTUPDATE : if FCommonData.Updating {or FCommonData.HalfVisible} then begin
        FCommonData.Updating := False;
        if Visible or (csDesigning in ComponentState) then Repaint;
        Exit;
      end;
    end
    else case Message.Msg of
      WM_PRINT : begin
        SkinData.Updating := False;
        PaintToDC(TWMPaint(Message).DC);
      end;
      CM_TEXTCHANGED : begin
        SkinData.Invalidate;
        Exit;
      end;
      WM_ERASEBKGND : begin
        Message.Result := 1;
        Exit;
      end;
      CM_VISIBLECHANGED, WM_WINDOWPOSCHANGED{, WM_WINDOWPOSCHANGING} : begin //v4.42
        FCommonData.BGChanged := True;
      end;
      WM_KILLFOCUS, WM_SETFOCUS: begin inherited; exit end; // v4.12
      WM_MOVE : begin
        FCommonData.BGChanged := FCommonData.BGChanged or FCommonData.RepaintIfMoved; // v4.53
{        if FCommonData.BGChanged then begin
          m := MakeMessage(SM_ALPHACMD, MakeWParam(1, AC_SETBGCHANGED), 0, 0);
          BroadCast(m); // v4.84
        end;}
      end;
    end;
    CommonWndProc(Message, FCommonData);
    if Message.Result <> 1 then
    inherited;
    case Message.Msg of
      WM_SIZE : if (csDesigning in ComponentState) then Repaint // v4.31
    end
  end;
end;

procedure TsGroupBox.WriteText(R: TRect; CI : TCacheInfo);
var
//  Text: string;
  sSection : string;
  sIndex : integer;
begin
  if FCaptionSkin = '' then begin
    sSection := s_CHECKBOX;
    sIndex := FCommonData.SkinManager.GetSkinIndex(sSection);
    if not CI.Ready and (Parent <> nil)
      then FillDC(FCommonData.FCacheBmp.Canvas.Handle, R, ColorToRGB(TsHackedControl(Parent).Color))
      else begin
        PaintItem(sIndex, sSection, CI, True, integer(Focused), R, Point(Left + R.Left, Top + R.Top), FCommonData.FCacheBmp, FCommonData.SkinManager);
      end;
  end
  else begin                   
    sSection := FCaptionSkin;
    sIndex := FCommonData.SkinManager.GetSkinIndex(sSection);
    CI.Bmp := FCommonData.FCacheBmp;
    CI.X := 0;
    CI.Y := 0;
    PaintItem(sIndex, sSection, CI, True, integer(Focused), R, Point({Left + 1}0, {R.Top + {Top + 1}0), FCommonData.FCacheBmp, FCommonData.SkinManager);
  end;
//  Text := Caption;

{$IFDEF TNTUNICODE}
//  sGraphUtils.WriteUniCode(FCommonData.FCacheBmp.Canvas, Caption, True, R, DT_CENTER, FCommonData, ControlIsActive(FCommonData));
  WriteTextExW(FCommonData.FCacheBmp.Canvas, PWideChar(Caption), True, R, DT_CENTER or DT_SINGLELINE or DT_VCENTER, FCommonData, False);
{$ELSE}
  WriteTextEx(FCommonData.FCacheBMP.Canvas, PChar(Caption), True, R, DT_CENTER or DT_SINGLELINE or DT_VCENTER, SkinData, False);
{$ENDIF}
end;

{ TsGroupButton }

type
  TsGroupButton = class(TsRadioButton)
  private
    FInClick: Boolean;
    procedure CNCommand(var Message: TWMCommand); message CN_COMMAND;
  protected
    procedure KeyDown(var Key: Word; Shift: TShiftState); override;
    procedure KeyPress(var Key: Char); override;
  public
    constructor InternalCreate(RadioGroup: TsRadioGroup);
    destructor Destroy; override;
  end;

constructor TsGroupButton.InternalCreate(RadioGroup: TsRadioGroup);
begin
  inherited Create(RadioGroup);
  SkinData.SkinManager := RadioGroup.SkinData.SkinManager;
  SkinData.SkinSection := s_RADIOBUTTON;
  ShowFocus := True;
  RadioGroup.FButtons.Add(Self);
  Visible := False;
  Enabled := RadioGroup.Enabled;
  ParentShowHint := False;
  OnClick := RadioGroup.ButtonClick;
  Parent := RadioGroup;
  TabStop := False; // v4.31
  SkinData.CustomFont := RadioGroup.SkinData.CustomFont;
  AnimatEvents := RadioGroup.AnimatEvents;
//  ControlStyle := ControlStyle + [csopaque]
end;

destructor TsGroupButton.Destroy;
begin
  TsRadioGroup(Owner).FButtons.Remove(Self);
  inherited Destroy;
end;

procedure TsGroupButton.CNCommand(var Message: TWMCommand);
begin
  if not FInClick then begin
    FInClick := True;
    try
      if {not SkinData.Skinned and v4.65}((Message.NotifyCode = BN_CLICKED) or (Message.NotifyCode = BN_DOUBLECLICKED)) and
                TsRadioGroup(Parent).CanModify then inherited;
    except
      Application.HandleException(Self);
    end;
    FInClick := False;
  end;
end;

procedure TsGroupButton.KeyPress(var Key: Char);
begin
  inherited KeyPress(Key);
  TsRadioGroup(Parent).KeyPress(Key);
  if (Key = #8) or (Key = ' ') then begin
    if not TsRadioGroup(Parent).CanModify then Key := #0;
  end;
end;

procedure TsGroupButton.KeyDown(var Key: Word; Shift: TShiftState);
begin
  inherited KeyDown(Key, Shift);
  TsRadioGroup(Parent).KeyDown(Key, Shift);
end;

{ TsRadioGroup }

procedure TsRadioGroup.AfterConstruction;
begin
  inherited;
//  UpdateButtons;
end;

procedure TsRadioGroup.ArrangeButtons;
var
  ButtonsPerCol, ButtonWidth, ButtonHeight, TopMargin, I: Integer;
  DC: HDC;
  SaveFont: HFont;
  Metrics: TTextMetric;
  DeferHandle: THandle;
  ALeft: Integer;
begin
  if (FButtons.Count <> 0) and not FReading then begin
    DC := GetDC(0);
    SaveFont := SelectObject(DC, Font.Handle);
    GetTextMetrics(DC, Metrics);
    SelectObject(DC, SaveFont);
    ReleaseDC(0, DC);
    ButtonsPerCol := (FButtons.Count + FColumns - 1) div FColumns;
    ButtonWidth := (Width - 10) div FColumns;
    I := Height - HeightOf(CaptionRect) - 5;
    ButtonHeight := I div ButtonsPerCol;
    TopMargin := HeightOf(CaptionRect) + 2;
    DeferHandle := BeginDeferWindowPos(FButtons.Count);
    try
      for I := 0 to FButtons.Count - 1 do with TsGroupButton(FButtons[I]) do begin
        TsGroupButton(FButtons[I]).SkinData.SkinManager := Self.SkinData.SkinManager;
        BiDiMode := self.BiDiMode;
        ALeft := (I div ButtonsPerCol) * ButtonWidth + 8;
        if UseRightToLeftAlignment then ALeft := Self.ClientWidth - ALeft - ButtonWidth;
        DeferHandle := DeferWindowPos(DeferHandle, Handle, 0,
                                      ALeft,
                                      (I mod ButtonsPerCol) * ButtonHeight + TopMargin,
                                      ButtonWidth, ButtonHeight,
                                      SWP_NOZORDER or SWP_NOACTIVATE);
        Visible := True;
      end;
    finally
      EndDeferWindowPos(DeferHandle);
    end;
  end;
end;

procedure TsRadioGroup.ButtonClick(Sender: TObject);
begin
  if not FUpdating then begin
    FItemIndex := FButtons.IndexOf(Sender);
    Changed;
    Click;
  end;
end;

function TsRadioGroup.CanModify: Boolean;
begin
  Result := True;
end;

procedure TsRadioGroup.CMEnabledChanged(var Message: TMessage);
var
  I: Integer;
begin
  inherited;
  for I := 0 to FButtons.Count - 1 do begin
    TsGroupButton(FButtons[I]).Enabled := Enabled;
    TsGroupButton(FButtons[I]).SkinData.BGChanged := True;
  end;
end;

procedure TsRadioGroup.CMFontChanged(var Message: TMessage);
begin
  inherited;
  ArrangeButtons;
end;

constructor TsRadioGroup.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  ControlStyle := [csSetCaption, csDoubleClicks];
  FButtons := TList.Create;
{$IFDEF TNTUNICODE}
  FItems := TTntStringList.Create;
  TTntStringList(FItems).OnChange := ItemsChange;
{$ELSE}
  FItems := TStringList.Create;
  TStringList(FItems).OnChange := ItemsChange;
{$ENDIF}
  FItemIndex := -1;
  FColumns := 1;
  FAnimatEvents := [aeGlobalDef];
end;

destructor TsRadioGroup.Destroy;
begin
  SetButtonCount(0);
  TStringList(FItems).OnChange := nil;
  FItems.Free;
  FButtons.Free;
  inherited Destroy;
end;

procedure TsRadioGroup.FlipChildren(AllLevels: Boolean);
begin
//
end;

function TsRadioGroup.GetButtons(Index: Integer): TsRadioButton;
begin
  Result := TsRadioButton(FButtons[Index]);
end;

procedure TsRadioGroup.GetChildren(Proc: TGetChildProc; Root: TComponent);
begin
//
end;

procedure TsRadioGroup.ItemsChange(Sender: TObject);
var
  i : integer;
begin
  if not FReading then begin
    if FItemIndex >= FItems.Count then FItemIndex := FItems.Count - 1;
    UpdateButtons;
  end;
  for i := 0 to FButtons.Count - 1 do begin
    TsRadioButton(FButtons[i]).Loaded;
  end;
end;

procedure TsRadioGroup.Loaded;
begin
  inherited Loaded;
  ArrangeButtons;
end;

procedure TsRadioGroup.ReadState(Reader: TReader);
begin
  FReading := True;
  inherited ReadState(Reader);
  FReading := False;
  UpdateButtons;
end;

procedure TsRadioGroup.SetButtonCount(Value: Integer);
begin
  while FButtons.Count < Value do TsGroupButton.InternalCreate(Self);
  while FButtons.Count > Value do TsGroupButton(FButtons.Last).Free;
end;

procedure TsRadioGroup.SetColumns(Value: Integer);
begin
  if Value < 1 then Value := 1;
  if Value > 16 then Value := 16;
  if FColumns <> Value then begin
    FColumns := Value;
    ArrangeButtons;
    Invalidate;
  end;
end;

procedure TsRadioGroup.SetItemIndex(Value: Integer);
begin
  if FReading then FItemIndex := Value else begin
    if Value < -1 then Value := -1;
    if Value >= FButtons.Count then Value := FButtons.Count - 1;
    if FItemIndex <> Value then begin
      if FItemIndex >= 0 then TsGroupButton(FButtons[FItemIndex]).Checked := False;
      FItemIndex := Value;
      if FItemIndex >= 0 then TsGroupButton(FButtons[FItemIndex]).Checked := True;
    end;
  end;
end;

{$IFDEF TNTUNICODE}
procedure TsRadioGroup.SetItems(Value: TTntStrings);
begin
  FItems.Assign(Value);
end;
{$ELSE}
procedure TsRadioGroup.SetItems(Value: TStrings);
begin
  FItems.Assign(Value);
end;
{$ENDIF}

procedure TsRadioGroup.UpdateButtons;
var
  I: Integer;
begin
  SetButtonCount(FItems.Count);
  for I := 0 to FButtons.Count - 1 do TsGroupButton(FButtons[I]).Caption := FItems[I];
  if FItemIndex >= 0 then begin
    FUpdating := True;
    TsGroupButton(FButtons[FItemIndex]).Checked := True;
    FUpdating := False;
  end;
  ArrangeButtons;
  Invalidate;
end;

procedure TsRadioGroup.WMSize(var Message: TWMSize);
begin
  inherited;
  ArrangeButtons;
end;

procedure TsRadioGroup.WndProc(var Message: TMessage);
begin
  if Message.Msg = SM_ALPHACMD then case Message.WParamHi of
//    AC_SETNEWSKIN,
    AC_REFRESH : if (LongWord(Message.LParam) = LongWord(SkinData.SkinManager)) then ArrangeButtons;
  end;
  inherited;
end;

end.

⌨️ 快捷键说明

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