📄 jvgtreeview.pas
字号:
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 + -