Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1948to1952
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Titelleiste Farbe ändern und Forms automatisch einfärben

Titelleiste Farbe ändern und Forms automatisch einfärben
07.10.2023 19:21:35
Norman
Hallo zusammen,

wieder mal einer, der die Farbe der Titelleiste einer Userform ändern möchte :)

Habe die zwei Threads gefunden, deren Beantwortung aber keine Lösung geboten hat:
https://www.herber.de/forum/archiv/1472to1476/1474883_Balkenfarbe_Userform_aendern.html
https://www.herber.de/forum/archiv/284to288/285138_Farbe_Titelleiste_Userform.html

Hinweis: Ich brauche keine Antwort, die sagt "Brauchst Du nicht" oder "ist zu schwer", danke :)

Hab mich mal mit Layout und Optik beschäftigt, da ist Excel ja echt Win 3.1 oldschool. Man bekommt das natürlich nicht auf "neu" gedreht, habe mir für meine Forms aber nen Automatismus geschrieben, den ich ganz nett finde und vor dem .Show aufrufe. Teile ihn hier mal als kleines Dankeschön dafür, wie man die Titelleiste einfärbt :)

Sub heißt SetStyle und erwartet ein Form. Geht dann durch alle Controls durch und setzt die Farbe. Bin noch dran, kommt vielleicht noch das ein oder andere dazu. Will noch mal nach den Buttons schauen.



Habe den Einfärbecode für die Titelleiste mal mit drin, den ich im Netz gefunden hab, geht aber nicht, fehlt wahrscheinlich noch was. Ist der Teil mit SetLayeredWindowAttributes. Windows Handle bekomme ich, aber SetLayeredWindowAttributes scheint nix zu bewirken oder ich übergebe was falsches.

Beim Start könnt ihr zwischen 3 Styles wählen,

0 - so wie immer
1 - weiß / dark cyan
2 - schwarz / weiß

Ihr könnt natürlich die globalen Parameter anpassen und mit anderen Farben rumspielen. Wie ihr seht habe ich die Variablen mit CFG benannt, bei mir können die User von außen dann die Optik in einer CFG anpassen. Wenn ich jetzt noch die Titelleiste ändern könnte, am Ende mit Alpha. Boah wäre das toll :)

Ach, eins fällt mir noch ein: Wenn Ihr ein "MultipageControl" verwendet (TabControl), dann kann die einzelne Page keinen Hintergrund. Das kann man aber lösen, indem man einen Frame auf jede einzelne Page legt, der leicht links rechts oben und unten über die Page hinaus geht. Er liegt dann sozusagen unter den Controls der Page. Falls Ihr schon eine Page habt: Einfach alle Controls auf der Page selektieren, dann ausschneiden, dann Frame auf die Page legen und über die Ränder hinaus ziehen, dann frame mit Linksklick selektieren und mit STRG + V wieder alle controls drauflegen. Da geht dann code-technisch auch nichts kaputt, der Parent der Controls ist halt jetzt nicht mehr die Page, sondern der Frame (der auf der Page liegt). Habe das selbst so gemacht, sieht ganz nice aus.




G_cfgStyle = 1 ' oder 0 oder 2 :)

Select Case G_cfgStyle
Case 1
G_cfgBCRed = &HFF
G_cfgBCGreen = &HFF
G_cfgBCBlue = &HFF

G_cfgBorderRed = &H0
G_cfgBorderGreen = &HAC
G_cfgBorderBlue = &HC1

G_cfgHeadlineRed = &H0
G_cfgHeadlineGreen = &H83
G_cfgHeadlineBlue = &H8F
G_cfgMultiPageStyle = fmTabStyleButtons
' fmSpecialEffectFlat
' fmSpecialEffectRaised
' fmSpecialEffectSunken
' fmSpecialEffectEtched
' fmSpecialEffectBump
G_cfgSpecialEffect = fmSpecialEffectFlat

Case 2
G_cfgBCRed = &H0
G_cfgBCGreen = &H0
G_cfgBCBlue = &H0

G_cfgBorderRed = &HFF
G_cfgBorderGreen = &HFF
G_cfgBorderBlue = &HFF

G_cfgHeadlineRed = &HFF
G_cfgHeadlineGreen = &HFF
G_cfgHeadlineBlue = &HFF

G_cfgFntLight = True
G_cfgMultiPageStyle = fmTabStyleButtons
G_cfgSpecialEffect = fmSpecialEffectFlat
End Select






