Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.29;
Скачать: CL | DM;

Вниз

Запрет изменения ширины колонки 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.017 c
1-94960
Shadowofman
2003-05-18 13:25
2003.05.29
Свойства функциональных клавиш...


14-95020
Ruslan
2003-05-12 05:50
2003.05.29
Саоздание АмперМетра


1-94797
Apachi
2003-05-19 09:12
2003.05.29
Запись и чтение ресурса


6-94981
Provodnick
2003-02-12 09:00
2003.05.29
Как узнать IP-адрес компьютера в ЛС.


3-94768
Ш-К
2003-05-11 06:31
2003.05.29
Синхронизация с сервером.