Delphi t预览自定义绘图项目宽度
我使用OnCustomDrawItem事件绘制一个TTreeView,如下所示: 这是我的密码:Delphi t预览自定义绘图项目宽度,delphi,Delphi,我使用OnCustomDrawItem事件绘制一个TTreeView,如下所示: 这是我的密码: procedure Tform1.trvArbreCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean); var vRect : TRect; vBmp : TBitmap; vBmpRect : T
procedure Tform1.trvArbreCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
var
vRect : TRect;
vBmp : TBitmap;
vBmpRect : TRect;
vTreeView : TTreeView;
vBarreInfo : TScrollInfo;
vDeltaX : Integer;
begin
DefaultDraw := False;
vTreeView := TTreeView(Sender);
vRect := Node.DisplayRect(False);
vBmp := TBitmap.Create();
FillChar(vBarreInfo, SizeOF(vBarreInfo), 0);
vBarreInfo.cbSize := SizeOf(vBarreInfo);
vBarreInfo.fMask := SIF_RANGE or SIF_POS;
if GetScrollInfo(trvArbre.Handle, SB_HORZ, vBarreInfo) then
begin
if vBarreInfo.nMax > vRect.Right - vRect.Left then
begin
vBmp.Width := vBarreInfo.nMax + 1;
vBmp.Height := vRect.Bottom - vRect.Top;
vDeltaX := vBarreInfo.nPos;
end
else
begin
vBmp.Width := vRect.Right - vRect.Left;
vBmp.Height := vRect.Bottom - vRect.Top;
vDeltaX := 0;
end;
end
else
begin
vBmp.Width := vRect.Right - vRect.Left;
vBmp.Height := vRect.Bottom - vRect.Top;
vDeltaX := 0;
end;
vBmpRect := Rect(0, 0, vBmp.Width, vBmp.Height);
if cdsSelected in State then
begin
vBmp.Canvas.Brush.Color := cMenuDownFond;
vBmp.Canvas.Pen .Color := cMenuDownBordure;
end
else if cdsHot in State then
begin
vBmp.Canvas.Brush.Color := cMenuSurvolFond;
vBmp.Canvas.Pen .Color := cMenuSurvolBordure;
end
else
begin
vBmp.Canvas.Brush.Color := clWhite;
vBmp.Canvas.Pen .Color := clwhite;
end;
vBmp.Canvas.Rectangle(vBmpRect);
vBmpRect.Left := vBmpRect.Left + 3;
vBmpRect.Left := vBmpRect.Left + (Node.Level * vTreeView.Indent);
if Node.StateIndex >= 0 then
begin
vTreeView.StateImages.Draw(vBmp.Canvas, vBmpRect.Left, vBmpRect.Top, Node.StateIndex);
end;
vBmpRect.Left := vBmpRect.Left + 18;
vTreeView.Images.Draw(vBmp.Canvas, vBmpRect.Left, vBmpRect.Top, Node.ImageIndex);
vBmpRect.Left := vBmpRect.Left + 18 + 3;
vBmp.Canvas.Font := vTreeView.Font;
DrawText
(
vBmp.Canvas.Handle,
PChar(Node.Text),
Length(Node.Text),
vBmpRect,
DT_SINGLELINE or DT_LEFT or DT_VCENTER or DT_NOPREFIX or DT_END_ELLIPSIS
);
BitBlt
(
Sender.Canvas.Handle,
vRect.Left,
vRect.Top,
vRect.Right - vRect.Left,
vRect.Bottom - vRect.Top,
vBmp.Canvas.Handle,
vDeltaX,
0,
SRCCOPY
);
FreeAndNil(vBmp);
end;
我的问题是节点“我的最后一个节点不太长”不太长,无法证明水平滚动条的存在
当我将DefaultDraw设置为true时,我获得:
节点的宽度似乎是用我不使用的字体计算的
我尝试更改画布的字体,使用Windows API,使用OnAdvancedCustomDrawItem,但没有结果
谢谢。我使用Delphi7。我将ComCtrls.pas复制到我的应用程序文件夹中。我更改了过程
TCustomTreeView.CNNotify(var消息:TWMNotify)代码>。第8979行从Result:=Result或CDRF\u SKIPDEFAULT
到Result:=Result或CDRF\u SKIPDEFAULT代码>和我注释了第8980行否则如果FCanvasChanged则
以模拟DefaultDraw=True
和FCanvasChanged
,即使我在事件et不更改字体时将DefaultDraw设置为False。经过大量测试,我看不到任何警告。我使用Delphi7。我在我的应用程序文件夹中复制了ComCtrls.pas
。我更改了过程TCustomTreeView.CNNotify(var消息:TWMNotify)代码>。第8979行从Result:=Result或CDRF\u SKIPDEFAULT
到Result:=Result或CDRF\u SKIPDEFAULT代码>我对第8980行进行了注释,如果FCanvasChanged,则为模拟DefaultDraw
和FCanvasChanged
。这似乎有效,但。。。哼我真的不确定。你觉得这个变化怎么样?