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

📄 jvgtreeview.pas

📁 East make Tray Icon in delphi
💻 PAS
📖 第 1 页 / 共 2 页
字号:
    begin
      while Y < IHeight do
      begin
        BitBlt(Bmp.Canvas.Handle, X, Y, FWallpaper.Width, FWallpaper.Height,
          FWallpaper.Canvas.Handle, 0, 0, SRCCOPY);
        Inc(Y, FWallpaper.Height);
      end;
      Inc(X, FWallpaper.Width);
      Y := 0;
    end;

    inherited;
    DrawBevel;
    //  BitBlt( Bmp.Canvas.Handle, 0, 0, IWidth, IHeight, FWallpaper.Canvas.Handle, 0,0, SRCCOPY );
      //SetBkMode(FCanvas.Handle,TRANSPARENT);
      //InvalidateRect(Handle,@R,False);
    //  inherited;
    //  Bmp2.Width := Width; Bmp2.Height := Height;
    //  Self.PaintWindow(Bmp2.Canvas.Handle);
    //Exit;
    BitBlt(Bmp2.Canvas.Handle, 0, 0, IWidth, IHeight, FCanvas.Handle, 0, 0,
      SRCCOPY);

    OldBkColor := SetBkColor(Bmp2.Canvas.Handle, ColorToRGB(Color));
    BitBlt(MaskDC, 0, 0, IWidth, IHeight, Bmp2.Canvas.Handle, 0, 0, SRCCOPY);
    SetBkColor(Bmp2.Canvas.Handle, OldBkColor);

    BitBlt(Bmp.Canvas.Handle, 0, 0, IWidth, IHeight, MaskDC, 0, 0, SRCAND);

    {put Mask on FCanvas to change background color to white}
    if Color <> clWhite then
      BitBlt(Bmp2.Canvas.Handle, 0, 0, IWidth, IHeight, MaskDC, 0, 0,
        SRCPAINT);

    BitBlt(MaskDC, 0, 0, IWidth, IHeight, MaskDC, 0, 0, NOTSRCCOPY);
    BitBlt(Bmp.Canvas.Handle, 0, 0, IWidth, IHeight, MaskDC, 0, 0, SRCPAINT);

    BitBlt(Bmp2.Canvas.Handle, 0, 0, IWidth, IHeight, Bmp.Canvas.Handle, 0, 0,
      SRCAND);
    BitBlt(FCanvas.Handle, 0, 0, IWidth, IHeight, Bmp2.Canvas.Handle, 0, 0,
      SRCCOPY);
    DeleteObject(SelectObject(MaskDC, OldMask));
    DeleteDC(MaskDC);
    Bmp.Free;
    Bmp2.Free;
    FPaintingNow := False;
    if Assigned(FOnDraw) then
      FOnDraw(Self, Msg);
  finally
    if (ftvFlatScroll in Options) and not FIsEditing then
      UpdateFlatScrollBar();
  end;
end;

procedure TJvgCustomTreeView.CNNotify(var Msg: TWMNotify);
begin
  with Msg.NMHdr^ do
    case code of
      TVN_ENDLABELEDIT:
        begin
          if Assigned(OnEndEdit) then
            OnEndEdit(Self);
          FIsEditing := False;
        end;
      TVN_SELCHANGING:
        with PNMTreeView(Pointer(Msg.NMHdr))^ do
        begin
          if FBoldSelection then
          begin
            SetNodeState_(itemOld.hItem, TVIS_BOLD, 0);
            SetNodeState_(itemNew.hItem, TVIS_BOLD, TVIS_BOLD);
          end;
          inherited;
          Exit;
        end;
      TVN_BEGINLABELEDIT:
        FIsEditing := True;
      //      TVN_SELCHANGED:
      //        with PNMTreeView(Pointer(Msg.NMHdr))^ do
      //          Change(GetNodeFromItem(itemNew));
    end;
  inherited;
end;

procedure TJvgCustomTreeView.SetNodeBoldState(Node: TTreeNode; ABold: Boolean);
begin
  if ABold then
    SetNodeState_(Node.ItemID, TVIS_BOLD, TVIS_BOLD)
  else
    SetNodeState_(Node.ItemID, TVIS_BOLD, 0)
end;

procedure TJvgCustomTreeView.SetNodeState_(ItemID: HTreeItem;
  StateMask, State: UINT);
var
  tvi: TTVItem;
begin
  FillChar(tvi, SizeOf(tvi), 0);
  tvi.hItem := ItemID;
  tvi.mask := TVIF_STATE;
  tvi.stateMask := StateMask; //TVIS_DROPHILITED, TVIS_BOLD;
  tvi.state := State;
  TreeView_SetItem(Handle, tvi);
end;

procedure TJvgCustomTreeView.SetCheckBoxes(Value: Boolean);
begin
  if FCheckBoxes = Value then
    Exit;
  FCheckBoxes := Value;
  RecreateWnd;
end;

procedure TJvgCustomTreeView.SetHotTrack(Value: Boolean);
begin
  if FHotTrack = Value then
    Exit;
  FHotTrack := Value;
  RecreateWnd;
end;

procedure TJvgCustomTreeView.SetToolTips(Value: Boolean);
begin
  if FToolTips = Value then
    Exit;
  FToolTips := Value;
  RecreateWnd;
end;

procedure TJvgCustomTreeView.SetWallpaper(Value: TBitmap);
begin
  if not Assigned(FWallpaper) then
    FWallpaper := TBitmap.Create;
  FWallpaper.Assign(Value);
  Invalidate;
end;

function TJvgCustomTreeView.GetWallpaper: TBitmap;
begin
  if not Assigned(FWallpaper) then
    FWallpaper := TBitmap.Create;
  Result := FWallpaper;
end;

procedure TJvgCustomTreeView.SetBoldSelection(Value: Boolean);
begin
  FBoldSelection := Value;
  if Assigned(Selected) then
    SetNodeBoldState(Selected, FBoldSelection);
end;

//=== { TJvgCheckTreeView } ==================================================

constructor TJvgCheckTreeView.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FGlyphChecked := TBitmap.Create;
  FGlyphUnChecked := TBitmap.Create;
  FGlyphSemiChecked := TBitmap.Create;
  FCheckImageList := TImageList.Create(Self);
  StateImages := FCheckImageList;
  if csDesigning in ComponentState then
    ChecksScheme := 2; //...not FChecksScheme!
  FCheckStateInheritance := False;
end;

destructor TJvgCheckTreeView.Destroy;
begin
  FGlyphChecked.Free;
  FGlyphUnChecked.Free;
  FGlyphSemiChecked.Free;
  FCheckImageList.Free;
  FCheckImageList := nil;
  inherited Destroy;
end;

procedure TJvgCheckTreeView.Loaded;
var
  I: Integer;
begin
  inherited Loaded;
  //  ChangeBitmapColor(FGlyphChecked, GetTransparentColor( FGlyphChecked, ftcLeftBottomPixel), Color);
  //  ChangeBitmapColor(FGlyphUnChecked, GetTransparentColor( FGlyphUnChecked, ftcLeftBottomPixel), Color);
  //  ChangeBitmapColor(FGlyphSemiChecked, GetTransparentColor( FGlyphSemiChecked, ftcLeftBottomPixel), Color);

  if ChecksScheme = -1 then
    SetChecksBitmap;
  if ChecksScheme = 0 then
    SetChecksScheme(2);

  if Items.Count > 0 then
    for I := 0 to Items.Count - 1 do
      Items[I].StateIndex := 1;
end;

procedure TJvgCheckTreeView.Assign(Source: TPersistent);
begin
  if Source is TJvgCustomTreeView then
    inherited Assign(Source)
  else
  if Source is TJvgCheckTreeView then
  begin
    FOnChangeCheck := TJvgCheckTreeView(Source).OnChangeCheck;
    FGlyphChecked.Assign(TJvgCheckTreeView(Source).GlyphChecked);
    FGlyphUnChecked.Assign(TJvgCheckTreeView(Source).GlyphUnChecked);
    FChecksScheme := TJvgCheckTreeView(Source).ChecksScheme;
    FCheckStateInheritance := TJvgCheckTreeView(Source).CheckStateInheritance;
  end
  else
    inherited Assign(Source);
end;

procedure TJvgCheckTreeView.TVMInsertItem(var Msg: TMessage);
var
  I: Integer;
begin
  with TTVInsertStruct(Pointer(Msg.LParam)^).Item do
  begin
    mask := mask or TVIF_STATE or TVIF_HANDLE;
    stateMask := TVIS_STATEIMAGEMASK;
    state := IndexToStateImageMask(ncsUnChecked);
  end;
  inherited;
  if csDesigning in ComponentState then
    if Items.Count > 0 then
      for I := 0 to Items.Count - 1 do
        Items[I].StateIndex := 1;
end;

procedure TJvgCheckTreeView.WMLButtonDown(var Msg: TWMLButtonDown);
var
  Pt: TPoint;
  Node: TTreeNode;
begin
  GetCursorPos(Pt);
  Pt := ScreenToClient(Pt);
  inherited;
  if htOnStateIcon in GetHitTestInfoAt(Pt.X, Pt.Y) then
  begin
    if Selected.StateIndex = -1 then
      Exit;
    if (Selected.StateIndex = ncsChecked) and (FCheckKind <> fckRadioButtons) then
      SetStateIndex(Selected, ncsUnChecked)
    else
      SetStateIndex(Selected, ncsChecked);

    if Assigned(FOnChangeCheck) then
      FOnChangeCheck(Self, Selected);
    if FCheckStateInheritance then
    begin
      if Assigned(Selected.Parent) then
        SetStateIndex(Selected.Parent,
          TestChildCheckState(Selected.Parent));
      Node := Selected;
      repeat
        Node := Node.GetNext;
        if Node = nil then
          Break;
        if Selected.Level >= Node.Level then
          Break;
        SetStateIndex(Node, Selected.StateIndex);
        if Assigned(FOnChangeCheck) then
          FOnChangeCheck(Self, Node);
      until Node = nil;
    end;
  end;
end;

function TJvgCheckTreeView.TestChildCheckState(Node: TTreeNode): Integer;
var
  I, CheckedCount: Integer;
  ChildNode: TTreeNode;
begin
  CheckedCount := 0;
  ChildNode := Node;
  for I := 1 to Node.Count do
  begin
    ChildNode := ChildNode.GetNext;
    if ChildNode.StateIndex = ncsChecked then
      Inc(CheckedCount);
  end;

  if CheckedCount = 0 then
    Result := ncsUnChecked
  else
  if CheckedCount = Node.Count then
    Result := ncsChecked
  else
    Result := ncsPartChecked;

end;

procedure TJvgCheckTreeView.SetGlyphChecked(Value: TBitmap);
begin
  if not Assigned(Value) then
    Exit;
  FGlyphChecked.Assign(Value);
  FChecksScheme := -1;
  SetChecksBitmap;
  Invalidate;
end;

procedure TJvgCheckTreeView.SetGlyphUnChecked(Value: TBitmap);
begin
  if not Assigned(Value) then
    Exit;
  FGlyphUnChecked.Assign(Value);
  FChecksScheme := -1;
  SetChecksBitmap;
  Invalidate;
end;

procedure TJvgCheckTreeView.SetGlyphSemiChecked(Value: TBitmap);
begin
  if not Assigned(Value) then
    Exit;
  FGlyphSemiChecked.Assign(Value);
  FChecksScheme := -1;
  SetChecksBitmap;
  Invalidate;
end;

