ListView에 표시 할 데이터가없는 경우 TLabel에 그려야하는 "지금 데이터가 변경되지 않았습니다"메시지를 표시하는 것이 좋습니다. ListView 클라이언트 영역에 TLabel을 그리는 방법은 무엇입니까?ListView 클라이언트 영역에 레이블을 그리는 방법
답변
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
이벤트를 사용할 수 있습니다. ListView의 Canvas
에 이벤트가 제공 한 TRect
으로 지정된 영역 내에서 원하는 것을 그릴 수 있습니다. 필요한 경우 ListView_GetHeader()
을 사용하여 ListView의 열 머리글이 표시되는지 확인한 다음 GetWindowRect()
을 사용하여 머리글의 높이를 가져와 그리기 전에 TRect
위쪽에서 빼낼 수 있습니다. 예를 들어
: 레미는 당신에게 받아 들여질만한 훌륭한 답을 주신
procedure TMyForm.ListViewCustomDraw(Sender: TCustomListView; const ARect: TRect; var DefaultDraw: Boolean);
var
R, Temp: TRect;
Wnd: HWND;
begin
if Sender.Items.Count <= 0 then
begin
R := ARect;
Wnd := ListView_GetHeader(Sender.Handle);
if Wnd <> 0 then
begin
GetWindowRect(Wnd, @Temp);
R.Top := R.Top + (Temp.Bottom-Temp.Top);
end;
R.Top := R.Top + 10;
DrawText(Sender.Canvas.Handle, 'My message here', -1, @R, DT_CENTER or DT_SINGLELINE);
end;
end;
감사합니다. 나는 두 번째 방법을 시도했다, 그것은 좋다! GetWindowRect (Wnd, @Temp); GetWindowRect (Wnd, Temp);로 변경해야 DrawText의 매개 변수로. – dltigles
다른 문제가 있습니다. OnCustomDraw 이벤트를 사용하여 "이것은 빈 목록"이라는 텍스트를 그립니다. 나는 listView를 지우는 단추를 만든다. 모든 항목이 지워지면 "This is .."텍스트가 표시됩니다. 그런 다음 새 항목 행을 immedially 추가했지만 텍스트가 정리되지 않았습니다. 따라서 짧은 행과 "이것은 빈 목록입니다"라는 메시지가 동시에 표시됩니다. – dltigles
listview.Repaint를 호출하면 "This is empty list"텍스트가 제거됩니다. – dltigles
. 제발 그렇게 할 수 있어요. –