Autor Beitrag
SixpointedStarsoft
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22
Erhaltene Danke: 1



BeitragVerfasst: Fr 15.07.11 18:48 
Hallo zusammen

Wie kann ich bei WM_ERASEBKGND ein premultiplied Bitmap (mit Alpha) auf den Hintergrund eines GlassFrame.Enabled/SheetOfGlass-Fensters zeichnen?

Bei dem untenstehenden Code wird es nur schwarz, auch mit der Variante CreateCompatibleDC.

ausblenden volle Höhe 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:
43:
44:
45:
46:
47:
48:
49:
procedure TssFormSkinAndShapeController.PaintSkinToWindow(aPaintNC: boolean);
var
  aSaveIndex: integer;
  aDC,aTempDC: HDC;
begin
  if aPaintNC then begin
    aDC:= GetWindowDC(FSkinedForm.Handle);
    FCanvas.Handle:= aDC;
  end else
    aDC :=FCanvas.Handle;


 // aTempDC:=CreateCompatibleDC(aDC);
 // SelectObject(aTempDC,FFormBitmap.Handle);

  FCanvas.Refresh;
  aSaveIndex:= SaveDC(aDC);

  if aPaintNC then with FClientRect do begin
    ExcludeClipRect(FCanvas.Handle, Left,Top,Right,Bottom);
    //bitblt(aDC,-(FFormSkinAndShape.ShadowLeft),-(FFormSkinAndShape.ShadowTop),FFormBitmap.Width,FFormBitmap.Height,aTempDC,0,0,srccopy);

    FCanvas.Draw(-(FFormSkinAndShape.ShadowLeft),-(FFormSkinAndShape.ShadowTop), FFormBitmap);
  end else with FClientBackGroundRect do begin
    IntersectClipRect(FCanvas.Handle, Left,Top,Right,Bottom);
   // bitblt(aDC,-(FNCFrameWidth+FFormSkinAndShape.ShadowLeft),-(FNCFrameHeight+FNCCpationHeight+FFormSkinAndShape.ShadowTop),FFormBitmap.Width,FFormBitmap.Height,aTempDC,0,0,srccopy);
    FCanvas.Draw(-(FNCFrameWidth+FFormSkinAndShape.ShadowLeft),-(FNCFrameHeight+FNCCpationHeight+FFormSkinAndShape.ShadowTop), FFormBitmap);
  end;

 // DeleteDC(aTempDC);
  RestoreDC(aDC, aSaveIndex);
  FCanvas.Refresh;
  if aPaintNC then
    ReleaseDC(FSkinedForm.Handle,FCanvas.Handle);

end;

procedure TssFormSkinAndShapeController.SkinedFormWMEraseBkgnd(var Message: TWMEraseBkgnd);
begin
  Message.Result :=1;
  if not IsIconic(FSkinedForm.Handle) then begin
    FCanvas.Handle:= Message.DC;
    PaintSkinToWindow(false);
  end else
  begin
    Message.Msg := WM_ICONERASEBKGND;
    DoSavedSkinedFormWndProc(TMessage(Message));
  end;
end;


Hat jemand eine Idee, wie das gehen könnte, würde mich sehr freuen darüber.
Mit lieben Grüssen
Christoph