Am besten neues Modul nehmen für die Erweiterung:



Option Explicit

Private Declare PtrSafe Function SetWindowLongPtr _
Lib "user32" Alias "SetWindowLongPtrA" ( _
ByVal hwnd As LongPtr, _
ByVal nIndex As Long, _
ByVal dwNewLong As LongPtr) As LongPtr

Private Declare PtrSafe Function GetWindowLongPtr _
Lib "user32" Alias "GetWindowLongPtrA" ( _
ByVal hwnd As LongPtr, _
ByVal nIndex As Long) As LongPtr

Private Declare PtrSafe Function SetLayeredWindowAttributes _
Lib "user32" ( _
ByVal hwnd As LongPtr, _
ByVal crKey As Long, _
ByVal bAlpha As Byte, _
ByVal dwFlags As Long) As Long

Private Const GWL_EXSTYLE As Long = -20
Private Const WS_EX_LAYERED As Long = &H80000
Private Const LWA_COLORKEY As Long = &H1
Private Const LWA_ALPHA As Long = &H2

Public G_cfgStyle As Long

Public G_cfgBCRed As Integer
Public G_cfgBCGreen As Integer
Public G_cfgBCBlue As Integer
Public G_cfgBorderRed As Integer
Public G_cfgBorderGreen As Integer
Public G_cfgBorderBlue As Integer
Public G_cfgHeadlineRed As Integer
Public G_cfgHeadlineGreen As Integer
Public G_cfgHeadlineBlue As Integer

Public G_cfgMultiPageStyle As Long
Public G_cfgFntLight As Boolean
Public G_cfgSpecialEffect As Long

Public Sub SetStyle(frm As UserForm)
If G_cfgStyle = 0 Then Exit Sub

Dim frmControl As Object
If G_cfgStyle 100 Then
On Error Resume Next

Dim hwnd As LongPtr
hwnd = FindWindow("ThunderDFrame", frm.Caption)

' Fensterstil setzen, um Layered Window-Attribute zu verwenden
SetWindowLongPtr hwnd, GWL_EXSTYLE, GetWindowLongPtr(hwnd, GWL_EXSTYLE) Or WS_EX_LAYERED

' Stellen Sie das Layered Window-Attribut dieses Fensters ein.
' Hier 255 ist die Opazität des Fensters: 0 ist vollständig transparent, 255 ist undurchsichtig.
' Das Ändern dieser Zahl wird die Transparenz des gesamten Fensters beeinflussen.
' SetLayeredWindowAttributes hwnd, 0, 127, LWA_ALPHA
SetLayeredWindowAttributes hwnd, RGB(255, 0, 255), 127, LWA_COLORKEY Or LWA_ALPHA

frm.BackColor = RGB(G_cfgBCRed, G_cfgBCGreen, G_cfgBCBlue)
frm.controlbox = False
For Each frmControl In frm.Controls
' Hintergrundfarbe
If frmControl.BackColor > &H10FFFF And InStr(frmControl.Tag, "NOBACKCOL") = 0 Then
frmControl.BackColor = RGB(G_cfgBCRed, G_cfgBCGreen, G_cfgBCBlue)
If G_cfgBCRed 50 And G_cfgBCGreen 50 And G_cfgBCBlue 50 And G_cfgFntLight = True And TypeName(frmControl) > "MultiPage" Then
frmControl.ForeColor = RGB(255 - G_cfgBCRed, 255 - G_cfgBCGreen, 255 - G_cfgBCBlue)
End If
End If

' Rahmen
If frmControl.SpecialEffect > fmSpecialEffectFlat Then
' Rahmentyp setzen
frmControl.SpecialEffect = G_cfgSpecialEffect ' fmSpecialEffectBump

If G_cfgSpecialEffect = fmSpecialEffectFlat Then
' Rhamenfarbe nur setzen, wenn Flat
frmControl.BorderColor = RGB(G_cfgBorderRed, G_cfgBorderGreen, G_cfgBorderBlue)
frmControl.BorderStyle = fmBorderStyleSingle
End If
End If

' wenn Fett, dann Headlinefarbe setzen
If frmControl.Font.Bold Then
frmControl.ForeColor = RGB(G_cfgHeadlineRed, G_cfgHeadlineGreen, G_cfgHeadlineBlue)
End If

