C Winapi Fenster Layout ändern

Diskutiere C Winapi Fenster Layout ändern im Developer Network Forum im Bereich Hardware & Software Forum; Hi, ich habe des öfteren schonmal nach Funktionen gesucht, die das Standard Layout von Windows Fenstern verändern, leider komme ich bei der Farbe...
  • C Winapi Fenster Layout ändern Beitrag #1
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Hi, ich habe des öfteren schonmal nach Funktionen gesucht, die das Standard Layout von Windows Fenstern verändern, leider komme ich bei der Farbe / Gestaltung der Titelleiste einfach nicht wieter, ebenso wenig wie bei der Form des Fensters.
Gibt es da irgendwo etwas bestimmtes, wonach ich suchen muss wnen cih beispielsweise keine Titelleiste mehr haben möchte, oder die Fensterform ändern will? Speziell so wie ICQ 6 oder der Steam Client, da seh ich auch nix mehr von Standardfenstern. Kann mir wer da helfen?
 
  • C Winapi Fenster Layout ändern Beitrag #2
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Du könntest über die Windows-Styles den Rahmen abschalten. Oder Du müßtest eine eigene Windows-Klasse ableiten und eine Reihe von Nachrichten abfangen die mit WM_NC* beginnen (NC = Non Client) und den Rahmen dann selbst zeichnen.

Intressant in dem Zusammenhang sind auch Layered Windows. Und schau Dir mal die Funktion SetWindowRgn(...) an. Damit kannst Du dem Fenster eine beliebige Form geben.
 
  • C Winapi Fenster Layout ändern Beitrag #3
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Hab mir die funktion angeguckt, die Sorgt dafür, dass ich quasi meinen Anwendungsbereich, der nomral unter der Titelleiste liegt einfach auf die Titelleiste erweitere und die NC Nachrihcten abfangen und nur bedingt bearbeite? Quasie die Titelleiste selbst einfach übermale? Funktionen zur Bewegung, also Verschiebung des Fensters und zur Größenänderung schriebe ich dann slebst oder kann ich nur die NC_ Nachrichten abfangen, wie das Zeichnen der Titelleiste betreffen und einfach die die zum Verschieben gedacht sind ignorieren?
 
  • C Winapi Fenster Layout ändern Beitrag #4
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Das eigentliche Handling sollte Windows weiterhin übernehmen. Mit WM_NCPAINT kannst Du dann Deine eigene Titelzeile/Umrandung zeichnen. Ist schon ein paar Jahre her, als ich das mal probiert hatte. War nicht ganz ohne.

Das einfachere ist, die Titelzeile komplett zu deaktivieren und alles selbst zu machen. Mit z.B. runden Fenstern dürfte Windows auch nichts mehr mit der Standard-Titelzeile anfangen können ;-)

Btw. Runde Fenster in C# (Code an der richtigen Stelle einfügen):
Code:
            GraphicsPath path = new GraphicsPath();
            path.AddEllipse(0, 0, Width, Height);
            Region = new Region(path);
Sollte in Win32 nicht viel schwieriger sein (siehe SetWindowRgn(...)).
 
  • C Winapi Fenster Layout ändern Beitrag #5
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Gut, dann werd ich nur WM_NCPAINT für miene Zwecke benutzen, mal sehen was dabei rauskommt.
Vielen Dank schonmal. :goil:
 
  • C Winapi Fenster Layout ändern Beitrag #6
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Okay, soweit bin ich gekommen:
Code:
	case WM_MOVE:
		{
			InvalidateRect(hWnd, &WindowRect, FALSE);
			return 0;
		}
	case WM_NCPAINT:
		{
			WindowRect.left = 0;
			WindowRect.top = 0;
			WindowRect.right = WindowWidth;
			WindowRect.bottom = WindowHeight;
			HDC hDC = GetWindowDC(hWnd);
			
                       DeleteObject(SelectObject(hDC,CreateSolidBrush(BgColor)));//Zuerst dachte ich, übermal ich den ganzen Kram einfach mal mit dem Hintergrund
			Rectangle(hDC, 0, 0, WindowWidth, WindowHeight);
			return 0;
		}
	case WM_PAINT:
		{
			PAINTSTRUCT  ps;
			HDC          hDC;
			hDC = BeginPaint(hWnd, &ps);
			{	
				SetTextColor(hDC, TextColor);
				SetBkColor(hDC,BgColor);
				DrawText(hDC, "Text", 4, &rect, DT_VCENTER);
			}
			EndPaint(hWnd, &ps);	
			return 0;
		}