procedure TJvgCheckTreeView.SetChecksScheme(Value: Integer);
begin
  if FChecksScheme = Value then
    Exit;
  FChecksScheme := Value;
  if ChecksScheme > -1 then
  begin
    StateImages.Clear;
    if StateImages.ResourceLoad(rtBitmap, 'JvgCheckTreeViewCHECKS' + IntToStr(Value), clOlive) then
    begin
      StateImages.GetBitmap(1, FGlyphUnChecked);
      StateImages.GetBitmap(2, FGlyphChecked);
      StateImages.GetBitmap(3, FGlyphSemiChecked);
    end
    else
      SetChecksScheme(-1);
  end;
end;

function TJvgCheckTreeView.CheckedItem: TTreeNode;
var
  I: Integer;
begin
  Result := nil;
  for I := 0 to Items.Count - 1 do
    if Items[I].StateIndex = ncsChecked then
    begin
      Result := Items[I];
      Break;
    end;
end;

function TJvgCheckTreeView.Checked(Node: TTreeNode): Boolean;
begin
  if Assigned(Node) then
    Result := (Node.StateIndex - 1) <> 0
  else
    Result := False;
end;

procedure TJvgCheckTreeView.SetChecked(Node: TTreeNode; Value: Boolean);
begin
  if not Assigned(Node) then
    Exit;
  if Node.StateIndex = Ord(Value) + 1 then
    Exit;
  SetStateIndex(Node, Ord(Value) + 1);
  if Assigned(FOnChangeCheck) then
    FOnChangeCheck(Self, Node);
end;

procedure TJvgCheckTreeView.SetStateIndex(Node: TTreeNode; StateIndex: Integer);
var
  I: Integer;

  procedure SetState_(Node: TTreeNode; StateIndex: Integer);
  var
    TextR: TRect;
  begin
    TextR := Node.DisplayRect(True);
    Node.StateIndex := StateIndex;
    ValidateRect(Handle, @TextR);
  end;

begin
  if FCheckKind = fckRadioButtons then
  begin
    if StateIndex = ncsChecked then
      for I := 0 to Items.Count - 1 do
        if (Items[I] <> Node) and (Items[I].StateIndex <> -1) then
          SetState_(Items[I], ncsUnChecked)
    else
      SetState_(Node, StateIndex);
    if StateIndex <> ncsUnChecked then
      SetState_(Node, StateIndex);
  end
  else
    SetState_(Node, StateIndex);
  //  if StateIndex = ncsChecked then CheckedItem := Node;
end;
//______________________

procedure TJvgCheckTreeView.SetChecksBitmap;
begin
  if Assigned(FGlyphChecked) and (FGlyphChecked.Handle <> 0) and
    Assigned(FGlyphUnChecked) and (FGlyphUnChecked.Handle <> 0) and
    Assigned(StateImages) then
  begin
    StateImages.Clear;
    StateImages.Width := min(GlyphSemiChecked.Width, min(GlyphUnChecked.Width,
      GlyphChecked.Width));
    StateImages.Height := min(GlyphSemiChecked.Height,
      min(GlyphUnChecked.Height, GlyphChecked.Height));
    //    StateImages.AddMasked( FGlyphUnChecked, GetTransparentColor( FGlyphUnChecked, ftcLeftBottomPixel) );
    //    StateImages.AddMasked( FGlyphUnChecked, GetTransparentColor( FGlyphUnChecked, ftcLeftBottomPixel) );
    StateImages.AddMasked(FGlyphUnChecked,
      GetTransparentColor(FGlyphUnChecked, ftcLeftBottomPixel));
    StateImages.AddMasked(FGlyphUnChecked,
      GetTransparentColor(FGlyphUnChecked, ftcLeftBottomPixel));
    StateImages.AddMasked(FGlyphChecked, GetTransparentColor(FGlyphChecked,
      ftcLeftBottomPixel));
    StateImages.AddMasked(FGlyphSemiChecked,
      GetTransparentColor(FGlyphSemiChecked, ftcLeftBottomPixel));
  end;
end;

{$IFDEF USEJVCL}
{$IFDEF UNITVERSIONING}
initialization
  RegisterUnitVersion(HInstance, UnitVersioning);

finalization
  UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
{$ENDIF USEJVCL}

end.

⌨️ 快捷键说明

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