Select Case TypeName(frmControl)
Case "MultiPage"
frmControl.Style = G_cfgMultiPageStyle
Case "ListBox", "ComboBox", "TextBox", "Frame", "CommandButton"
' fmSpecialEffectFlat
' fmSpecialEffectRaised
' fmSpecialEffectSunken
' fmSpecialEffectEtched
' fmSpecialEffectBump
frmControl.SpecialEffect = G_cfgSpecialEffect ' fmSpecialEffectBump
End Select
Next frmControl
End If

End Sub







20
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Titelleiste Farbe ändern und Forms automatisch einfärben
07.10.2023 19:43:42
onur
Und was ist jetzt die Frage ?
die Info, ...
07.10.2023 20:56:38
Uduuh
Hallo,
... dass die Farbe der Titelleiste an den Einstellungen in der Systemsteuerung hängt und die Änderung globale Auswirkungen hat, ist doch wohl eindeutig.

Gruß aus'm Pott
Udo
AW: Titelleiste Farbe ändern und Forms automatisch einfärben
08.10.2023 11:49:56
volti
Hallo Norman,

hier abschließend noch ein paar Gedanken von mir, das Thema kommt ja immer wieder mal vor.

Mir ist dato keine Funktion bekannt, die das für ein bestimmtes Fenster bewerkstelligen könnte.
Sicher kann man, anknüpfend an Deine Bilder mit verschiedenen Titelleisten, selber was programmieren, was diese Apps wahrscheinlich auch gemacht haben.
Man denke z.B. an Windowscaption ausblenden und selbst was im oberen Bereich drüber legen. Bei Userform z.B. ein Label usw..

Der IE z.B. suggeriert mir auch immer, dass dort viele durch die API greifbare Fenster drin wären, dem ist aber nicht so, das ist alles intern gehandelt, wie auch bei Excel die Buttons.

Die Funktion SetLayeredWindowAttributes legt die Deckkraft- und Transparenzfarbenschlüssel eines überlappenden Fensters fest.
Das heißt aber nicht, dass der Caption (Titelleiste des Fensters) hiermit änderbar ist, sondern nur der Fensterbody.

Die Funktionen GetSysColor/SetSysColors setzen die Systemfarben, das Attribut COLOR_ACTIVECAPTION dürfte hierbei die Captionhintergrundfarbe setzen.
Das wäre also das, was Du möchtest.
Das ist aber, soweit ich weiß, immer für das System in Gänze.

Ich werde mich nach meinem Urlaub mal damit beschäftigen, denke aber, dass man da nicht weiterkommt.

Viele Grüße
Karl-Heinz
Anzeige
AW: Titelleiste Farbe ändern und Forms automatisch einfärben
08.10.2023 11:55:24
Norman
Hi Karl-Heinz,

danke für die Infos! Die Idee mit dem Ausblenden und dem Verwenden von Labels wäre vermutlich auch ein gangbarer Weg, der aber tatsächlich einiges an Aufwand mit sich bringt. Verschieben, Schließen, Minimieren etc. Hmmmm. In Summe muss man tatsächlich sagen, dass der Aufwand hier nicht gerechtfertigt ist. :)

Viele Grüße und einen schönen Urlaub für Dich!
AW: die Info, ...
07.10.2023 21:14:52
Norman
Hi Udo,

natürlich ist sie eindeutig, sie muss aber nicht stimmen. Schau Dir bitte mal die unterschiedlichen Styles der Überschriften Deiner Fenster unter Windows 10/11 an. Ich habe alleine in 6 Fenstern 5 unterschiedliche Farben und teilweise auch Stile. Habs mal hochgeladen, damit Du siehst, was ich meine.

Userbild

Vielleicht gehts ja nicht für Userforms, aber grundsätzlich gehts.

Nicht alles, was andere schreiben, stimmt ;)

Hat noch jemand eine Idee?

Viele Grüße
Norman
Anzeige
AW: die Info, ...
07.10.2023 21:19:00
Norman
Hansueli schreibt nebenbei, es würde gehen. Insofern scheint es ja einer zu können (wenn er denn Recht hat).
AW: die Info, ...
07.10.2023 21:20:10
onur
Verwechsele nie können mit wollen....
mag sein, dass es geht
07.10.2023 23:26:45
Uduuh
Hallo,
aber wie Hansueli auch schrieb, wohl nur mit beträchtlichem Aufwand. Liegt wohl daran, dass VBA seit der Einführung der jetzigen Form (Office97 ?) nicht wirklich weiterentwickelt bzw. an die neuen WIN/Office-Versionen angepasst wurde. Seit Jahren steht ja auch im Raum, dass VBA sterben soll.

