как сделать список с кнопками на каждом элементе в Delphi

Как показано на рисунке, мне нужно создать список с кнопками для каждого элемента, одной кнопкой внизу слева от элемента и некоторыми кнопками внизу справа.

Я делаю демонстрационное приложение, используя элемент управления ListBox и некоторые кнопки на панели выше на ListBox, но при прокрутке ListBox трудно заставить кнопки следовать за ListItem.

кто может помочь, спасибо~~~

Изображение


person fengyq    schedule 09.01.2015    source источник
comment
Какую версию Делфи вы используете? Используете ли вы VCL или FireMonkey для своего пользовательского интерфейса? Для чего-то подобного я обычно использую рисование владельца (например, использование функции DrawFrameControl() или DrawTheme...(), когда я хочу создать элементы управления, которые используют стандартный внешний вид пользовательского интерфейса), чтобы решить проблему прокрутки, а затем использую логику проверки попадания для обнаружения кликов на нарисованных частях. для запуска действий по мере необходимости. И TListBox, и TListView поддерживают рисование владельцем.   -  person Remy Lebeau    schedule 09.01.2015
comment
@Remy Тем не менее, это все еще сильно зависит от того, используется ли VCL или FMX. Каждый требует совершенно другого ответа для этой задачи.   -  person Jerry Dodge    schedule 09.01.2015
comment
Мне также любопытно, почему этот вопрос помечен web и почему образец изображения выглядит так, как будто он взят с веб-страницы...   -  person Jerry Dodge    schedule 09.01.2015
comment
спасибо за ответы. Я использую VCL (версия Delphi 2010), это приложение будет работать на PC Computor и ОС Windows. Существует тег «сеть», потому что я думаю, что это похоже на список в веб-стиле, и я сделал эту демонстрацию, используя ListBox и несколько красочных кнопок на нем.   -  person fengyq    schedule 10.01.2015
comment
привет @RemyLebeau, В этой демонстрации пользовательского интерфейса я использовал стиль рисования владельца, чтобы сделать содержимое списка переносом слов, но как использовать функцию «DrawFrameControl()»? не могли бы вы рассказать об этом больше, пожалуйста, спасибо   -  person fengyq    schedule 10.01.2015
comment
@fengyq: я исправил теги. Что касается DrawFrameControl(), прочитайте документацию. Например: DrawFrameControl(ListBox.Canvas.Handle, R, DFC_BUTTON, DFCS_BUTTONPUSH or DFCS_FLAT);   -  person Remy Lebeau    schedule 10.01.2015
comment
Пожалуйста, не добавляйте теги, потому что это похоже на что-то. Теги здесь имеют определенное значение. Вы должны добавлять только те теги, которые действительно относятся к вашему вопросу, а не те, которые звучат или наводят меня на размышления или что-то вроде этого. Прочитайте описание тега и добавляйте его только в том случае, если он действительно имеет значение, связанное с вашим вопросом. Правильное использование тегов означает, что вопрос доходит до тех пользователей, которые могут помочь, и помогает сделать его полезным для людей, которым нужна помощь в решении подобных проблем в будущем.   -  person Ken White    schedule 10.01.2015


Ответы (1)


У меня есть способ сделать это! Поэтому я сам опубликую ответ ~, но Реми Лебо вдохновил меня. в начале я использовал DrawFrameControl(), чтобы сделать кнопку в списке, это работает, но стиль был похож на классический стиль Windows, и трудно сделать задний цвет, как на картинке в примере. затем я использовал FillRect() и DrawEdge() сделать кнопку, я думаю, что это хорошо, вот код:

  hitPoint := lst1.ScreenToClient(Mouse.CursorPos);
  // there is a btnRect var of the Button Rect
  edgeRect.Left := btnRect.Left - 1;
  edgeRect.Top := btnRect.Top - 1;
  edgeRect.Right := btnRect.Right + 1;
  edgeRect.Bottom := btnRect.Bottom + 1;
  // make button
  lst1.Canvas.FillRect(btnRect);
  // make edge, FListMouseDown is bool var and setting value at MouseDown/MouseUp Event
  //
  if PtInRect(edgeRect, hitPoint) and FListMouseDown then begin
    DrawEdge(lst1.Canvas.Handle, edgeRect, EDGE_ETCHED, BF_RECT);  // button down style
  end else begin
    DrawEdge(lst1.Canvas.Handle, edgeRect, EDGE_RAISED, BF_RECT);
  end;

Следующая работа заключается в сохранении прямоугольника кнопок в памяти, записи кода события ButtonOnClick и вызове события ButtonOnClick в событии ListMouseUp() после определения того, находится ли положение нажатия мыши в прямоугольнике кнопки. Код не важен, как приведенные выше кнопки рисования, поэтому он опущен

person fengyq    schedule 12.01.2015