Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.009 c
4-95154
Num Lock
2003-04-01 09:53
2003.05.29
Зачем посылать WM_USER после TrackPopupMenu?


3-94728
DmitryNekl
2003-05-06 18:14
2003.05.29
ADO и SQL (вопрос по SQL)


3-94686
Oleg_Em
2003-05-07 11:19
2003.05.29
Доступ к paradox без BDE или ODBC


1-94926
Артем К.
2003-05-17 15:27
2003.05.29
Как добавить в dll курсор и картинку, а потом извлечь их от туда


3-94696
Niki
2003-05-07 18:52
2003.05.29
вопрос по трехслойке





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский