Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 919

/ вопрос открыт /

Здравствуйте! Использую для ручной отрисовки пунктов Popupmenu приведенный в приложении код, возникло 3 вопроса:
1) как автоматов и по стандарту отрисовать иконки? Т.е. как видно, иконки берутся из определенного ImageList1, причем для каждого пункта назначаются по порядку. Разделитель "-" идет как пункт и ему тоже присваивается картинка - она теряется.
Как брать и отрисовывать иконки из присвоеного в свойстах каждого меню ImageList?
Как не учитывать разделитель "-" при присвоении иконки?
2) Имею 7 попап меню. Каждому пункту каждого меню присваиваю события отрисовки. При этом пункты подменю (subitems) не отрисовываются (Items.Count не содержит в себе все колличество пунктов меню - главного и подменю. Как это сделать?
Заранее спасибо! Надеюсь на помощь.

Приложение:
  1. procedure TForm1.AdvancedDrawItems(Sender: TObject; ACanvas: TCanvas;
  2. ARect: TRect; State: TOwnerDrawState);
  3. begin
  4. ACanvas.FillRect(ARect);
  5. CopyRect(HRect, ARect);
  6. if odSelected in State then
  7. begin
  8. ACanvas.Brush.Style := bsSolid;
  9. ACanvas.Brush.Color := RGB(198, 211, 239);
  10. ACanvas.Pen.Style := psSolid;
  11. ACanvas.Pen.Color := RGB(49, 105, 198);
  12. ACanvas.Rectangle(ARect);
  13. ACanvas.Font.Color := clBlack;
  14. end else
  15. begin
  16. ACanvas.Pen.Style := psClear;
  17. if (Sender as TMenuItem).Caption = '-' then
  18. begin
  19. ACanvas.Pen.Color := clGrayText;
  20. ACanvas.Pen.Style := psSolid;
  21. ACanvas.MoveTo(ARect.Left, ARect.Top + 1);
  22. ACanvas.LineTo(ARect.Right, ARect.Top + 1);
  23. Exit;
  24. end;
  25. end;
  26.  
  27. ImageList1.Draw(ACanvas, 3, ARect.Top + 3, (Sender as TMenuItem).MenuIndex, true);
  28. ACanvas.TextOut(27, ARect.Top + 3, (Sender as TMenuItem).Caption);
  29. end;
  30.  
  31. procedure TForm1.MeasureItems(Sender: TObject; ACanvas: TCanvas;
  32. var Width, Height: Integer);
  33. begin
  34. if (Sender as TMenuItem).Caption = '-' then
  35. Height := 3
  36. else
  37. Height := 20;
  38. end;
  39.  
  40. procedure TForm1.FormCreate(Sender: TObject);
  41. var
  42. i, j: integer;
  43. begin
  44.  
  45. for j := 1 to 7 do
  46.  
  47.  
  48. for i := 0 to Items.Count - 1 do
  49. begin
  50. Items.Items[i].OnMeasureItem := MeasureItems;
  51. Items.Items[i].OnAdvancedDrawItem := AdvancedDrawItems;
  52. end;
  53. end;
  54. end;


Phoenix Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Phoenix (статус: Посетитель)
Вопрос отправлен: 16 июня 2009, 19:28
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

1) Для всех меню завести единый ImageList, а для отрисовки иконок пунктов меню использовать их свойство ImageIndex? предварительно присвоив этому свойству нужное значения для каждого пункта. Свойство MenuIndex - это совсем не то, оно является порядковым номером данного пункта меню в списке пунктов, принадлежащем пункту на уровень выше (родительскому, SubMenuItem).

2) Items.Count содержит количество подпунктов для данного пункта. Если некоторые из этих подпунктов тоже содержат подпункты, то и их Items.Count будет > 0.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 16 июня 2009, 19:51
Оценка за ответ: 5

Комментарий к оценке: благодарю!

Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:45
Выполнено за 0.02 сек.