Altes Technik-Prinzip: So fein wie nötig, so grob wie möglich. Deshalb: (was du nicht hören willst) Was soll der Scheiß?
(was aber seit etlichen Jahren anscheinend umgekehrt wird und zu unnötigen Kosten/ Aufwand/ Zeitbedarf führt. Ebenso wie die mittlerweile extremste Absicherung gegen die allgegenwärtigen Gefahren des normalen Lebens. Ich weiß nicht, wie ich so alt geworden bin. (Nur meine Meinung))

Gruß aus'm Pott
Udo
Anzeige
AW: mag sein, dass es geht
07.10.2023 23:39:05
Norman
Passt schon Udo :)

Nach all dem Feedback lass ichs. War ja nur so ne Idee, wie wir Menschen halt so sind.

Gruß
AW: die Info, ...
07.10.2023 21:24:23
Norman
Wie, doch nicht raus?

Wäre viel cooler, Du würdest zur Problemlösung beitragen können und wollen. Ich würde mich freuen, da ich mal vermute, dass Du gut coden kannst und vielleicht eine Idee hast. Weißt Du, immer den Chat mit einer nicht nützlichen Antwort zuzumachen, hilft nicht wirklich.

Aber schön, dass Du Dich hiermit noch beschäftigst.

Gruß
AW: die Info, ...
07.10.2023 21:34:10
onur
Sorry, ich wollte nur darauf hinweisen, dass, wenn sich nur einer meldet, das nicht bedeutet, dass es nur einer könnte. Weil du es dir nicht verkneifen konntest, herumzusticheln."Insofern scheint es ja einer zu können".
Wenn du eine wirklich wichtige und komplizierte Frage hättest, würde ich evtl mir "einen Arm ausreissen", um dir zu helfen, aber halt nicht bei solchen Luxus-"Problemen".
Anzeige
Hi Onur, warum so unfreundlich? Ist das wirklich notwendig?
07.10.2023 21:36:41
Norman
Hi Onur, wenn ich mir Deine Posts so anschaue, die Du auch anderen gibst, muss ich schon sagen, dass diese überwiegend unhöflich, unfreundlich und nicht zielführend sind. Von 10 gelesenen warst Du ein Mal nett und hast tatsächlich geholfen. Warum verschwendest Du Deine Zeit und die derer, die hier Hilfe suchen?

Weißt Du, es geht um Haltung. Hat auch damit zu tun, wie man sich gegenüber anderen ver"hält". Freundlichkeit kann einfach sein und Spaß machen. Destruktive Texte habe häufig ihren Ursprung in der frühen Kindheit und in fehlender Aufmerksamkeit oder geringem Selbstwertgefühl.

NIcht alle sind vielleicht so schlau wie Du, aber denk doch mal darüber nach, wenn einer schreibt "Bitte jemand anderes". Wenn einem alle anderen Dumm erscheinen, dann sollte man den Ort verlassen, an dem die anderen sind, oder vielleicht seine "Haltung" ändern.

Gruß
Anzeige
AW: Hi Onur, warum so unfreundlich? Ist das wirklich notwendig?
07.10.2023 23:04:05
onur
Sorry Norman, war wirklich nicht bösartig gemeint. Ich kann mir leider manchmal Sarkasmus nicht verkneifen, was aber nicht immer gut ankommt, auch wenn ich es eigentlich mehr als Spass meine. Vielleicht sollte ich in Zukunft bei Sarkasmus immer ein Augenzwinker-Smiley dazu posten.
Aber zugeben kannst du: "Mir gefällt die (von Windows vorgegebene) Farbe der Userform-Titelleiste nicht" ist doch wirklich kein Excel-Problem - oder ? 😉
AW: Hi Onur, warum so unfreundlich? Ist das wirklich notwendig?
07.10.2023 23:47:10
Norman
Hi Onur,

danke für Dein Feedback. Mit der Antwort kann ich gut leben, find ich gut und nett von Dir.

Der Grat zwischen Sarkasmus, Zynismus und Ironie ist echt eng, trifft aber den Empfänger auch unterschiedlich (hart). Und wenn man die Mimik / den Ton dazu nicht sieht / hört und nur Text hat, geht das in den meisten Fällen schief. Ich glaube, ein Augenzwinkern wird's nicht verbessern, außer die Antwort hat Witz und Charme (aber dann hat sie auch keinen Sarkasmus mehr) :)

