Форум: "Основная";
Текущий архив: 2003.05.29;
Скачать: [xml.tar.bz2];
ВнизЗапрет изменения ширины колонки ListView Найти похожие ветки
← →
w666w (2003-05-15 13:07) [0]Подскажите, каким образом возможно запретить ресайз колонки в ListView (режим vsReport). Выставление значений MaxWidth и MinWidth в принципе решают проблему, но наполовину: ресайз делать можно, но когда отпускаешь кнопку мыши, размер возвращается в первоначальный. А надо так, чтобы даже тянуть нельзя было.
Спасибо заранее...
← →
clickmaker (2003-05-15 13:28) [1]procedure TForm1.FormCreate(Sender: TObject);
var Header: HWND;
begin
Header := FindWindowEx(ListView1.Handle, 0, "SysHeader32", nil);
if (Header <> 0) then EnableWindow(Header, false);
end;
← →
w666w (2003-05-15 13:56) [2]Это работает, но на весь ListView, а надо на 1 колонку - чтобы все остальные меняли размер, а одна нет...
← →
clickmaker (2003-05-15 14:21) [3]Тогда подменять оконную процедуру у Header"a (SetWindowLong(GWL_WNDPROC)) и в ней обрабатывать, например WM_NCHITTEST, и в зависимости от позиции, возвращать либо HTCLIENT либо HTERROR
← →
w666w (2003-05-15 14:23) [4]пожалуйста, дай пример, я в API неособо...
← →
clickmaker (2003-05-15 15:11) [5]С тебя пиво! :)))
// Запрещает ресайз 1-ой колонки
procedure TForm1.FormCreate(Sender: TObject);
begin
FOldWndProc := ListView1.WindowProc;
ListView1.WindowProc := ListWndProc;
end;
procedure TForm1.ListWndProc(var Message: TMessage);
begin
case Message.Msg of
WM_NOTIFY:
begin
case TWMNotify(Message).NMHdr.code of
HDN_BEGINTRACK, HDN_TRACK, HDN_BEGINTRACKW, HDN_TRACKW:
begin
if (PHDNotify(Message.LParam).Item = 0) then begin
Message.Result := 1;
exit;
end;
end;
end;
end;
end;
FOldWndProc(Message);
end;
← →
MBo (2003-05-15 15:16) [6]>clickmaker
Эти сообщения ведь приходят родителю Listview, т.е. обычно оконной функции формы.
← →
clickmaker (2003-05-15 15:23) [7]Это сообщения от header"a, а у него родитель - ListView
← →
w666w (2003-05-15 15:37) [8]Большое спасибо, именно то, что я хотел. Куда слать пиво? :)
← →
w666w (2003-05-15 15:43) [9]Вот если бы еще научили стрелки сортировки рисовать (в ПРАВОМ углу каждого заголовка колонки), ящик вышлю :))
Если есть время и знания, поделитесь кодом плиз...
← →
Amoeba (2003-05-15 15:51) [10]По поводу сортировки и стрелок. Есть компонет TAGListView из библиотеки AGLib (бесплатно и с исходниками):
http://www.ginstall.com/ag-ware/Files/AGL170.zip
← →
Кулюкин Олег (2003-05-15 15:55) [11]2 w666w (15.05.03 15:43)
> Вот если бы еще научили стрелки сортировки рисовать (в ПРАВОМ углу каждого заголовка колонки), ящик вышлю :))
Видел я такой код.
Там обработка сообщения об отрисовке перехватывалась...
А нельзя в левом углу стрелку сделать?
При помощи картинок и ImageIndex выставляется на раз :)
← →
w666w (2003-05-15 16:10) [12]Можно и в левом, я просто столько времени убил на поиски подходящего кода, что мне уже не принципиально. Именно сейчас начал понимать, что каждый программер рано или поздно сталкивается с проблемами, которые без API просто невозможно решить. Надо учить...
Сторонние компоненты есть, но меня они не интересуют по присчине того, что у меня огромный проект уже написан и все адаптировано под TListView. Не хочется месяц все переделывать...
Повесьте работающий код плиз... Я уже отчаялся что либо найти...
← →
w666w (2003-05-15 16:27) [13]Удалено модератором
← →
Satirus (2003-05-15 16:37) [14]
procedure TForm1.ListView1DrawItem(Sender: TCustomListView;
Item: TListItem; Rect: TRect; State: TOwnerDrawState);
var Pict:TRect;
begin
if sender = nil then exit;
with TListView(Sender).Canvas do begin
Brush.Color:=clWhite;
FillRect(Rect);
if odSelected in State then begin
Pen.Color:=clBlack;
Rectangle(Rect);
end;
Brush.Color:=clRed;
with Pict do begin
Left:= Rect.Left;
Top:=Rect.Top;
Right:=Rect.Left+16;
Bottom:=Rect.Top+16;
FillRect(pict);
Rectangle(pict);
Brush.Color:=clWhite;
TextOut(Left+17,Top+1, Item.Caption);
Left:= Left+1+ListView_GetColumnWidth(TListView(Sender).Handle,0);
Right:=left+16;
Brush.Color:=ClRed;
FillRect(Pict);//прорисовка закрашенного прямоугольника
Rectangle(pict);//вместо него вставляешь любую, подходящую по размерам картинку
Brush.Color:=clWhite;
TextOut(Right+1,Top+1, Item.SubItems[0]);
Left:=Left+ListView_GetColumnWidth(TListView(Sender).Handle,1);
TextOut(Left,Top+1, inttostr(Item.Index)+". "+Item.SubItems[1]);
end;
end;
end;
← →
Satirus (2003-05-15 16:40) [15]Удалено модератором
← →
w666w (2003-05-15 16:52) [16]Чет я не доконца понял что ты делаешь. У меня это событие вообще не возникает ни при каких раскладах. Во вторых, может я неправильно понял код, но помоему ты прорисовываешь непосредственно на канвасе ListItem, а мне надо чтобы на заголовках колонок... (кнопки сортировки).
← →
Satirus (2003-05-15 17:04) [17]2w666w (15.05.03 16:52)
Сорри, прогнал.
← →
MBo (2003-05-15 17:05) [18]>w666w
простой путь тебе уже сказали:
Кулюкин Олег © (15.05.03 15:55)
← →
w666w (2003-05-15 17:12) [19]Господа, хочется красивого решения, тем более, что я уверен на 100%, это возможно. Неохота листать книгу ~1000 страниц по API из-за такой проблемы. Поучавствуйте, отблагодарю...
← →
clickmaker (2003-05-15 17:31) [20]NM_CUSTOMDRAW от header"a обрабатывай, там же, где и HDN_BEGINTRACK
← →
w666w (2003-05-15 17:36) [21]2 clickmaker
Тебе мне особенно приятно было бы асю подогнать. Поделись кодом плз.
← →
clickmaker (2003-05-15 18:48) [22]Готового кода у меня нет. Так что видимо останусь без аси :)
Кстати, в comctl32.dll начиная с 4.7 можно добавлять в header элементы со стилем HDI_BITMAP + выравнивать HDF_BITMAP_ON_RIGHT.
По-моему, то что тебе нужно. Мож попробовать через Header_SetItem
← →
w666w (2003-05-17 13:31) [23]Господа, вопрос все еще открыт. Гуру, отзовитесь...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.05.29;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c