09. juli 2001 - 22:50Der er
19 kommentarer og 1 løsning
OwnerDraw TMainMenu
Who?
1.: Putte let farve på hele menuen (den som normalt ligger i toppen af vinduet)
2.: Farve de enkelte menuitems, med en farve når de er \"markerede\" og når de ikke er.
Håber det er til at forstå... (hurtigt, bitte!)
Desuden: Hvordan lukker man et spørgsmål? Kan man overhovedet? Jeg har set man kan på Experts-Exchange, så mon ikke også det er muligt her på Eksperten?
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
Hvad var der galt med mit første forslag?? Måske kan du bruge denne kode?
Delphi uses the standard Windows colors. If you want to change these you\'ll have to set OwnerDraw to True and use the following OnAdvancedDrawItem event for all menu items:
type TMyMenuItem = class(TMenuItem);
procedure TForm1.MenuItemAdvancedDrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState); var TopLevel: Boolean; Win98Plus: Boolean; OldAdvancedDrawItem: TAdvancedMenuDrawItemEvent; begin with ACanvas do begin Win98Plus := (Win32MajorVersion > 4) or ((Win32MajorVersion = 4) and (Win32MinorVersion > 0)); TopLevel := TMenuItem(Sender).GetParentComponent is TMainMenu; if (odSelected in State) and (not TopLevel or (TopLevel and not Win98Plus)) then begin Brush.Color := clRed; Font.Color := clWhite; end else if Win98Plus and (odInactive in State) then begin Brush.Color := clGreen; Font.Color := clSilver; end else begin Brush.Color := clGreen; Font.Color := clWhite; end; OldAdvancedDrawItem := TMenuItem(Sender).OnAdvancedDrawItem; try TMenuItem(Sender).OnAdvancedDrawItem := nil; TMyMenuItem(Sender).AdvancedDrawItem(ACanvas, ARect, State, TopLevel); finally TMenuItem(Sender).OnAdvancedDrawItem := OldAdvancedDrawItem; end; end; end;
Jeg sidder her med en bog som jeg tror kan besvare dit spørgsmål. Desværre er det en ret omfattende procedure man skal igennem for at det kan lade sig gøre. Og da jeg ikke kan læse fra CD\'en (sådan noget lort at give folk) der følger med bogen kan jeg desværre ikke copy/paste eksemplet til dig (eksemplet er nemlig sider laaangt). Men grundprincippet er simpelthen at du tegner en bitmap på din \"resten af menuen\" (i dette tilfælde skal du bare bruge en bitmap der er malet med samme farve som formen) også dernæst lade Mainmenuen skrive alt tekst på bitmappen og til sidst tegne bitmappen på MainMenuen. Hvis jeg for tid kan jeg evt. skrive denne sider laaaang eksempel ned til dig. Men ellers kan du få bogen hos Amazon.com og den hedder \"The Tomes of Delphi 3 - Win32 Graphical API\" - Bogen har et hav af fede oplysninger og en masse gode eksempler (bare noget pis at man ikke kan læse fra CD\'en - jeg må se at få den byttet)
ZeroHero
nca>> Jeg har prøvet dit eksempel men jeg kan ikke få det til at virke. Delphi brokker sig og skriver at OnAdvancedDrawItem og en masse andre events er unidentifired...
ZeroHero>>Indsæt et menu-objekt på din form. Lav et par menupunkter og evt. også nogle undermenuer. Sæt OwnerDraw til True for menuen. Gå til Menudesigner ved at højreklikke på menu-objektet. Her skal du for HVERT menupunkt gå ind under events og ud for OnAdvancedDrawItem vælge den procedure, som jeg har beskrevet ovenfor. Du vil nu få grønne menupunkter med hvid skrift. easysoft_studios>> Jeg mangler stadig at få at vide, hvilke grå områder du taler om.
nca>> Jeg har ikke nogen OnAdvanceDrawItem under events. Jeg arbejder med Delphi 4 og der er kun OnDrawItem. Hvilken version af Delphi arbejder du med? (måske er det derfor at det virker hos mig)
Jeg arbejder med Delphi 5 Enterprise. Jeg ved ikke om det har noget med sagen at gøre. Her følger min kode den en lille test. Bemærk, at ikke alle menupunkter er blevet tilknyttet ownerdraw-proceduren.
procedure TForm1.MenuItemAdvancedDrawItem(Sender: TObject; ACanvas: TCanvas;ARect: TRect; State: TOwnerDrawState); var TopLevel: Boolean; Win98Plus: Boolean; OldAdvancedDrawItem: TAdvancedMenuDrawItemEvent; begin with ACanvas do begin Win98Plus := (Win32MajorVersion > 4) or ((Win32MajorVersion = 4) and (Win32MinorVersion > 0)); TopLevel := TMenuItem(Sender).GetParentComponent is TMainMenu; if (odSelected in State) and (not TopLevel or (TopLevel and not Win98Plus)) then begin Brush.Color := clRed; Font.Color := clWhite; end else if Win98Plus and (odInactive in State) then begin Brush.Color := clGreen; Font.Color := clSilver; end else begin Brush.Color := clGreen; Font.Color := clWhite; end; OldAdvancedDrawItem := TMenuItem(Sender).OnAdvancedDrawItem; try TMenuItem(Sender).OnAdvancedDrawItem := nil; TMyMenuItem(Sender).AdvancedDrawItem(ACanvas, ARect, State, TopLevel); finally TMenuItem(Sender).OnAdvancedDrawItem := OldAdvancedDrawItem; end; end; end;
nca> når man opretter en TMainMenu, laver den en \"bjælke\" i toppen af vinudet. Den har en farve, som er diffineret i Windows, så man kan lave det om den vej... men! Jeg vil selv kunne ændre den farve...
zerohero> jep, OnAdvencedMenuDraw er noget nyt i Delphi 5, som er implementeret i, vist nok, alle graphic komponenter.
Min e-mail er (hvis du virkelig har lyst til at sende det til mig!): easysoft_studios@hotmail.com
Jo, i morgen (i dag) d. 16/7 sendt på dagen formindeligt. (Mail\'en ligger på den bærbare)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.