Autor |
Beitrag |
rey003
      
Beiträge: 68
Win XP
BDS 2006
|
Verfasst: Di 26.12.06 23:06
Das ist mein erster Beitrag!
Bis jetzt konnte ich mir all meine Fragen mit Hilfe der Suche beantworten! Aber jetzt bin ich ratlos
Ich male mit DrawIconEx immer wieder ein Icon (mit halbtransparenten Farben) auf den DC eines Fensters. Nun werden die Farben bei jedem Drübermalen immer dunkler, was ich aber nicht will:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| WM_PAINT: begin DC := BeginPaint(hwnd1, ps); DrawIconEx (DC, 1, 1, hIcon1, 32, 32, 0, 0, DI_NORMAL); EndPaint(hwnd1, ps); end; |
Nun bin ich auf die Idee gekommen, dass ich ja irgendwie den Inhalt des DC löschen könnte! Aber ich weiß nicht wie
Weiß jemand von euch einen Rat?
Vielleicht stelle ich mich ja auch einfach nur zu dumm an, aber ich bin ziemlicher Änfanger in NonVCL!!! 
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Mi 27.12.06 03:04
rey003 hat folgendes geschrieben: | Das ist mein erster Beitrag!
Bis jetzt konnte ich mir all meine Fragen mit Hilfe der Suche beantworten! Aber jetzt bin ich ratlos
Ich male mit DrawIconEx immer wieder ein Icon (mit halbtransparenten Farben) auf den DC eines Fensters. Nun werden die Farben bei jedem Drübermalen immer dunkler, was ich aber nicht will:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| WM_PAINT: begin DC := BeginPaint(hwnd1, ps); DrawIconEx (DC, 1, 1, hIcon1, 32, 32, 0, 0, DI_NORMAL); EndPaint(hwnd1, ps); end; |
Nun bin ich auf die Idee gekommen, dass ich ja irgendwie den Inhalt des DC löschen könnte! Aber ich weiß nicht wie
Weiß jemand von euch einen Rat?
Vielleicht stelle ich mich ja auch einfach nur zu dumm an, aber ich bin ziemlicher Änfanger in NonVCL!!!  |
Hallo,
da musst du dich mal grundsätzlich mit den BackGround-Funktionen auseinandersetzen: WM_ERASEBKGND vor WM_PAINT und die Funktionen SetBkMode usw.
Gruss Reinhard
|
|
rey003 
      
Beiträge: 68
Win XP
BDS 2006
|
Verfasst: Mi 27.12.06 10:30
Zuerst mal: danke für deine Antwort!
Über diese Funktionen hab ich mich schon informiert! Das Problem ist nur das ich mir eine eigene Komponente (eine Imagekomponente) für nonVCL geschrieben habe!
Nun habe ich ein Hauptfenster mit einem Hintergrundbild wo ich die ImageKomponente drauf erzeuge!
In diesem Image zeige ich ein Icon (mit transparenten Stellen, da ich das Hintergrundbild des Hautfensters noch sehen will) an und benutze es wie eine Art Button!
Es reagiert auf MouseEnter und MouseLeave! Und soll bei MouseEnter ein Bild mit einem leichten Rotschimmer anzeigen, da der User ja grade auf dem "Button" ist. Nun bekomm ich diesen rotschimmer nicht mehr weg! D.h wenn die Mouse den Button verlässt soll dieser Rotschimmer wieder verschwinden(ich setzte ein Icon ohne diesem Rotschimmer in das Image) nur ich bekomme das Rot nicht mehr weg, sondern bei jedem MouseEnter wird die Farbe noch dunkler! Ich hänge mal ein Bild an damit ihr versteht was ich meine!
P.S.: WM_ERASEBKGND hab ich schon probiert:
Delphi-Quelltext 1: 2: 3: 4:
| WM_ERASEBKGND: begin result := 1; end; |
Ich hoffe ihr versteht was ich meine!!  Schon mal danke für eure Hilfe! 
Einloggen, um Attachments anzusehen!
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Do 28.12.06 11:56
rey003 hat folgendes geschrieben: | Zuerst mal: danke für deine Antwort!
Über diese Funktionen hab ich mich schon informiert! Das Problem ist nur das ich mir eine eigene Komponente (eine Imagekomponente) für nonVCL geschrieben habe!
Nun habe ich ein Hauptfenster mit einem Hintergrundbild wo ich die ImageKomponente drauf erzeuge!
In diesem Image zeige ich ein Icon (mit transparenten Stellen, da ich das Hintergrundbild des Hautfensters noch sehen will) an und benutze es wie eine Art Button!
Es reagiert auf MouseEnter und MouseLeave! Und soll bei MouseEnter ein Bild mit einem leichten Rotschimmer anzeigen, da der User ja grade auf dem "Button" ist. Nun bekomm ich diesen rotschimmer nicht mehr weg! D.h wenn die Mouse den Button verlässt soll dieser Rotschimmer wieder verschwinden(ich setzte ein Icon ohne diesem Rotschimmer in das Image) nur ich bekomme das Rot nicht mehr weg, sondern bei jedem MouseEnter wird die Farbe noch dunkler! Ich hänge mal ein Bild an damit ihr versteht was ich meine!
...
Ich hoffe ihr versteht was ich meine!! Schon mal danke für eure Hilfe!  |
Hallo,
ich habe noch keine transparenten Buttons verwendet, also habe ich möglicherweise auch keine Ahnung, was wirklich passiert, aber folgendes könnte ich mir als Erklärung vorstellen: dein "Ruhe"-Button ist innen transparent, der "MouseOver"- Button aber nicht, also zeichnest du immer abwechselnd ein nichttransparentes Rosa, dann wieder ein transparentes Nichts usw. Je nachdem, wie die GDI den Hintergrund verarbeitet, lässt sie wegen der Transparenz den Rosa Hintergund einfach stehen.
Gruss Reinhard
|
|
rey003 
      
Beiträge: 68
Win XP
BDS 2006
|
Verfasst: Do 28.12.06 12:30
Naja ich glaube auch, dass es daran liegt! Nur was kann ich dagegen machen?
Deshalb wollte ich irgendwie den DC löschen, denn beim Start geht es ja auch(einmal)!
Aber anscheinend kann man sowas nicht! Also hab ich versucht mir immer den Bereich aus dem DC des Parents zu holen und damit den Inhalt zu überschreiben, aber das geht auch irgendwie nicht
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:
| WM_PAINT: begin hparent:=GetParent(wnd); GetWindowRect(hparent,rect); DC := BeginPaint(wnd, ps); hdcMem := GetDC(hparent); if not BitBlt(DC,0,0,config^.pWidth,config^.pHeight, hdcMem,config^.MainRect.Left - rect.Left,config^.MainRect.Top-rect.Top,SRCCOPY) then messagebeep(1); ReleaseDC(hparent,hdcMem);
case config^.Mode of DSIM_ICON: begin if config^.Icon <> 0 then DrawIconEx (DC, config^.pX, config^.pY, config^.Icon, config^.pWidth, config^.pHeight, 0, 0, DI_NORMAL); end; end; EndPaint(wnd, ps); end; |
Ich hoffe man kann den Code verstehen!
Wäre nett, wenn jemand mal drüber schauen könnte!
// EDIT: Den Code ein wenig kommentiert 
_________________ Daniel S.
Zuletzt bearbeitet von rey003 am Do 28.12.06 13:31, insgesamt 1-mal bearbeitet
|
|
rey003 
      
Beiträge: 68
Win XP
BDS 2006
|
Verfasst: Do 28.12.06 13:19
Immer wenn ich genau den Bereich nehme der unter der Komponente liegt und versuche damit den Hintergrund wiederherzustellen, funktioniert das Ganze nicht, wenn ich aber irgendeinen anderen Bereich nehme geht es! Komisch!
Muss ich mir beim Start, bevor ich das Icon zum ersten Mal drüberzeichne, erst den Bereich unter der Komponente sichern???
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Do 28.12.06 16:49
rey003 hat folgendes geschrieben: | Naja ich glaube auch, dass es daran liegt! Nur was kann ich dagegen machen?
Deshalb wollte ich irgendwie den DC löschen, denn beim Start geht es ja auch(einmal)!
Aber anscheinend kann man sowas nicht! Also hab ich versucht mir immer den Bereich aus dem DC des Parents zu holen und damit den Inhalt zu überschreiben, aber das geht auch irgendwie nicht
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:
| WM_PAINT: begin hparent:=GetParent(wnd); GetWindowRect(hparent,rect); DC := BeginPaint(wnd, ps); hdcMem := GetDC(hparent); if not BitBlt(DC,0,0,config^.pWidth,config^.pHeight, hdcMem,config^.MainRect.Left - rect.Left,config^.MainRect.Top-rect.Top,SRCCOPY) then messagebeep(1); ReleaseDC(hparent,hdcMem);
case config^.Mode of DSIM_ICON: begin if config^.Icon <> 0 then DrawIconEx (DC, config^.pX, config^.pY, config^.Icon, config^.pWidth, config^.pHeight, 0, 0, DI_NORMAL); end; end; EndPaint(wnd, ps); end; |
Ich hoffe man kann den Code verstehen!
Wäre nett, wenn jemand mal drüber schauen könnte!
// EDIT: Den Code ein wenig kommentiert  |
Hallo,
ein paar unvollständige Anmerkungen:
1. Einen "gelöschten" HDC gibt es prinzipiell nicht, nur einen, der mit der Farbe des darunterliegenden oder übergeordneten Objekts, eben der Hintergrundfarbe, gefüllt wurde. Die ist überall anders.
2. Die Idee, vom Parent zu kopieren, scheitert einfach daran, dass dieser ja überschrieben wurde - da, wo du beim Rücksetzen auf normal glaubst den Hintergrund zu finden, hast du ja vorher alles mit Rosa überschrieben. Bevor du da was Vernünftiges bitblitten kannst, müsstest du erst Parent zum Neuzeichnen zwingen. Transparenz ist nicht so einfach.
Gruss Reinhard
|
|
rey003 
      
Beiträge: 68
Win XP
BDS 2006
|
Verfasst: Do 28.12.06 17:38
Nur wie zwinge ich das Parent zum Neuzeichnen!
Weil wenn sich das Parent neuzeichnet, wird das Rosa der Komponente sofort wieder auf den DC übertragen oder?
Das funktioniert nicht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| WM_PAINT: begin hparent := GetParent(wnd); GetWindowRect(hparent,rect); InvalidateRect(hparent,@rect,true); ... end; |
Ich glaube ich werde das ganz anders machen müssen!  Wenn ich mir den Teil des DC des Parent beim Erstellen der Komponente sichere...  Ach nee das würde ja auch nicht gehen, da sich da das Parent selber noch nicht gezeichnet hat! (da ich das Image im Create-Teil des Parents erstelle)
Wie und wann kann ich mir denn den DC sichern und zwischenspeichern ohne das die Stelle schon überzeichnet wurde? 
|
|
rey003 
      
Beiträge: 68
Win XP
BDS 2006
|
Verfasst: Fr 29.12.06 00:50
So ich hab es jetzt erstmal gelöst! Funktioniert auch... aber nur nicht so wie ich es ursprünglich wollte!
Danke nochmal für deine Hilfe! 
_________________ Daniel S.
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Fr 29.12.06 02:25
rey003 hat folgendes geschrieben: | Nur wie zwinge ich das Parent zum Neuzeichnen!
Weil wenn sich das Parent neuzeichnet, wird das Rosa der Komponente sofort wieder auf den DC übertragen oder?
...
...
Wie und wann kann ich mir denn den DC sichern und zwischenspeichern ohne das die Stelle schon überzeichnet wurde?  |
Hallo,
selbst sichern ist eine schlechte Idee, ich jedenfalls hätte da 2 Einwände:
1. wenn unter deinem transparenten Teil ein Text liegt und der ändert sich, wird das bei deiner Software nicht berücksichtigt (die Transparenz ist nicht "life"). Wenn du das in Kauf nimmst, brauchst du aber eigentlich garkeine Transparenz, und es sieht auch blöd aus.
2. Wenn jemand (oder du selbst) noch so einen Button programmiert und die liegen teilweise übereinander, kann das nicht funktionieren - echte Transparenz muss aber auch durch 1,2, viele Controls funktionieren.
Ich denke, die einzig korrekte Methode ist, im betroffenen Rechteck alle Windows in der Reihenfolge des Z-Order-Stacks sich neu zu zeichnen lassen - das kann nur Windows selbst so durchführen. Dazu müsste man InvalidateRect senden mit HWnd = 0 (und natürlich mit den richtigen Koordinaten dazu!).
Gruss Reinhard
|
|
rey003 
      
Beiträge: 68
Win XP
BDS 2006
|
Verfasst: Fr 29.12.06 12:23
Wie meinst du das mit dem Neuzeichen? Soll ich den Befehl dann im Paintteil des Image ausführen?
Irgendwie klappt das nämlich nicht ganz so!
Oder ich habe es noch nicht ganz verstanden! 
_________________ Daniel S.
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Fr 29.12.06 16:46
rey003 hat folgendes geschrieben: | Wie meinst du das mit dem Neuzeichen? Soll ich den Befehl dann im Paintteil des Image ausführen?
Irgendwie klappt das nämlich nicht ganz so!
Oder ich habe es noch nicht ganz verstanden!  |
Hallo,
da ist auch was unvollständig: wie löst du denn Paint überhaupt aus? In VCL würde das heissen, dem Button ein neues Image zuzuweisen, darauf passiert aber noch nichts (wahrscheinlich), dann den Button ungültig machen (mit Invalidate), was ihn veranlasst, sich neu zu zeichnen, dann erst kommt WM_PAINT. So ähnlich muss das bei dir auch ohne VCL ablaufen.
Ich würde mal versuchen, nicht nur den Button, sondern den gesamten Inhalt in dessen Rechteck ungültig zu machen, wie beschrieben mit einem WindowHandle von 0.
Ist nur ein Schuss auf Verdacht, möglicherweise auch in den Ofen.
Gruss Reinhard
|
|
rey003 
      
Beiträge: 68
Win XP
BDS 2006
|
Verfasst: Fr 29.12.06 18:03
Also zu meinem Funktionsprinzip:
Hier werden die Images erstellt:
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:
| var HKButtons : array [0..6] of HWND; hKButton_Icons : array [0..2] of HIcon; ...
for I := 0 to 6 do begin HKButtons[i] := CreateWindowEx(0, 'TDSImage', '', WS_VISIBLE or WS_CHILD, 12, 116 +i*30, 107, 22, Wnd, IDC_KButtonBase + i, hInstance, nil); SendMessage(HKButtons[i],WM_DSIMAGESETMODE ,DSIM_ICON,0); SendMessage(HKButtons[i],WM_DSIMAGESETICON ,hKButton_Icons[0],0); SendMessage(HKButtons[i],WM_DSIMAGESETCLEARBMP,DCToBitmap(BkgDC,12,116 +i*30,107,22),0); SendMessage(HKButtons[i],WM_DSIMAGESETMOUSEENTER,Integer(@KButtonMouseEnter),0); SendMessage(HKButtons[i],WM_DSIMAGESETMOUSELEAVE,Integer(@KButtonMouseLeave),0); end; |
So in der Unit des TDSImage wird das ausgelöst:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| type TDSNotifyEvent = procedure(wnd: HWND);
... WM_DSIMAGESETMouseEnter: begin config^.FOnMouseEnter:= TDSNotifyEvent(wParam); end;
WM_DSIMAGESETMouseLeave: begin config^.FOnMouseLeave:= TDSNotifyEvent(wParam); end; |
Jetzt das Auslösen dieser übergebenen Procdeuren (
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:
| WM_MOUSELEAVE: begin config^.WindowHover := False; if Assigned(config^.FOnMouseLeave) then config^.FOnMouseLeave(config^.MainWnd); end;
WM_MOUSEMOVE: begin if not config^.WindowHover then begin config^.WindowHover := True;
with config^.EventTrack do begin cbSize := SizeOf(TTrackMouseEvent); dwFlags := TME_LEAVE; hwndTrack := wnd; dwHoverTime := HOVER_DEFAULT; end; _TrackMouseEvent(@config^.EventTrack);
if Assigned(config^.FOnMouseEnter) then config^.FOnMouseEnter(config^.MainWnd); end else if Assigned(config^.FOnMouseMove) then config^.FOnMouseMove(config^.MainWnd,LOWORD(lParam),HIWORD(lParam)); end; |
So jetzt zum eigentlichen Ändern des Icons!
Das sind die beiden Proceduren die beim Erstelen übergeben worden sind:
(Ich weiß die For-Schleife ist noch nicht das beste vom Ei, reicht aber zur Demonstration!)
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:
| procedure KButtonMouseEnter(wnd: HWND); var i : integer; begin for I := 0 to 7 - 1 do begin if HKButtons[i] = wnd then begin SendMessage(HKButtons[i],WM_DSIMAGESETICON ,hKButton_Icons[1],0); InvalidateRect(HKButtons[i],nil,true); end; end; end;
procedure KButtonMouseLeave(wnd: HWND); var i : integer; begin for I := 0 to 7 - 1 do begin if HKButtons[i] = wnd then begin SendMessage(HKButtons[i],WM_DSIMAGESETICON ,hKButton_Icons[0],0); InvalidateRect(HKButtons[i],nil,true); end; end; end; |
So und nun noch der Paint-Teil der Komponente:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| WM_PAINT: begin DC := BeginPaint(wnd, ps);
hdcMem := CreateCompatibleDC(DC); SelectObject(hdcmem,config^.ClearBMP); BitBlt(DC,0,0,config^.pWidth,config^.pHeight,hdcMem,0,0,SRCCOPY); DeleteDC(hdcMem);
case config^.Mode of DSIM_ICON: begin if config^.Icon <> 0 then DrawIconEx (DC, config^.pX, config^.pY, config^.Icon, config^.pWidth, config^.pHeight, 0, 0,DI_NORMAL); end; EndPaint(wnd, ps); end; |
So das ist eigentlich das Prinzip, wie meine Komponente (bis jetzt) arbeitet! Ich hoffe man kann das verstehen! (Ist ja nicht grade wenig)!
Nur ich weiß noch nicht, wo ich dieses InvalidateRect(0,...,...) einbauen soll!
Und wann ich mir dann das richtige Stück des DC (das ja eigentlich unter der Komponente liegt) "sichern" soll, um es dann im Paint-Teil des Images nutzen zu können?
Wäre nett wenn du (oder jemand anders) mir einen Tipp geben könntest (könnte)! Weil ich weiß wirklich nicht mehr weiter! Und so viel Erfahrung in NonVCL hab ich auch noch nicht! 
_________________ Daniel S.
|
|
rey003 
      
Beiträge: 68
Win XP
BDS 2006
|
Verfasst: Fr 29.12.06 18:36
So ich hab jetzt mal das so gemacht wie ich denke wie du das meinst:
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:
| procedure KButtonMouseEnter(wnd: HWND); var i : integer; rect : TRect; begin for I := 0 to 7 - 1 do begin if HKButtons[i] = wnd then begin GetWindowRect(HKButtons[i],rect); SendMessage(HKButtons[i],WM_DSIMAGESETICON ,hKButton_Icons[1],0); InvalidateRect(0,@rect,false); end; end; end;
procedure KButtonMouseLeave(wnd: HWND); var i : integer; rect : TRect; begin for I := 0 to 7 - 1 do begin if HKButtons[i] = wnd then begin GetWindowRect(HKButtons[i],rect); SendMessage(HKButtons[i],WM_DSIMAGESETICON ,hKButton_Icons[0],0); InvalidateRect(0,@rect,false); end; end; end; |
Jetzt fängt der ganze Bildschirm an zu zucken! (weil ich anscheinend alles neumalt)
Ich hab auch schonmal das probiert, indem ich das:
Delphi-Quelltext 1:
| InvalidateRect(0,@rect,false); |
mit:
Delphi-Quelltext 1: 2:
| InvalidateRect(GetParent(HKButtons[i]),@rect,false); InvalidateRect(HKButtons[i],@rect,false); |
ersetzt habe! Funktioniert auch nicht! (Generell zeichnet er jetzt aus welchen Gründen auch immer gar kein Icon mehr drüber)
Vielleicht noch die der Paint-Teil (aber ich glaube hier läuft alles so weit richtig)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| WM_PAINT: begin DC := BeginPaint(wnd, ps); hParent := GetParent(wnd); GetWindowRect(hParent,rect); hdcMem := GetDC(hParent);
BitBlt(DC,0,0,config^.pWidth,config^.pHeight, hdcMem,config^.MainRect.Left-rect.Left, config^.MainRect.Top-rect.Top,SRCCOPY);
ReleaseDC(hParent,hdcmem);
...
EndPaint(wnd, ps); end; |
So jetzt hab ich so viel geschrieben! Aber sonst hatte ich das Gefühl es wirkt so als ob ich gar nicht drüber nachgedacht hätte!
Hab ich es so umgesetzt wie du es dir gedacht hast? Wenn nicht wie dachtest du dir das?
_________________ Daniel S.
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Fr 29.12.06 19:13
rey003 hat folgendes geschrieben: | So ich hab jetzt mal das so gemacht wie ich denke wie du das meinst:
So jetzt hab ich so viel geschrieben! Aber sonst hatte ich das Gefühl es wirkt so als ob ich gar nicht drüber nachgedacht hätte!
Hab ich es so umgesetzt wie du es dir gedacht hast? Wenn nicht wie dachtest du dir das? |
Hallo,
wie es aussieht, hast du das bei der ersten Version so gemacht, wie ich dachte (du hast das sogar mit Rect und @Rect richtig gemacht - der Teufel steckt im Detail und soll Borland holen), ich scheine aber falsch gedacht zu haben. Zitat SDK:
Parameters
hWnd
Identifies the window whose update region has changed. If this parameter is NULL, Windows invalidates and redraws all windows, and sends the WM_ERASEBKGND and WM_NCPAINT messages to the window procedure before the function returns.
Ich dachte, nur den Teil unter Rect, aber anscheinend werden dann wirklich alle Windows komplett neu gezeichnet, sorry, hab ich nicht genau genug gelesen.
Ich denke später nochmal drüber nach, erst muss mal unser Hund zu seinem Recht kommen.
Gruss Reinhard
|
|
rey003 
      
Beiträge: 68
Win XP
BDS 2006
|
Verfasst: Fr 29.12.06 21:30
In der PSDK hatte ich gar nicht mehr nachgelesen!
Man müsste irgendwie das Parent zum Neuzeichnen zwingen! Und aber bevor sich das Image wieder drüberzeichnet den DC drunter kopieren! Aber wann genau ist denn der Zeitpunkt?
Kümmert sich das Parent eigentlich auch um das Neuzeichnen der Stelle die von anderen Komponenten überdenkt sind (also in meinem Fall vom Image) ? Oder werden die einfach weggelassen?
Oh man da hab ich mir ja mal wieder was kompliziertes ausgedacht!
Aber es wird schon eine Lösung geben 
_________________ Daniel S.
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Mo 01.01.07 16:41
rey003 hat folgendes geschrieben: | ...
Oh man da hab ich mir ja mal wieder was kompliziertes ausgedacht!
Aber es wird schon eine Lösung geben  |
Hallo,
da kann ich dir uneingeschränkt zustimmen. Ich hatte in der Zwischenzeit den Verdacht, Windows wäre zu dumm für eine solche Transparenz, aber das konnte ich durch Ausprobieren widerlegen:
Wenn ich mein Firmenlogo (die Buchstaben R und K, dazwischen transparent) über ein Label lege, das Timerevents zählt, so wird das einwandfrei live hinter den Buchstaben angezeigt.
Auch der Verdacht, mit unterschiedlichen transparenten Bereichen könnte es Probleme geben, trifft nicht zu, wenn ich das Logo gegen eine anderes austausche (im Test mit Visible := true/false), funktioniert es genauso. Ich benutze dabei kein explizites Invalidate.
Mit anderen Worten, basierend auf VCL funktioniert das alles problemlos. Wo bei deiner non-VCL-Umsetzung der Fehler steckt, habe ich nicht gefunden, aber es muss einer da sein: die VCL kapselt ja bloss die Win32-API.
Ich bin sicher, du wächst mit deinen Aufgaben.
Gruss Reinhard
|
|
rey003 
      
Beiträge: 68
Win XP
BDS 2006
|
Verfasst: Mo 01.01.07 18:10
Ich habe eine Lösung gefunden!!!!
Ich habe nachdem ich deinen letzten Beitrag gelesen hatte noch mal in der VCL rumgeschnüffelt um zu schauen wie die das machen und bin fündig geworden! (in der Funktion InvalidateControl)
Die Lösung ist eigentlich ganz einfach! Und wir hatten sie schon mal fast! Nur ich habe wiedermal in der PSDK nicht gründlich genug gelesen!:
Das Rect in der Funktion InvalidateRect ist nur auf den Clientbereich des Window und nicht wie ich dachte auf den den ganzen Desktopbereich bezogen!
Wenn ich immer nur das Parent der Komponente mit den !richtigen! Koordinaten/dem richtgen Rect zum Neuzeichenen zwinge geht das Ganze, ohne das ich mir was twischenspeichern muss, wunderbar!
Hier nochmal der aktuelle Quelltext (kann man bestimmt noch optimieren!) :
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:
| procedure KButtonMouseEnter(wnd: HWND); var i : integer; PRect: TRect; Rect: TRect; R: TRect; begin for i := 0 to 6 do begin if HKButtons[i] = wnd then begin GetWindowRect(GetParent(HKButtons[i]),PRect); GetWindowRect(HKButtons[i],Rect); R.Left:= Rect.Left-PRect.Left; R.Top:= Rect.Top-PRect.Top; R.Right:= R.Left + (Rect.Right - Rect.Left); R.Bottom:= R.Top + (Rect.Bottom - Rect.Top); SendMessage(HKButtons[i],WM_DSIMAGESETICON ,hKButton_Icons[1],0); InvalidateRect(GetParent(HKButtons[i]),@R,true); Break; end; end; end; |
In dem Paint-Teil der Komponente wird jetzt nur noch das Icon gemalt ohne vorher irgendetwas anderes zu machen!
Also DANKE nochmal, dass du dir für mich und mein Problem Zeit genommen hast um mir zu helfen und mir mit deinen Tipps den Weg zur richtigen Lösung gezeigt hast! 
_________________ Daniel S.
|
|
|