在 Delphi 11 Alexandria 的 Windows 10 中的 32 位 VCL 应用程序中,我需要TListView
在调整列大小的同时重新绘制整个列。ListView 项目和子项目以 显示ListView.OwnerDraw
。
所以我对 ListView 进行了子类化,以便在列调整大小时得到通知:
TListView = class(Vcl.ComCtrls.TListView)
private
FHeaderHandle: HWND;
procedure WMNotify(var AMessage: TWMNotify); message WM_NOTIFY;
protected
procedure CreateWnd; override;
...
procedure TListView.CreateWnd;
begin
inherited;
FHeaderHandle := ListView_GetHeader(Handle);
end;
procedure TListView.WMNotify(var AMessage: TWMNotify);
begin
if (AMessage.NMHdr.hwndFrom = FHeaderHandle) and ((AMessage.NMHdr.code = HDN_ENDTRACK) or (AMessage.NMHdr.code = HDN_TRACK)) then
begin
TMessage(AMessage).Result := 0;
InvalidateRect(FHeaderHandle, nil, true);
CodeSite.Send('TListView.WMNotify: HDN_ENDTRACK');
end
else
inherited;
end;
不幸的是,它只在调整列大小的末尾做出反应,而不是在调整列大小时做出反应!此外,该列没有重新粉刷!