如何在ListView客户端区域中绘制标签

时间:2014-10-14 10:49:59

标签: delphi delphi-xe2

当ListView中没有要显示的数据时,最好将消息显示为"现在没有数据更改",应该在TLabel中绘制。 如何在ListView客户端区域中绘制TLabel?

1 个答案:

答案 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