roland
Warum stellt sich das Menu-Fenster so breit auf dem Bild dar ?
Hat es was mit der Auflösung zu tun ?
xprofan-Menu in Version 11.2
-
horst_ -
30. März 2009 um 09:37
-
-
-
Hallo Horst,
die Frage kann ich leider nicht beantworten. Die nötige Breite errrechne ich mit der API GetTextExtentPoint32(DC, Addr(Text), Length(Text), ISize).
Mir ist allerdings auch schon aufgefallen, dass das Ergebnis in einigen (seltenen) Fällen etwas zu breit ausfällt. Ich denke, das ist ein Schönheitsfehler, mit dem man leben kann.Kein Schönheitsfehler ist aber das Apostroph in "Tipps". Beim Mehrzahl-"s" wird im Deutschen nie ein Apostroph davor gesetzt!
Gruß
RolandPS: Unsere favorisierten Eishockey-Mannschaften müssen sich beide nun gewaltig anstrengen, wenn sie im Finale aufeinander treffen wollen. Morgen geh' ich wieder in die SAP-Arena!
-
Zitat
Kein Schönheitsfehler ist aber das Apostroph in "Tipps". Beim Mehrzahl-"s" wird im Deutschen nie ein Apostroph davor gesetzt!
Daaaanke
-
Ich bastle grad an einer Dll mit dem gleichen Thema.
-
roland: In der neuen Beta-Version missfällt mir arg, dass das Icon mit der Schriftgröße mitskaliert. Die Bildgröße gebe ich beim Erstellen der Imagelist an, und das mit Grund. So habe ich nun keine Möglichkeit mehr, das zu beeinflussen (andersherum ist es aber sehr einfach durch die Imagelist).
Jac
-
Tja, man kann es nicht allen recht machen. An der letzten Version wurde bemängelt, dass das Icon bei größeren eingestellten Menüschriften nicht auch größer wurde.
In Version 12 wird es noch weitere Set-Funktionen für Menüs geben, und da können solche Sachen ebenso eingestellt werden, wie z.B. Hintergrundbilder für Menüs, Fonts für jeden einzelnen Menüpunkt, Breite des Iconbereiches, etc. Version 11.2 stellt Funktionen für den "Normalfall" zur Verfügung. Und das ist ein Menü in der Standardgröße mit dazu passenden Icons.
(Und für Spezialfällle gibt es ja inzwischen eine DLL von Frank!)
Gruß
Roland -
Danke!
-
Ich habe es doch nicht lassen können:
Es wird schon in 11.2 die Funktion Set("MenuIconSize", n%) geben. Wird diese verwandt, kann das Icon größer werden, als die Schrifthöhe. (Gefällt mir aber eigentlich nicht. Sieht nach Platzverschwendung aus.) Kleiner als die Schrifthöhe geht aber nicht.
So, und jetzt wird 11.2 zugemacht und am Wochenende ausgeliefert!
Gruß
Roland -
Wann kann es als Update runtergeladen werden und wo?
Danke.
mfg
-
Zitat von profanfan;692452
Wann kann es als Update runtergeladen werden und wo?
Danke.
mfg
Wenn es fertig ist, werde ich es auf meiner Downloadseite zur Verfügung stellen und in meinem News-Forum ankündigen.
Gruß
Roland -
Zitat von horsthorn;690124
roland
Warum stellt sich das Menu-Fenster so breit auf dem Bild dar?Hallo Horst,
auch diesen Schönheitsfehler habe ich noch beseitigen können.
Wenn ich jetzt noch die Hilfe an 11.2 angepasst habe, wird es das Update auch zum allgemeinen Download geben.Gruß
Roland -
roland
Wunderbar -
Sieht jetzt wirklich gut aus. Ich glaube, für die meisten Anwendungen komme ich jetzt ohne die tmenu.dll aus.
-
Roland, wie weit kannst du das Aussehen von grau disableten Icons in Menüs beeinflussen? Ich denke, die werden vom System grau berechnet. Sehen leider fürchterlich aus, oft nur zweifarbig.
Gibt es vielleicht einen Style, um eine andere Grauumrechnung zu erhalten? Oder bieten deine Menüs die Möglichkeit, einen weiteren Iconhandle für das graue Icon anzugeben?
Bei den Toolbars wird doch auch ein vernünftiges graues Icon dargestellt...EDIT: Hier mal ein Bild dazu. Als Beispiel das Disketten-Symbol (ob Hicolor oder 256 Farben, das Ergebnis ist gleich mies):
-
Hallo Frank,
das SchwarzWeiss-Icon erzeuge ich durch folgenden API-Aufruf:
BWicon := CopyImage(Menuicon, IMAGE_ICON,0,0, LR_MONOCHROME)
Menuicon ist das Handle zum Icon.
Gruß
Roland -
Du erzeugst also das hässliche Ding!
Da muss für die 12er Version aber eine bessere Lösung her... hab hier nur was liegen mit G/Setpixel, nicht optimal also. Mal sehen, ob die API eine Lösung hergibt. -
Hab mich mal an DrawState versucht, was angeblich für solche Umrechnungen geeignet ist:
Code
Alles anzeigenDef GetSysColor(1) !"user32","GetSysColor" Def ExtractIconEx(5) !"shell32.dll","ExtractIconExA" Def CreateCompatibleDC(1) !"gdi32","CreateCompatibleDC" Def CreateCompatibleBitmap(3) !"gdi32","CreateCompatibleBitmap" Def SelectObject(2) !"gdi32","SelectObject" Def GetStockObject(1) !"gdi32","GetStockObject" Def FillRect(3) !"user32","FillRect" Def DrawState(10) !"user32","DrawStateA" Def ImageList_Add(3) !"comctl32.dll","ImageList_Add" Def ImageList_Merge(6) !"comctl32.dll","ImageList_Merge" Declare largeicon&,rect# Dim rect#,16 Cls GetSysColor(15) Var ilist&= Create("ImageList", 32, 32) ExtractIconEx("shell32.dll",8,Addr(largeicon&),0,1) ImageList("AddIcon", ilist&, largeicon&) Var ilist2&= Create("ImageList", 32, 32) Var dc&= CreateCompatibleDC(%hdc) Var bitmap&= CreateCompatibleBitmap(%hdc, 32, 32) Var oldbitmap&= SelectObject(dc&,bitmap&) Long rect#,0= 0,0,32,32 Var brush&= GetStockObject($2) FillRect(dc&, rect#, brush&) DrawState(dc&, 0, 0, largeicon&, 0, 0, 0, 32, 32, $3 | $20) SelectObject(dc&,oldbitmap&) ImageList_Add(ilist2&, bitmap&, bitmap&) var ilist3&= ImageList_Merge(ilist&, 0, ilist2&, 0 , 0,0) DrawIcon ilist&, 0, 8, 8 DrawIcon ilist2&, 0, 8, 48 DrawIcon ilist3&, 0, 8, 88 WaitInput
Funktioniert nicht wirklich gut. Vielleicht zieht Andreas Miethe noch was aus der Tasche.
Eine G/SetPixel-Lösung wäre noch vorhanden, jedenfalls gehören zu einem schicken Programm keine miesen 2-Farben-Menü-Icons. Da muss eine bessere Lösung her. :cool: -
Hier die Pixellösung. Sollte mit Delphi schnell genug sein, das disablete Icon muss ja doch nur einmal berechnet werden. Sieht zumindest schick aus.
Musst aber die GDI-Objekte noch freigeben:Code
Alles anzeigen' (C) Paules PC-Forum | [URL='http://www.paules-pc-forum.de/forum/../']Startseite - Paules-PC-Forum.de[/URL] ' Def GetSysColor(1) !"user32","GetSysColor" Def ExtractIconEx(5) !"shell32.dll","ExtractIconExA" Def CreateCompatibleDC(1) !"gdi32","CreateCompatibleDC" Def CreateCompatibleBitmap(3) !"gdi32","CreateCompatibleBitmap" Def SelectObject(2) !"gdi32","SelectObject" Def CreateSolidBrush(1) !"gdi32","CreateSolidBrush" Def FillRect(3) !"user32","FillRect" Def DrawState(10) !"user32","DrawStateA" Def ImageList_Add(3) !"comctl32.dll","ImageList_Add" Declare largeicon&,rect# Declare wert&,x%,y%,z%,z& Dim rect#,16 Cls GetSysColor(15) Var ilist&= Create("ImageList", 32, 32) ExtractIconEx("shell32.dll",3,Addr(largeicon&),0,1) ImageList("AddIcon", ilist&, largeicon&) Var ilist2&= Create("ImageList", 32, 32) Var dc&= CreateCompatibleDC(%hdc) Var bitmap&= CreateCompatibleBitmap(%hdc, 32, 32) Var oldbitmap&= SelectObject(dc&,bitmap&) Long rect#,0= 0,0,32,32 Var brush&= CreateSolidbrush(GetSysColor(15)) FillRect(dc&, rect#, brush&) DrawState(dc&, 0, 0, largeicon&, 0, 0, 0, 32, 32, $3 | $0) StartPaint dc& y%=0 Whileloop 32 x%=0 Whileloop 32 z&=GetPixel(x%,y%) If z&<>GetSysColor(15) z%=(GetRValue(z&)+GetGValue(z&)+GetBValue(z&))/3 SetPixel x%,y%,Rgb(z%,z%,z%) EndIf Inc x% EndWhile Inc y% EndWhile EndPaint SelectObject(dc&,oldbitmap&) ImageList_Add(ilist2&, bitmap&, 0) DrawIcon ilist&, 0, 8, 8 DrawIcon ilist2&, 0, 8, 48 WaitInput
-
Hab das etwas ausgereift, eine Abfrage war zuviel, weil sonst nicht alle Icons richtig angezeigt wurden:
Code
Alles anzeigen' (C) Paules PC-Forum ' Def GetSysColor(1) !"user32","GetSysColor" Def ExtractIconEx(5) !"shell32.dll","ExtractIconExA" Def CreateCompatibleDC(1) !"gdi32","CreateCompatibleDC" Def CreateCompatibleBitmap(3) !"gdi32","CreateCompatibleBitmap" Def SelectObject(2) !"gdi32","SelectObject" Def CreateSolidBrush(1) !"gdi32","CreateSolidBrush" Def FillRect(3) !"user32","FillRect" Def ImageList_Add(3) !"comctl32.dll","ImageList_Add" Def DeleteDC(1) !"gdi32","DeleteDC" Declare largeicon&,rect#,ilist&,ilist2&,dc&,bitmap&,oldbitmap&,brush& Declare wert&,x%,y%,z%,z&,xx& Dim rect#,16 Window 0,0-%maxx,%maxy Cls GetSysColor(15) WhileLoop %maxx/32-1 ilist&= Create("ImageList", 32, 32) ExtractIconEx("shell32.dll",xx&,Addr(largeicon&),0,1) ImageList("AddIcon", ilist&, largeicon&) DeleteObject largeicon& ilist2&= Create("ImageList", 32, 32) dc&= CreateCompatibleDC(%hdc) bitmap&= CreateCompatibleBitmap(%hdc, 32, 32) oldbitmap&= SelectObject(dc&,bitmap&) Long rect#,0= 0,0,32,32 brush&= CreateSolidbrush(GetSysColor(15)) FillRect(dc&, rect#, brush&) DeleteObject brush& StartPaint dc& DrawIcon ilist&, 0, 0, 0 y%=0 Whileloop 32 x%=0 Whileloop 32 z&=GetPixel(x%,y%) z%= (0.30 * GetRValue(z&))+(0.59 * GetGValue(z&))+(0.11 * GetBValue(z&)) SetPixel x%,y%,Rgb(z%,z%,z%) Inc x% EndWhile Inc y% EndWhile EndPaint SelectObject(dc&,oldbitmap&) ImageList_Add(ilist2&, bitmap&, 0) DrawIcon ilist&, 0, xx&*32, 8 DrawIcon ilist2&, 0, xx&*32, 48 DeleteObject ilist& DeleteObject ilist2& DeleteObject bitmap& DeleteDC(dc&) Inc xx& EndWhile WaitInput
-
Roland, wirst du das einbauen und wann?
-
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!