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, 00000, SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER or SWP_FRAMECHANGED);

      // Save current align
      FSavedAlign := Align;
      // Save current position
      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:


sibbl - Mo 01.09.08 17:56

hm schade :? Doofes Vista ... xD Finds sonst zwar gut aber wenns da schon hängt :x

das hier [http://blogs.msdn.com/nickkramer/archive/2005/06/24/432517.aspx] bringt auch nichts oder?