Eins ist mir aber klar geworden: Scheiß auf die Caption-Farbe. Interessiert kein Schwein (außer mir vielleicht).

Gruß


Anzeige
AW: Hi Onur, warum so unfreundlich? Ist das wirklich notwendig?
07.10.2023 23:52:48
onur
Es gibt halt einige mehr oder weniger gute Möglichkeiten dafür, aber für alle gilt: Das Ergebnis lohnt den Aufwand nicht.
AW: Titelleiste Farbe ändern und Forms automatisch einfärben
07.10.2023 19:59:32
Norman
Überschrift:
--> Titelleiste Farbe ändern

Text:
--> Habe die zwei Threads gefunden, deren Beantwortung aber keine Lösung geboten hat:
--> https://www.herber.de/forum/archiv/1472to1476/1474883_Balkenfarbe_Userform_aendern.html
--> https://www.herber.de/forum/archiv/284to288/285138_Farbe_Titelleiste_Userform.html

--> "Farbe der Titelleiste einer Userform"
--> "Wenn ich jetzt noch die Titelleiste ändern könnte, am Ende mit Alpha. Boah wäre das toll :)"

--> Habe den Einfärbecode für die Titelleiste mal mit drin, den ich im Netz gefunden hab, geht aber nicht, fehlt wahrscheinlich noch was.

Komisch, ich dachte das könnte man erkennen. Nun gut. Ich formuliere es noch mal als Frage:

"Wie kann ich in der Titelleiste eines Userforms die Farbe ändern."
Anzeige
AW: Titelleiste Farbe ändern und Forms automatisch einfärben
07.10.2023 20:32:13
onur
Ach so, du teilst deinen Code "hier mal als kleines Dankeschön dafür, wie man die Titelleiste einfärbt" ?
Das ist aber nett echt von dir. ICH brauche solche Spielereien jedoch nicht (wenn doch, programmiere ich es selber), deswegen bin ICH raus.
AW: Titelleiste Farbe ändern und Forms automatisch einfärben
07.10.2023 20:46:02
Norman
Da schau. Undank ist der Welten Lohn.

Freue mich, dass Du das selbst programmieren kannst.

Schön, dass Du raus bist, schönen Abend noch für Dich.

Vielleicht hat ja noch jemand eine Idee, wie man die Titelleiste einfärben kann.
AW: Titelleiste Farbe ändern und Forms automatisch einfärben
07.10.2023 21:23:47
Oberschlumpf
ach man, onur (oder wie du auch heißen magst)
bitte was nur ist los mit dir?

eigtl kenn ich..nein, kannte ich....von dir kompetente beiträge...aber echt seit mehreren monaten schon beobachte ich, dass du viel viel öfter am meckern bist, als wirklich gute tipps zu erzählen...schade :-/

kannst du bitte nicht auch - einfach gar nicht - auf beiträge antworten, wenn du vorher schon weißt, da kommt nur wieder gejammer raus, was dann eine antwort darstellt, die so gar nicht zu der gestellten frage passt?

natürlich kannst du weiter tun, was du willst...ich hatte dich nur gebeten

und bevor du nun anfängst, an einer antwort an mich zu arbeiten, in der du verbal nur so über mich "herfallen" wirst, weil doch ich mich ja auch schon oft über andere geärgert und dies dann auch klar + deutlich geäußert hatte - antworte ich dir schon jetzt: "ja, du hast recht! auch ich war leider schon oft nicht wirklich nett. aber mir ist mein eigenes, falsches verhalten aufgefallen. und ich übe mich schon sehr gut darin, eben gar nicht zu antworten"

und meine antwort nun an dich soll gar kein gemecker dir gegenüber darstellen - ich mach mir nur echt gedanken über dich und würd mich freuen, wenn vllt auch du noch die kurve kriegst.

ciao
thorsten
Anzeige
Danke Thorsten
07.10.2023 21:50:43
Norman
Hi Thorsten, Danke, dass Du das geschrieben hast. Find ich gut und kann ich gut nachvollziehen. Über andere meckern ist einfach und häufig nur ein Spiegel des eigenen ichs. Und dito, die Erfahrung macht vermutlich jeder mal, auch ich. Gut ist, wenn man es erkennt und ändert.

Gruß

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige