Skocz do zawartości

[Delphi] TMainMenu i OwnerDraw


BoZzDoG

Polecane posty

Witam serdecznie wszystkich.

 

Piszę ten post, ponieważ mam kilka problemów z komponentem TMainMenu i własną procedurą rysującą. Problemów jest kilka, opiszę kązdy po kolei.

 

1. Przy wyznaczaniu rozmiarów itemu w menu (w metodzie OnMeasureItem), muszę zmierzyć, jaki długi i szeroki będzie item. Chcę, aby na każdej pozycji w menu był pasek pod ikoną wraz z ikoną, tekst oraz skrót klawiaturowy w proporcjach:

 

a) pasek pod ikoną - 24x24px

b ) ikona - 16x16px (na pasku)

c) przerwa między paskiem a tekstem - 4px

d) tekst - w zależności od długości tekstu (pobierana przez metodę TextWidth)

e) jeżeli istnieje skrót klawiaturowy:

przerwa między tekstem a skrótem - 10px

f) skrót klawiaturowy - w zależności od długości skrótu (pobierana przez metodę TextWidth)

g) przerwa końcowa - 6px

e) jeżeli nie istnieje skrót klawiaturowy:

f) przerwa końcowa - 6px

 

To jest ogólnie rzecz biorąc zawartość itemu. Poniżej mój algorytm ustawiania szerokości i wysokości itemu:

procedure TMainForm.miFileMeasureItem(Sender: TObject; ACanvas: TCanvas; var Width, Height: Integer);
var
 iCapt, iSCut: Integer;
begin
 {VARIABLES}
 with ACanvas do
   begin
     iCapt := TextWidth(TMenuItem(Sender).Caption) - 1;
     iSCut := TextWidth(ShortCutToText(TMenuItem(Sender).ShortCut)) - 1;
   end;

 {WIDTH}
 if iSCut = 0 then
   Width := 24{ICON} + 4{SPACING} + iCapt{CAPTION} + 5{SPACING}
 else
   Width := 24{ICON} + 4{SPACING} + iCapt{CAPTION} + 10{SPACING} + iSCut{SHORTCUT} + 5{SPACING};

 {HEIGHT}
 if TMenuItem(Sender).Caption <> '-' then
   Height := 24
 else
   Height := 7;
end;
`ź'sĘ)ĘhŹŚśw6,2nśĘ+^fĘjśŚg'zdŁrjX(Ż+fŚ,+-zlih\"{FŁJ+ZŁ),*kĄ^7Ź    z;sęh)iźŻ7h'sĘŚj+Ź\"jŁŚejn|])Ćk)vzŹŚś\"zWk<Śęójrzf^Ź,rrpr-vŁv3Ęj7nł<ŹdŹ\"jŁĘŁjHŹŚbą^`źo*h+^\"0&cZr+^'dśŹ6jśźj7h(vł<ŹśHJ'ĘŚ3s:'{       ('zw\"y.+-hz^6ękĄ
Z+$jJ'jhw8Śźw8w)'3'^\"Ą^((%1(!(!yb-'$r(yh)g{Z+$jJ'mzzxn'Ź&zxr'Łł<źŹŁ|2óĘngĄIZ'Ll:śŁ]zZaX]ĘP[TXY

TX

Y[R][J[KY[[][XYJN `źŻ+.|)yćv0s*(vWz
w nWŚ[)(Ż<Źśhuk'Łzhnjó{:s<Źśjr$vłZŻ+(3hr'Kęh)źŚź+-z'3ĘłhjŚbxn'Ź)z^)y,fłhŹŚ[(%uh#jFśhv)(źn&JzkZ(źŹŁZćęo,2*Zą)Ąv'ŁąJ'hjxZ6ĘhąJ'^ĘkĄ,Ź9(6-ghvx>yZ&Łr3&ŚźŹ7#z
3kś!ryn&^qć_Ś{w8vĘJ++-k \"KŚXirhg\"F)0{w8óĘZx]'$iŁjb#^(>vęZŹ\"j7ćw8iłóŁyźŹ7yj {:,)(Ś{,śjgć    j20ĘJ'ŚzĘ*s<ęhŚ{6j)r8;ĄśĘŁq,'k3ĘdęZśźłuózxlŹżmhudŁ
&Śł73y,śkjśŚzzKnIZł&Ó\"fxŹśźłk|gŹ7ujźŹŁybr*+ĘĘ0jxśzj Zięhjhr)ui'Pen.Color := clMenu;

ponieważ wyskakuje Accass Violation. Próbowałem już z róznymi sposobami dostępu do parametrów (var, out i bez niczego), lecz nie przyniosło to żadnego efektu.

 

Pytanie: W jaki sposób zamieścić procedurę rysującą w bibliotece dll tak, by można było ją wywołać podczas rysowania itemu? W jaki sposób zadeklarować procedurę w bibliotece bym miał dostęp do zmiany wartości w polach w kanwie z parametru?

 

Jeżeli ktoś zna odpowiedź choćby na jedno pytanie - bardzo proszę o pomoc.

Serdecznie dziękuję za zainteresowanie. Pozdrawiam.

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...