Funktioniert soweit gut, das ganze Fenster wird in der Hintergrundfarbe bemalt und dannach kommend ann Objekte wie Buttons oder halt elemente aus WM_PAINT, nur wenn ich nicht WM_MOVE permanent mit InvalidateRect bearbeiten würde, so würde nach kurzer Zeit wenn ich ein anderes Fenster beispielsweise über das Fenster schiebe, wieder die Standartleiste + Border erscheinen. Bewege ich aber das Fenster ziemlich schnell (klappt obwohl halt die Leiste übermalt ist, hattest recht :goil:), so schnellt die CPU Auslastung in die Höhe, gibts da nicht was einfacheres als ständig neue Paint nachrihcten senden zu müssen? Dass ich Border und Titelleiste komplett verbanne, was muss ich noch bearbeiten.

Zudem, bekome ich Standard - Elemente wie Minimize -/ MaximizeBox und so trotzdem noch gemalt (vielleicht sogar in anderer Farbe oder muss ich das dann ebenfalls selber machen(vermutlich schon oder)?

Sry ist etwas länger geworden.;)
 
  • C Winapi Fenster Layout ändern Beitrag #7
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Dass ich Border und Titelleiste komplett verbanne, was muss ich noch bearbeiten.

Zudem, bekome ich Standard - Elemente wie Minimize -/ MaximizeBox und so trotzdem noch gemalt (vielleicht sogar in anderer Farbe oder muss ich das dann ebenfalls selber machen(vermutlich schon oder)?
Ich kenne leider keinen Weg, Windows daran zu hindern, in der Titelzeile rumzumalen.

Mein Vorschlag wäre, ein Fenster ohne Titelzeile zu erzeugen und alles selbst zu erledigen.
 
  • C Winapi Fenster Layout ändern Beitrag #8
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Sprich das Verschieben des Fensters mit nem Hittest in der Selbstgezeichneten Titelleiste und dann beabreiten von Mousemove und Mousebuttondown?
Das wäre ne möglichkeit. Die Standard Farbe für eine Anwendung kann man nicht ändern? Dass das Blau was Titelleiste und Rahmen arstellt einfach durch ne andere Farbe ersetzt wird, weil das wäre dann schon ein bisschen aufwendiger wenn man das alles Selbermacht, nur, wie erzeuge ich ein Fenster ganz ohne Titelleiste? o_O
 
  • C Winapi Fenster Layout ändern Beitrag #9
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Sorry für Doppelpost, grade mal das hier gemacht:
Code:
case WM_SETFOCUS:
	case WM_KILLFOCUS:
		{
			SendMessage(hWnd, WM_NCPAINT, 0, 0);
			return 0;
		}
Damit Funktioniert das auch wenn der Focus nicht auf dem Fenster liegt, das Problem ist nur, danach verschwinden immer alle Steuerelemente, Buttons EditControls etc... Liegt das vielleicht an dem Begin und EndPaint? Muss ich da noch was verändern, andernfalls taucht die Titelleiste nicht mehr auf.

Edit: Was genau bewirkt, dass Buttons und EditControls neugezeichnet werden? Da reicht scheinbar eine einfache WM_PAINT Nachricht nicht...
 
Zuletzt bearbeitet:
  • C Winapi Fenster Layout ändern Beitrag #10
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Edit: Was genau bewirkt, dass Buttons und EditControls neugezeichnet werden? Da reicht scheinbar eine einfache WM_PAINT Nachricht nicht...
Nein. Du mußt vorher den zu zeichnenden Bereich ungültig machen. Geht u.a. mit InvalidateRect(...).

Ein Fenster ohne Titelleiste sollte mit WS_POPUP gehen. Einfach mal die Beschreibung der Window-Styles durchgehen.
 
  • C Winapi Fenster Layout ändern Beitrag #12
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
@Unimatrix Zero: Okay, kannte den Style noch nicht, das bedeutet dann aber dass ich die Bewegung komplett selbst machen muss. Das wäre bei meinem Programm dann schon was schwerer, da es ohnehin schon auf massenhaft Mouseevents reagieren muss, aber trotzdem danke, werde mal sehen.

@Coge: Da muss ich mich erstmal durchkämpfen, was ich aber so auf anhieb gesehen habe sieht wirklich sehr interessant aus.

Danke schonmal für euere Hilfe. :goil:

(Vielleicht lebe ich auch einfach mit dem bisschen Flackern der Buttons beim Neuzeichnen, denn so lässt sich die Titelleiste nicht mehr sehen, habe aber trotzdem noch den Vorteil, dass sich das Fenster über die übermalte titelleiste noch bewegen lässt. Dann lase ich einfach den WS_OVERLAPPED style und bastel mir selbst ne Minimizebox da rien, die komen nämlich noch so unschön da drunter hervor.)
 
Thema:

C Winapi Fenster Layout ändern

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.179
Beiträge
1.579.172
Mitglieder
55.878
Neuestes Mitglied
Satan666
Oben