在 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;
不幸的是,它只在調整列大小的末尾做出反應,而不是在調整列大小時做出反應!此外,該列沒有重新粉刷!
uj5u.com熱心網友回復:
HDN_TRACK不交付的問題是眾所周知的。一個解決方案是尋找HDN_ITEMCHANGING。
關于重繪問題,請注意您這樣做
InvalidateRect(FHeaderHandle, nil, true);
這請求重繪串列視圖示題。標題是一個單獨的視窗,一個標題控制元件,它占據串列視圖的頂行并且只包含列標題。
您不想使標題無效,而是使串列視圖中的實際列無效。
只是使整個串列視圖無效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/422343.html
標籤:
上一篇:在OwnerDrawnTListView.OnDrawItem事件處理程式中選擇ListItem時如何模擬ROWSELECT?
