|
Вопрос # 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
Комментарий к оценке: благодарю!
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|