Avatar billede easysoft_studios Nybegynder
09. juli 2001 - 22:50 Der 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?
Avatar billede nca Juniormester
09. juli 2001 - 22:56 #1
Du lukker et spørgsmål ved at acceptere et svar - om nødvendigt ét du selv har afgivet.
Avatar billede easysoft_studios Nybegynder
09. juli 2001 - 22:59 #2
nca>> Smart!

Men det hjælper mig ikke med mit hovedspørgsmål :-|
Avatar billede nca Juniormester
09. juli 2001 - 23:11 #3
Du kan på denne adresse finde en komponent, der har, hvad du mangler:
http://www.animatedmenus.com
Avatar billede nca Juniormester
09. juli 2001 - 23:28 #4
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;

Avatar billede easysoft_studios Nybegynder
09. juli 2001 - 23:59 #5
1.: Det så ud til at være noget betale-hvis-du-vil-bruge-det, pis!


Den kode du skrev var god nok, men hvad med resten af menubaren? Det ser lidt bøvet ud at den er grå mens resten har nogle pæne farver!
Avatar billede nca Juniormester
10. juli 2001 - 10:09 #6
Hvad mener du med \"resten af menubaren\"?
Avatar billede zerohero Nybegynder
10. juli 2001 - 20:44 #7
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...
Avatar billede easysoft_studios Nybegynder
10. juli 2001 - 23:26 #8
Hey, hey!

Hvor mange point flere vil du ha??? jeg kan godt forhøje med 300...
Avatar billede zerohero Nybegynder
10. juli 2001 - 23:39 #9
Jeg vil sende dig eksemplet imorgen (jeg er for træt lige nu), hvis du lover mig at sende et project hvor nca\'s eksempel virker.

ZeroHero
Avatar billede zerohero Nybegynder
10. juli 2001 - 23:42 #10
mit mail adresse er:

info@electronicbugs.org

Sov godt... :-)
Avatar billede nca Juniormester
11. juli 2001 - 10:07 #11
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.
Avatar billede zerohero Nybegynder
11. juli 2001 - 10:54 #12
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)
Avatar billede nca Juniormester
11. juli 2001 - 12:09 #13
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.

unit Menu_Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Menus;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    Hoved11: TMenuItem;
    Hoved21: TMenuItem;
    Krop11: TMenuItem;
    Kn11: TMenuItem;
    Fod11: TMenuItem;
    Underkroppen21: TMenuItem;
    Hoved31: TMenuItem;
    Undermenu11: TMenuItem;
    Herkommerenundermenu1: TMenuItem;
    procedure MenuItemAdvancedDrawItem(Sender: TObject; ACanvas: TCanvas;ARect: TRect; State: TOwnerDrawState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

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;


end.
Avatar billede zerohero Nybegynder
11. juli 2001 - 12:45 #14
Delphi brokker sig stadig og skriver følgende:

[Error] data.pas(37): Undeclared identifier: \'TAdvancedMenuDrawItemEvent\'
[Error] data.pas(50): Undeclared identifier: \'odInactive\'
[Error] data.pas(60): Undeclared identifier: \'OnAdvancedDrawItem\'
[Error] data.pas(62): Undeclared identifier: \'OnAdvancedDrawItem\'
[Error] data.pas(63): Undeclared identifier: \'AdvancedDrawItem\'
[Error] data.pas(65): Undeclared identifier: \'OnAdvancedDrawItem\'
[Fatal Error] Project1.dpr(5): Could not compile used unit \'data.pas\'
Avatar billede nca Juniormester
11. juli 2001 - 12:54 #15
Jamen så er der åbenbart tilføjet denne mulighed i Delphi 5.
Jeg er ikke stødt på løsninger, der dækker Delphi 4.
Avatar billede zerohero Nybegynder
11. juli 2001 - 12:57 #16
øv...
Avatar billede easysoft_studios Nybegynder
11. juli 2001 - 16:12 #17
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
Avatar billede zerohero Nybegynder
13. juli 2001 - 23:46 #18
Så skulle du vist have modtaget en mail fra mig...

ZeroHero
Avatar billede nca Juniormester
15. juli 2001 - 21:31 #19
Kunne du ikke poste koden fra ZeroHero, så vi andre også kunne få glæde af den?
Avatar billede easysoft_studios Nybegynder
16. juli 2001 - 00:37 #20
Jo, i morgen (i dag) d. 16/7 sendt på dagen formindeligt. (Mail\'en ligger på den bærbare)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester