[VCL Win32] TransparentColor und Win XP
spacer
Autor Nachricht
Stread
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: Di 20.12.11 00:40 
Verwendete VCL: VCL Win32
Hi,
in meinem Programm (Screenshot) benötige ich ein Formular welches den ganzen Bildschirm bedeckt durchsichtig aber anklickbar ist.
Beim MouseDown Ereignis der Form wird ein Timer gestartet der mir mit Canvas ein blaues Rechteck zeichnet wo gerade mein Mauscursor ist.

Der (Teil) Code hat bisher unter Windows 7 funktioniert * Allerdings funktioniert er nicht unter Windows XP

Zum Test habe ich ein Shape das per Button transparent wird. Im MouseUp Event wird einfach ein Label verändert.
Unter Win 7 ist das Shape transparent und man kann es sowohl im normalen wie auch im transparenten Modus anklicken, Label verändert sich.
Unter XP wird das Shape auch transparent aber man kann es dann nicht mehr anklicken, man klickt quasi "durch" also auf das dahinterliegende Fenster.
Nur zur Erwähnung: Mit der ganzen Form verhält es sich wie mit dem Shape.

Ich muss aber irgendwie an das MouseUP und Down Ereignis der Form kommen.
AlphaBlend ist nutzlos, da man das blaue Auswahlrechteck (das man wie bei Windows mit der Maus so aufziehen kann) noch gut erkennen muss.

Laut Hilfe wird die Transparenz Funktion doch ab Win 200 unterstützt?



*
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
   self.WindowState:=wsMaximized;
self.BorderStyle:=bsNone;
self.FormStyle:=fsStayOnTop;
self.TransparentColor := true ;
self.Color := clOlive ;
self.TransparentColorValue := clOlive ;
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 979
Erhaltene Danke: 124

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Di 20.12.11 11:38 
Meinst Du etwas in der Art?
Ich habe erst mal nur die Exe angehängt. Beenden per Doppelklick.
Einloggen, um Attachments anzusehen!
_________________
Das Problem liegt üblicherweise zwischen den Ohren
DRY DRY KISS
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Stread Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: Di 20.12.11 13:33 
Genau das meine ich. Mit dem Roten Rand ist es sogar noch schicker *g*

Wie hast du das gemacht?
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 979
Erhaltene Danke: 124

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Di 20.12.11 13:56 
das Geheimnis steckt hier, WS_EX_Layered, UpdateLayeredWindow und aus einem Bitmap malen, für die Alphafuktionalität benötigst Du eine eine GDI - Api, GDI+ von www.progdigy.com/ ist frei, habe ich hier verwendet, steht im uses.
Der Rest sind nur noch Mouseroutinen ....
ausblenden volle Höhe Delphi-Quelltext markieren
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:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
uses GDIPAPI,GDIPOBJ;

procedure TForm2.FormPaint(Sender: TObject);
const
C_Alpha=1;
var
DestPoint, srcPoint:TPoint;
winSize:TSize;
DC : HDC;
blendfunc : BLENDFUNCTION;
Owner : HWnd;
curWinStyle:Integer;
exStyle:Dword;
BackImage:TBitMap;
Graphics : TGPGraphics;
Brush:TGPSolidBrush;
Pen:TGPPen;
xx,yy:Integer;
begin

DC := GetDC(0);
BackImage:=TBitMap.Create;
BackImage.PixelFormat := pf32Bit;
BackImage.Width := Width;
BackImage.Height := Height;
BackImage.Canvas.Brush.Color := clBlack;
BackImage.Canvas.FillRect(Rect(0,0,Width,Height));

Graphics := TGPGraphics.Create(BackImage.Canvas.Handle);
Brush:=TGPSolidBrush.Create(ColorToTGPColor(clblack,1));
Graphics.FillRectangle(Brush,0,0,Width,Height);
pen:=TGPPen.Create(ColorToTGPColor(clred,200));
pen.SetWidth(2);
Graphics.DrawRectangle(pen,0,0,Width-1,Height-1);
pen.SetWidth(1);
if FDown then
begin
Pen.SetColor(ColorToTGPColor(clblue,255));
if FStartX > FendX then xx := FendX else xx := FStartX;
if FStartY > FendY then yy := FendY else yy := FStartY;
Graphics.DrawRectangle(pen,xx,yy,Abs(FStartX - FendX),Abs(FStartY - FEndY));
end;
try
winSize.cx := width;
winSize.cy := Height;
srcPoint.x := 0;
srcPoint.y := 0;

DestPoint := BoundsRect.TopLeft;
exStyle := GetWindowLongA(handle, GWL_EXSTYLE);
if (exStyle and WS_EX_LAYERED = 0) then SetWindowLong(handle, GWL_EXSTYLE, (exStyle or WS_EX_LAYERED) );

With blendFunc do
begin
AlphaFormat := 1;
BlendFlags := 0;
BlendOp := AC_SRC_OVER;
SourceConstantAlpha := 255 - C_Alpha;
end;

UpdateLayeredWindow(Handle, DC, @DestPoint, @winSize, BackImage.Canvas.Handle, @srcPoint,clBlack, @blendFunc, 2);

finally
ReleaseDC(0, DC);
BackImage.Free;
Graphics.Free;
Brush.Free;
pen.Free;
end;

end;

_________________
Das Problem liegt üblicherweise zwischen den Ohren
DRY DRY KISS
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Stread Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: Mi 21.12.11 02:50 
Ich muss die Dateien im GDI+ pas Ordner nur in meinen Programm-Ordner verschieben wo meine .pas ist und wie von dir geschrieben die Sachen in die Uses eintragen?

Alle TGP Sachen (Bsp. Linie 15-17) sind Undeklarierte Bezeichner, aber komischer ist beim Kompilieren stopp er hier:

ausblenden Quelltext markieren
1:
[DCC Fehler] DirectDraw.pas(836): E2154 Typ 'IDirectDrawSurface' benötigt Finalization - nicht im varianten Record erlaubt


Es stimmt also was in der DirectDraw.pas nicht?
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 979
Erhaltene Danke: 124

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Mi 21.12.11 08:27 
Stimmt da war was, ist aber Jahre her, seither kopiere ich den Ordner eigentlich nur noch um.
Ich habe die beiliegende DirectDraw.pas umbenannt in _DirectDraw.pas, es wird die von Delphi gezogen.

_________________
Das Problem liegt üblicherweise zwischen den Ohren
DRY DRY KISS

Für diesen Beitrag haben gedankt: Stread
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Stread Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: Mi 21.12.11 12:07 
Ok, dann braucht man das DirectDraw.pas eigentlich nicht mehr.
Allerdings erscheinen bei mir noch jede Menge Undeklarierte Bezeichner.
Ich hab noch was vergessen oder?
user defined image

PS. Einfacher mit Delphi-Bord-mitteln geht es wohl nicht?


Zuletzt bearbeitet von Stread am Mi 21.12.11 16:37, insgesamt 1-mal bearbeitet
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 979
Erhaltene Danke: 124

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Mi 21.12.11 12:28 
Kann er die Uses nicht auflösen?
gegf. Suchpfad anpassen, oder die Units mal in den Projektordner packen, STRG und auf den Unitnamen klicken sollte die Unit öffnen.
ich habe vergessen eine Funktion beizulegen
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
 Function ColorToTGPColor (c : Tcolor; trans : Byte = 255):TGPColor;
Type
TBarry=Array[0..3] of Byte;
Var
Barry:TBarry;
R:Byte;
begin
move(C,Barry,4);
R:=Barry[2];
Barry[2]:=Barry[0];
Barry[0]:=R;
Barry[3]:=trans;
move(Barry,Result,4);
end;

_________________
Das Problem liegt üblicherweise zwischen den Ohren
DRY DRY KISS

Für diesen Beitrag haben gedankt: Stread
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Stread Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: Sa 14.01.12 13:36 
Ich drücke auf der Main-Form auf einen Button, daraufhin ruft er diese GDI-Form auf und zeichnet bei gedrückter Linken Maustaste das blaue Quadrat und die Form wird dann wieder geschlossen.

Wenn ich nun das nächste mal auf den Button drücke, sehe ich noch das blaue Quadrat vom letzten mal. Erst wenn ich ein neues aufziehe verschwindet es. (Logisch, da ich ja ein neues zeichen)

Wie kann ich es denn nun erreichen, dass das blaue Quadrat am Anfang nie sichtbar ist?

FDown:=False setzen bewirkt nur, dass man erneuten Zeichnen kein blaues Quadrat kommt, das alte bleibt bestehen.
Muss man das Graphics irgendwie Nil setzen?
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home