Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > popupmenu


Автор: Proxin 26.5.2010, 21:41
проблема такая. нужно поменять отрисовку пунктов - с этим разобрался. но их много (около десятка), а на каждый создавать ondrawitem и onmeasureitem - долго и, кажется, неразумно. есть ли способ задать новый способ отрисовки сразу для всех пунктов меню?  
upd.
нашёл изврат
Код

procedure TAWND.N1DrawItem(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; Selected: Boolean);
function GetItemIndex:integer;
begin
result:=(arect.bottom div 16) - 1;
end;
begin
//перед ещё идёт отрисовка своего выделения
setbkmode(acanvas.handle,0);
acanvas.textout(18,arect.top+2,popupmnu.items[getitemindex].caption);
end;
procedure TCLWND.N1MeasureItem(Sender: TObject; ACanvas: TCanvas;
  var Width, Height: Integer);
var i:integer;
begin
width:=acanvas.textwidth(popupmnu.items[0].caption);
for i:=0 to popupmnu.items.count-1 do
if acanvas.textwidth(popupmnu.items[i].caption)>width then
width:=acanvas.textwidth(popupmnu.items[i].caption);
inc(width,18);
end;

но интересует цивилизованный способ.

Автор: DarkProg 27.5.2010, 08:24
Можно задать всем пунктам некоторую общую функцию которая и будет отрисовывать: задавать надо на том этапе где это нужно

Ну что-то типа такого сли у вас всё через N1, N2 и т.д.
for i:=1 to 10 do
begin
 (findconponent('N'+inttostr(i)) as TpopupmenuItem).OnDrawItem:=N1DrawItem;
 (findconponent('N'+inttostr(i)) as TpopupmenuItem).OnMeasureItem:=N1MeasureItem;
end;

Имя функций которые присваиваю обычно задаю следующим образом: сначала создаю функцию для одного объекта, потом у этого объекта убираю связь, а имя что-то типа PopupMenuDrawItems и это имя ставлю как у самой присваиваемой функции, так и выше где она объявлена.

P.S. код писал "на коленке", прям в браузере так что возможны ошибки. Я надеюсь понятно написал, если нет спрашивайте.

Автор: Proxin 27.5.2010, 09:50
это прекрасно знаю. но как сделать цивилизованный способ отрисовки без div-ов и прочего?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)