| 
| 
 | Вопрос # 2 919/ вопрос открыт / | 
 |  Здравствуйте! Использую для ручной отрисовки пунктов Popupmenu приведенный в приложении код, возникло 3 вопроса:1) как автоматов и по стандарту отрисовать иконки? Т.е. как видно, иконки берутся из определенного ImageList1, причем для каждого пункта назначаются по порядку. Разделитель "-" идет как пункт и ему тоже присваивается картинка - она теряется.
 Как брать и отрисовывать иконки из присвоеного в свойстах каждого меню ImageList?
 Как не учитывать разделитель "-" при присвоении иконки?
 2) Имею 7 попап меню. Каждому пункту каждого меню присваиваю события отрисовки. При этом пункты подменю (subitems) не отрисовываются (Items.Count не содержит в себе все колличество пунктов меню - главного и подменю. Как это сделать?
 Заранее спасибо! Надеюсь на помощь.
 Приложение:Переключить в обычный режим procedure TForm1.AdvancedDrawItems(Sender: TObject; ACanvas: TCanvas;  ARect: TRect; State: TOwnerDrawState);begin  ACanvas.FillRect(ARect);  CopyRect(HRect, ARect);  if odSelected in State then  begin    ACanvas.Brush.Style := bsSolid;    ACanvas.Brush.Color := RGB(198, 211, 239);    ACanvas.Pen.Style := psSolid;    ACanvas.Pen.Color := RGB(49, 105, 198);    ACanvas.Rectangle(ARect);    ACanvas.Font.Color := clBlack;  end else   begin    ACanvas.Pen.Style := psClear;    if (Sender as TMenuItem).Caption = '-' then    begin      ACanvas.Pen.Color := clGrayText;      ACanvas.Pen.Style := psSolid;      ACanvas.MoveTo(ARect.Left, ARect.Top + 1);      ACanvas.LineTo(ARect.Right, ARect.Top + 1);      Exit;    end;  end;    ImageList1.Draw(ACanvas, 3, ARect.Top + 3, (Sender as TMenuItem).MenuIndex, true);  ACanvas.TextOut(27, ARect.Top + 3, (Sender as TMenuItem).Caption);end; procedure TForm1.MeasureItems(Sender: TObject; ACanvas: TCanvas;  var Width, Height: Integer);begin  if (Sender as TMenuItem).Caption = '-' then    Height := 3  else    Height := 20;end; procedure TForm1.FormCreate(Sender: TObject);var  i, j: integer;begin   for j := 1 to 7 do        for i := 0 to Items.Count - 1 do      begin        Items.Items[i].OnMeasureItem := MeasureItems;        Items.Items[i].OnAdvancedDrawItem := AdvancedDrawItems;      end;    end;end;
|  |   Вопрос задал: 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
 Комментарий к оценке: благодарю! |  
 Мини-форум вопросаМини-форум пуст. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |