Здравствуйте, NikSmol, Вы писали:
NS>Достаточно часто у ListView (или имитаций под него?) вижу такое поведение:
NS>если ни одного элемента в ListView нет, то в клиентской области ListView пишется некоторая строка, выровненная по центру: "Список сообщений пуст", "Нет данных для отображения", и т.д.
NS>Причем это не элемент ListView — его невозможно выделить, да и текст пересекает границы колонок.
NS>Как правильнее отобразить такую строку в пустом ListView?
NS>Заранее спасибо, Смолянинов Никита.
Нужно породится от TListView и перекрыть WM_PAINT. Можно конечно подменить WndProc у уже созданного ListView, но я не приветствую такой подход.
Получится приблизительно так (на коленках написано

):
type
TMyListView = class (TListView)
private
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
protected
end;
implementation
uses
CommCtrl;
procedure TMyListView.WMPaint(var Message: TWMPaint);
var
aRect : TRect;
aStr : string;
aHeaderHandle : HWND;
aHeaderRect : TRect;
begin
inherited;
if Items.Count = 0 then begin
aRect := ClientRect;
Inc (aRect.Top, 10);
if (ViewStyle = vsReport) and ShowColumnHeaders then
begin
aHeaderHandle := ListView_GetHeader(Handle);
if aHeaderHandle <> 0 then begin
GetWindowRect (aHeaderHandle, aHeaderRect);
Inc (aRect.Top, aHeaderRect.Bottom - aHeaderRect.Top);
end;
end;
Canvas.Brush.Style := bsClear;
aStr := 'Ничего нету :)';
DrawText (Canvas.Handle, PChar (aStr), Length (aStr), aRect, DT_CENTER);
end;
end;
Удачи!
Здравствуйте, Danchik, Вы писали:
NS>>...
NS>>Как правильнее отобразить такую строку в пустом ListView?
NS>>...
D>Нужно породится от TListView и перекрыть WM_PAINT. Можно конечно подменить WndProc у уже созданного ListView, но я не приветствую такой подход.
D>Получится приблизительно так (на коленках написано
):
D>...
Спасибо!