Entwickler-Ecke
Windows API - Transparente Main Form auf Desktop bringen
sibbl - Sa 30.08.08 16:15
Titel: Transparente Main Form auf Desktop bringen
Hallo,
scheint ja wirklich gut zu sein, das Forum hier. Deswegen hab ich auch gleich mal ne Frage:
Ich habe eine transparente Main Form und möchte diese auf den Desktop bringen (wenns geht hinter die Icons, davor ist aber auch nicht schlimm). D.h. sie soll dann von jedem Fenster überdeckt werden - eben wie als würde sie zum Hintergrundbild gehören (below all).
Ok hab ich mir gedacht, nimmste FindWindow, suchst den Desktop und setzt die hwnd als parentwindow deiner Form. Hat auch geklappt, nur ist dann die Transparenz weg (und es ist vor den Icons ... aber wie gesagt, nit schlimm).
Habt ihr noch ein paar Tips, wie ich das noch realisieren kann (Delphi 2007)?
Bin für jede Antwort dankbar!
mfG
Sebastian
sibbl - Mo 01.09.08 16:55
also habe bereits rausgefunden, dass dieses Problem nur bei Vista Aero-Modus ist. D.h. wenn ich Aero deaktiviere gehts wunderbar.
Hat da jemand Tips?
Delete - Mo 01.09.08 17:23
Wie hast due es denn gemacht?
sibbl - Mo 01.09.08 17:35
Parent.Handle = MainForm.Handle ... :)
Delphi-Quelltext
1: 2:
| const WS_EX_LAYERED = $00080000; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| FSavedParentExStyle := GetWindowLong(Parent.Handle, GWL_EXSTYLE); FSavedParentStyle := GetWindowLong(Parent.Handle, GWL_STYLE);
if (Parent.ClassType.InheritsFrom(TForm)) then begin FSavedParentBorderStyle := (Parent as TForm).BorderStyle; (Parent as TForm).BorderStyle := bsNone; end;
SetWindowLong(Parent.Handle, GWL_EXSTYLE, FSavedParentExStyle or WS_EX_LAYERED); SetWindowLong(Parent.Handle, GWL_STYLE, WS_VISIBLE); SetWindowPos(Parent.Handle, 0, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER or SWP_FRAMECHANGED);
FSavedAlign := Align; FSavedBoundsRect := BoundsRect;
Left := 0; Top := 0; Width := Parent.ClientWidth; Height := Parent.ClientHeight;
m_size.cx := 0; m_size.cy := 0; m_pBitsWhite := nil; m_pBitsBlack := nil;
if (0 <> m_hBmpWhite) then begin DeleteObject(m_hBmpWhite); m_hBmpWhite := 0; end;
if (0 <> m_hBmpBlack) then begin DeleteObject(m_hBmpBlack); m_hBmpBlack := 0; end;
FOldParentWndProc := Parent.WindowProc; Parent.WindowProc := NewParentWndProc; |
Delete - Mo 01.09.08 17:45
So hätte ich es auch gemacht :wink:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!