aaa

unit UFriendGroup;

interface

uses
  Windows,ExtCtrls,SysUtils, Classes, Controls,Forms,Graphics,Messages,StdCtrls;
 
type
      TPanel=class(ExtCtrls.TPanel)
      private
          FOnMouseIn:TNotifyEvent;
          FOnMouseOut:TNotifyEvent;
          procedure   CMMouseEnter(var   Message:   TMessage);   message   CM_MOUSEENTER;
          procedure   CMMouseLeave(var   Message:   TMessage);   message   CM_MOUSELEAVE;
      published
        property OnMouseIn: TNotifyEvent read FOnMouseIn write FOnMouseIn;
        property OnMouseOut: TNotifyEvent read FOnMouseOut write FOnMouseOut;
      end;

type

    TRGroupP=^TRGroup;
    TRGroup=record
      CPanel:Tpanel;
      CImage:TImage;
      CLabel:TLabel;
    end;

type
  TFriendGroup = class(TWinControl)
  private
    { Private declarations }
    ItemCount:integer;
    MainScrollBox: TScrollBox;
    LeftBordW,TopBordH,PicLeftBordW,PicTopBordH,ImgLeftBordW,ImgTopBordH:Integer;
    OldPanel:TPanel;
    OldWidth:integer;
    OptionRecordList:TStringList;
    FImagesValue:TImageList;
  protected
    { Protected declarations }

    procedure GruopPanMouseEnter(Sender: TObject);
    procedure GruopPanMouseLeave(Sender: TObject);
    procedure GruopPanClick(Sender: TObject);
    procedure GruopPanMouseDown(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
    procedure NewPanWidth;
    procedure SetImagesValue(const Value: TImageList);
  public
    { Public declarations }
    ObjectList:TList;
    function AddGroup(NameStr:string):Boolean;
    function GetCaption(Cint:integer):string;

  published
    { Published declarations }
    constructor Create(Aowner:TComponent);override;
    destructor Destroy;override;
    property Images:TImageList read FImagesValue write SetImagesValue;  
  end;

const
  SorButtonWidth=15; // 滚动条宽

procedure Register;

implementation

var
    CPanlObj:TRGroupP;

procedure Register;
begin
  RegisterComponents('Samples', [TFriendGroup]);
end;

{ TFriendGroup }

function TFriendGroup.AddGroup(NameStr: string): Boolean;
var
  GroupPan:TPanel;
  GroupLab:TLabel;
  GroupImage:TImage;
  TempRang:Single;
  bmp:TBitmap;
  RecL:trect;
  Cint,Cint2:integer;
  fhr :Thandle;
  CGroug:TRGroupP;
begin
 // MainScrollBox.Width:=self.Width;
   if ItemCount*22+22>MainScrollBox.Height then
       NewPanWidth;
    GroupPan:=TPanel.Create(MainScrollBox);
    with GroupPan do
    begin
      Parent:=self.MainScrollBox;
      Tag:=ItemCount;
      if ItemCount*22<=MainScrollBox.Height then
       width:=self.MainScrollBox.Width-2*PicLeftBordW
       else
       width:=self.MainScrollBox.Width-2*PicLeftBordW-SorButtonWidth;
      Left:=PicLeftBordW;
      Height:=22;//+2*PicTopBordH;
      if ItemCount=0 then
        top:=PicTopBordH
      else
        top:=ItemCount*22;//(Height+PicTopBordH)+PicTopBordH;
      BevelOuter:=bvNone;
      Color:=self.MainScrollBox.Color;//;
    //  OnClick:=GruopPanClick;
      OnMouseDown:=GruopPanMouseDown;
     // OnMouseIn:=GruopPanMouseEnter;
     // FOnMouseOut:=GruopPanMouseLeave;
    end;
    fhr:=createroundrectrgn(0,0,GroupPan.width,GroupPan.height,4,4);
    setwindowrgn(GroupPan.handle,fhr,true);

    GroupImage:=Timage.Create(GroupPan);
    with GroupImage do
    begin
      Parent:=GroupPan;
      width:=11;
      Left:=GroupPan.Left+5;
      Height:=11;
      top:=5;
      OnMouseDown:=GroupPan.OnMouseDown;
      Center:=true;
      Transparent:=true;
      FImagesValue.GetBitmap(0,Picture.Bitmap);
     // OnMouseIn:=GruopPanMouseEnter;
     // FOnMouseOut:=GruopPanMouseLeave;
    end;

    GroupLab:=TLabel.Create(GroupPan);
    with GroupLab do
    begin
      autosize:=false;
      Parent:=GroupPan;
      width:=200;
      Left:=GroupPan.Left+5+20;
      Height:=13;
      top:=4;
      Caption:=NameStr+inttostr(GroupPan.Tag);
      Font.Style:=[fsBold];
      OnMouseDown:=GroupPan.OnMouseDown;
      Transparent:=true;
     // OnMouseIn:=GruopPanMouseEnter;
     // FOnMouseOut:=GruopPanMouseLeave;
    end;

    CGroug:=new(TRGroupP);
    CGroug^.CPanel:=GroupPan;
    CGroug^.CImage:=GroupImage;
    CGroug^.CLabel:=GroupLab;

    OptionRecordList.AddObject(GroupLab.Caption,@CGroug^);

    OldWidth:=MainScrollBox.Width;
    inc(ItemCount);
    Result:=True;
end;

constructor TFriendGroup.Create(Aowner: TComponent);
begin
  inherited;
  Width:=250;
  Height:=100;
  MainScrollBox:=TScrollBox.Create(Self);
  with MainScrollBox do
  begin
    Align:=alclient;
    Parent:=Self;
    Left:=0;
    Top:=0;
    Name:='MainScrollbox';
    HorzScrollBar.Visible:=False;
    Color:=clWhite;
    BorderStyle:=BsNone;
    //OnClick:=PanelClick;
    //OnMouseWheelDown:=SorBoxMouseWheelDown;
    //OnMouseWheelUp:=SorBoxMouseWheelUp;
  end;
  OptionRecordList:=TStringList.Create;
  ItemCount:=0;
 { LeftBordW:=6;
  TopBordH:=6;  }
  PicLeftBordW:=2;
  PicTopBordH:=0;
 { ImgLeftBordW:=3;
  ImgTopBordH:=3;

  PicHeight:=20;

  FColumCount:=1;

  OldSelPanel:=nil;

  FSelColor:=clRed;
  FNomarColor:=clMenuBar;
  FFocusColor:=clYellow; }
end;

destructor TFriendGroup.Destroy;
var
 i:integer;
begin
 // if Assigned(OldSelPanel) then OldSelPanel.Free;
 {  for i:=Low(RgroupArr) to HIGH(RgroupArr) do
    begin
       Dispose(RgroupArr[i]);
    end;  }
  MainScrollBox.Free;
  inherited;
end;

function TFriendGroup.GetCaption(Cint: integer): string;
begin
  Result:=OptionRecordList[Cint];
end;

procedure TFriendGroup.GruopPanClick(Sender: TObject);

begin

end;

procedure TFriendGroup.GruopPanMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  i:integer;
begin
   if Sender is TPanel then
    begin
      if Assigned(OldPanel) then
        OldPanel.Color:=self.MainScrollBox.Color;
        OldPanel:=TPanel(Sender);
        TPanel(Sender).Color:=$00FDE3D0;
        i:=TPanel(Sender).Tag;
    end;
   if Sender is TLabel then
    begin
      if Assigned(OldPanel) then
        OldPanel.Color:=self.MainScrollBox.Color;
        OldPanel:=TPanel(TLabel(Sender).Parent);
        TPanel(TLabel(Sender).Parent).Color:=$00FDE3D0;
        i:=TPanel(TLabel(Sender).Parent).Tag;
    end;
   if Sender is TImage then
    begin
      if Assigned(OldPanel) then
        OldPanel.Color:=self.MainScrollBox.Color;
        OldPanel:=TPanel(TImage(Sender).Parent);
        TPanel(TImage(Sender).Parent).Color:=$00FDE3D0;
        i:=TPanel(TImage(Sender).Parent).Tag;
    end;
    CPanlObj:=TRGroupP(OptionRecordList.Objects[i]);
    CPanlObj.CImage.Picture.Graphic:=nil;
    FImagesValue.GetBitmap(1,CPanlObj.CImage.Picture.Bitmap);
end;

procedure TFriendGroup.GruopPanMouseEnter(Sender: TObject);
begin
  if Sender is TPanel then
      TPanel(Sender).Color:=self.MainScrollBox.Color;
end;

procedure TFriendGroup.GruopPanMouseLeave(Sender: TObject);
begin
   if Sender is TPanel then
      TPanel(Sender).Color:=cllime;
end;

procedure TFriendGroup.NewPanWidth;
var
 i:integer;
 fhr :Thandle;
begin
  for i:=0 to MainScrollBox.ControlCount-1 do
   begin
      if  MainScrollBox.Controls[i] is TPanel then
       begin
         TPanel(MainScrollBox.Controls[i]).width:=MainScrollBox.Width-2*PicLeftBordW-SorButtonWidth;
         fhr:=createroundrectrgn(0,0,TPanel(MainScrollBox.Controls[i]).width,TPanel(MainScrollBox.Controls[i]).height,4,4);
         setwindowrgn(TPanel(MainScrollBox.Controls[i]).handle,fhr,true);
       end
   end;
end;

procedure TFriendGroup.SetImagesValue(const Value: TImageList);
begin
  FImagesValue:=Value;
end;

{ TPanel }

procedure TPanel.CMMouseEnter(var Message: TMessage);
begin
inherited;
if Assigned(FOnMouseIn) then FOnMouseOut(Self);
end;

procedure TPanel.CMMouseLeave(var Message: TMessage);
begin
inherited;
if Assigned(FOnMouseIn) then FOnMouseIn(Self);
end;

end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了python应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值