当ListView中没有要显示的数据时,最好将消息显示为"现在没有数据更改",应该在TLabel中绘制。 如何在ListView客户端区域中绘制TLabel?
答案 0 :(得分:3)
您不需要TLabel
。
在Vista及更高版本中,您可以继承ListView以处理LVN_GETEMPTYMARKUP
通知。
uses
..., CommCtrl;
private
PrevWndProc: TWndMethod;
procedure TMyForm.FormCreate(Sender: TObject);
begin
PrevWndProc := ListView.WndProc;
ListView.WndProc := ListViewWndProc;
end;
procedure TMyForm.ListViewWndProc(var Message: TMessage);
begin
if Message.Msg = CN_NOTIFY then
begin
if TWMNotifyLV(Message).NMHdr.code = LVN_GETEMPTYMARKUP then
begin
with PNMLVEmptyMarkup(TWMNotifyLV(Message).NMHdr)^ do
begin
dwFlags := EMF_CENTERED;
StrLCopy(szMarkup, 'My message here', L_MAX_URL_LENGTH);
end;
Message.Result := 1;
Exit;
end;
end;
PrevWndProc(Message);
end;
缺点是您几乎无法控制文本出现的位置(只是左对齐或居中)或格式如何,并且您无法动态更改文本(您必须添加至少一个项目和然后将其删除以触发新通知。)
在早期版本中,或者如果您需要对文本位置/格式/行为进行更多控制,则可以使用ListView的OnCustomDraw
事件。您可以在事件提供的Canvas
指定区域内的ListView TRect
上绘制您想要的任何内容。如果需要,您可以使用ListView_GetHeader()
来确定ListView的列标题是否可见,如果是,则使用GetWindowRect()
获取标题的高度,以便您可以从{{1}的顶部减去它在绘图之前。
例如:
TRect