[DELPHI] Overlay

Pagina: 1
Acties:
  • 119 views sinds 30-01-2008
  • Reageer

  • HammerT
  • Registratie: April 2004
  • Laatst online: 12-04 12:36
Ik ben op zoek naar een tooltje om met Delphi een overlay surface te creëren over het hele scherm, ik heb wel wat gevonden om een overlay te maken over een video maar dat is niet helemaal waar ik naar op zoek ben.

Ik ben ook een tijd bezig geweest met zoeken naar een manier om dit met DirectDraw te doen, wat ik dacht toch best makkelijk te doen zou moeten zijn. Maar daar kan ik toch niets over vinden. Heb wel een heleboel gevonden van DirectX voor delphi, maar niet hoe ik nou die overlay moet maken.

Het is de bedoeling dat ik een bitmapje als overlay over het hele scherm kan plaatsen...

iemand een idee? :?

Arnoud

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Met als doel? Moet je door de overlay heen kunnen kijken? Moet je op de overlay kunnen klikken?

We adore chaos because we like to restore order - M.C. Escher


  • HammerT
  • Registratie: April 2004
  • Laatst online: 12-04 12:36
Je moet door de overlay heen kunnen kijken, het is de bedoeling om open vierkantjes te laten zien over het gehele scherm. En ook dat je de gehele overlay kunt bewegen, dat de totale bitmap groter is als het scherm (met behulp van scalen).

De overlay is puur en alleen visueel, je moet er dus niet op kunnen klikken :)

Verwijderd

Niet genoeg aan een transparante window ? Overlay is voor video/3d etc.

[edit]
Had de laatste reactie nog niet gelezen over dat klikken/

[ Voor 33% gewijzigd door Verwijderd op 18-11-2005 10:23 ]


  • HammerT
  • Registratie: April 2004
  • Laatst online: 12-04 12:36
Hey dat werkt ook wel leuk, met een transparante window. Als ik deze always on top maak met een bitmap er op die een transparante achtergrond heeft lukt het :) bedankt

maar mooier zou zijn als het echt met een overlay werkt

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Let erop dat je form niet altijd on top zal zijn, start bijvoorbeeld maar es media player met een video op full screen.
Ik ben zelf ook nog steeds op zoek naar een manier om iets echt boven alles te zetten (overlay?).

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • HammerT
  • Registratie: April 2004
  • Laatst online: 12-04 12:36
ja, daarom zou ik het toch liever met een overlay maken

Verwijderd

Volgens mij (lees: ik dacht) is overlay alleen voor hardware alla tv kaarten/ videokaarten en niet om software matig in te tekenen. Ik kan er ook niets over vinden behalve in de Display and Print Devices: Windows Driver Kit.

http://msdn.microsoft.com...aafb-3d69d0ae6580.xml.asp

Het komt er op neer dat je een overlay scherm aanmaakt in een bepaalde key kleur (bv. zwart) en hardware kan daar dan iets in toveren. Als je een screenshot maakt zie je dan ook alleen de key color en niet de video/dvd.

[ Voor 48% gewijzigd door Verwijderd op 18-11-2005 13:10 ]


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 21-04 20:42

Tomatoman

Fulltime prutser

Lees eens iets over window regions, bijvoorbeeld hier.

Een goede grap mag vrienden kosten.


Verwijderd

tomatoman schreef op vrijdag 18 november 2005 @ 13:06:
Lees eens iets over window regions, bijvoorbeeld hier.
Hier kun je dus windows mee maken die niet rechthoekig (rond, piramide, combi) zijn erg leuk om mee te werken.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

tomatoman schreef op vrijdag 18 november 2005 @ 13:06:
Lees eens iets over window regions, bijvoorbeeld hier.
En in wat voor manier is dat te gebruiken als overlay venster?

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Als je er een bitmap van maakt kun je een hele simpele grafische oplossing gebruiken. Je vult om de 1 of twee pixels met een zwart/grijs/enz. kleur. Hierdoor krijg je een heel apart effect waardoor het lijkt alsof er iets overheen ligt.

  • HammerT
  • Registratie: April 2004
  • Laatst online: 12-04 12:36
Hey, hier kan ik wel even mee verder :*) Thx

Ik had nu wat met een transparant window, zonder borders. Maar nu blijft deze niet meer "AlwaysOnTop", maar ik kijk nog even verder.
Verwijderd schreef op vrijdag 18 november 2005 @ 13:40:
Als je er een bitmap van maakt kun je een hele simpele grafische oplossing gebruiken. Je vult om de 1 of twee pixels met een zwart/grijs/enz. kleur. Hierdoor krijg je een heel apart effect waardoor het lijkt alsof er iets overheen ligt.
Ik snap niet helemaal waar je hier nou mee naartoe wilt :?

  • HammerT
  • Registratie: April 2004
  • Laatst online: 12-04 12:36
bump O-)
iemand nog een idee voor een overlay?

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 21-04 20:42

Tomatoman

Fulltime prutser

Wat heb je inmiddels zelf allemaal al geprogrammeerd? Je hebt inmiddels diverse suggesties gehad.

Een goede grap mag vrienden kosten.


  • HammerT
  • Registratie: April 2004
  • Laatst online: 12-04 12:36
ik ben nu bezig met een simpele transparante window. Dat gaat me wel lukken verwacht ik.

Ik heb wel wat tutorials gevonden over DelphiX, maar op een gegeven moment stond er "After installing DelphiX" maar niet hoe je dit dus moet installeren in Boreland Delphi 7. Er zaten wel allemaal leuke packages in voor Delphi 3, 4 en 5 maar dus niet voor 7 8)7 . Het zel wel aan mij liggen maar ik krijg het niet voorelkaar.

Het staat er allemaal wel mooi uitgelegd, maar ik krijg het echt niet voor elkaar om die components te installeren :(

Erg veel over te vinden maar ik kom er niet uit: http://www.clootie.ru/
Dit bedoel ik nou met DelphiX 5 http://turbo.gamedev.net/delphix.asp

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

We adore chaos because we like to restore order - M.C. Escher


  • HammerT
  • Registratie: April 2004
  • Laatst online: 12-04 12:36
Ik heb DelphiX nu werkend, bedankt. :)

Nu had ik dit gevonden:
http://www.geocities.com/...217/td_tut_background.htm

maar wat bedoeld hij precies met "Do your GDI paint stuff here" :?

hoe kan ik bijvoorbeeld een bitmap uit een DXImageList halen en op een bepaalde X Y coördinaat laten zien?

[ Voor 6% gewijzigd door HammerT op 22-11-2005 16:48 ]


  • HammerT
  • Registratie: April 2004
  • Laatst online: 12-04 12:36
Ik heb nu wat moois gemaakt dat je met behulp van DirectDraw een bitmap plaatje kunt verplaatsen over het scherm. Ik kom er alleen niet uit om dit DXDraw venster doorzichtig te maken, of is zoiets helemaal niet mogelijk?

  • HammerT
  • Registratie: April 2004
  • Laatst online: 12-04 12:36
HammerT schreef op woensdag 23 november 2005 @ 16:26:
Ik heb nu wat moois gemaakt dat je met behulp van DirectDraw een bitmap plaatje kunt verplaatsen over het scherm. Ik kom er alleen niet uit om dit DXDraw venster doorzichtig te maken, of is zoiets helemaal niet mogelijk?
Met DirectDraw kun je zoiets niet maken, omdat je speciale behandeling van de achtergrond nodig hebt.


Ik ben nu dus bezig met een transparent form
Delphi:
1
2
3
4
5
6
7
8
9
10
procedure TForm1.FormCreate(Sender: TObject);
begin
  SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE OR SWP_NOACTIVATE OR SWP_NOSIZE);
  Image1.Transparent := True;
  Image1.Picture.LoadFromFile('C:\Program Files\Borland\Delphi7\Projects\u.bmp');
  Form1.TransparentColorValue := clYellow;
  Form1.TransparentColor := True;
  Image1.Height := Screen.Height;
  Image1.Width := Screen.Width;
end;
:O

Ik heb ook functies om te scalen, en te verplaatsen.. Ik kan nu wel er in tekenen met een brush, maar als ik dan ga scalen worden de lijnen vreemd geplaatst. Nu dacht ik dus gewoon bitmapjes op het canvas van de image te tekenen, maar dit wil maar niet lukken.
Delphi:
1
2
3
4
5
6
procedure TForm1.Button1Click(Sender: TObject);
begin
  ImageList1.Draw(Image1.Canvas, 10, 10, 0);
  Image1.Repaint;
  Image1.Picture.Bitmap.Canvas.Refresh;
end;


ik heb vanalles geprobeert :? Hij wil er maar niet op tekenen

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 21-04 20:42

Tomatoman

Fulltime prutser

HammerT schreef op vrijdag 25 november 2005 @ 11:26:
[...]
Delphi:
1
2
3
4
5
6
procedure TForm1.Button1Click(Sender: TObject);
begin
  ImageList1.Draw(Image1.Canvas, 10, 10, 0);
  Image1.Repaint;
  Image1.Picture.Bitmap.Canvas.Refresh;
end;


ik heb vanalles geprobeert :? Hij wil er maar niet op tekenen
Hij tekent wel degelijk de image, alleen begrijp je zelf niet wat je nu eigenlijk doet :). Dit is wat er gebeurt:
[list]• Op regel 3 teken je een bitmap uit een image list op Image1.
• Op regel 4 forceer je dat Image1 opnieuw wordt getekend. Allereerst wordt dan het canvas leeggemaakt en vervolgens wordt de OnPaint handler van Image1 aangeroepen. Aangezien je nergens code in een OnPaint event staat, teken je hier helemaal niets. Consequentie: het resultaat van regel 3 doe je meteen teniet door het uit te wissen.
• Op regel 5 doe je een refresh van je canvas. Hiermee wordt de OnPaint handler van het canvas aangeroepen. Aangezien je canvas leeg is, wordt er weer een leeg canvas getekend. Deze regel doet daarom niets zinnigs.Ik denk dat het tijd wordt om nog eens goed de Delphi helpfiles te raadplegen, want de werking van bijvoorbeeld OnPaint staat daar gewoon in uitgelegd. Niet lullig bedoeld, maar dit is toch echt een kwestie van RTFM. :)

[ Voor 4% gewijzigd door Tomatoman op 26-11-2005 12:22 ]

Een goede grap mag vrienden kosten.


  • HammerT
  • Registratie: April 2004
  • Laatst online: 12-04 12:36
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
 procedure TForm1.Button1Click(Sender: TObject);
var
  Bitmap: TBitmap;
begin
  Bitmap := TBitmap.Create;
  try
    Bitmap.LoadFromFile('C:\Program Files\Borland\Delphi7\Projects\u.bmp');
    Image1.Canvas.Draw(100, 100, Bitmap);
    Image1.Canvas.Draw(80, 50, Bitmap);
  finally
    Bitmap.Free;
  end;
end; 
zo gaat het beter, is het zo een beetje netjes?


maaarrr... :P nu is het plaatje van u.bmp wel doorzichtig, maar de rest van de image word wit :/
u.bmp : Afbeeldingslocatie: http://img501.imageshack.us/img501/8068/u4ou.png

Wat ik ook niet snap is dat mijn functie om het geheel te stretchen niet meer werkt, dat is deze functie:
Delphi:
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
 function TForm1.ScaleBmp(bitmp: TBitmap; Amount: Integer): Boolean;
var
  TmpBmp: TBitmap;
  ARect: TRect;
  h, w: Integer;
begin
  Result := False;
  if bitmp.Height + Amount >= 10 then begin
    try                        //Stretch the image by Amount
      TmpBmp := TBitmap.Create;
      try
        h := bitmp.Height + Amount;
        w := bitmp.Width + Amount;
        TmpBmp.Width := w;
        TmpBmp.Height := h;
        ARect := Rect(0, 0, w, h);
        TmpBmp.Canvas.StretchDraw(ARect, Bitmp);
        bitmp.Assign(TmpBmp);
      finally
        TmpBmp.Free;
      end;
        Result := True;
    except
      Result := False;
    end;
  end;
end; 
moet ik dan op een bepaalde manier het canvas strechen?

  • HammerT
  • Registratie: April 2004
  • Laatst online: 12-04 12:36
Ik heb nu een functie dat ik op een paintbox teken, gebruik makend van een brush (drawrect enzow). Maar wat ik nu wil is dat een keer tekenen, en dan pas een deel naar het scherm kopieren. Dit omdat het tekenen niet al te snel gaat en als ik het ga verplaatsen zie je dit steeds opnieuw gebeuren.

Het lukte me wel om een stukje van een canvas naar een canvas te kopieren:
Delphi:
1
windowsDesktopCanvas.CopyRect(Rect(X, Y, 200, 200), DXPaintBox1.Canvas, Rect(20 + X, 20 + Y, 500 + X, 500 + Y)); 
Zoiets zoek ik dus wel.. maar dan net ff anders :9

zoiets is dus wat ik zoek.. maar een canvas is alleen het zichtbare deel (klopt dat?) dus kan je niet vanaf een niet zichtbare Bitmap (oid) kopieren. Ik heb naar mijn idee al vanalles geprobeerd maar het lukt me maar niet :( .

iemand enig idee hoe je dit zou kunnen doen?

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 21-04 20:42

Tomatoman

Fulltime prutser

HammerT schreef op dinsdag 13 december 2005 @ 09:27:
Ik heb nu een functie dat ik op een paintbox teken, gebruik makend van een brush (drawrect enzow). Maar wat ik nu wil is dat een keer tekenen, en dan pas een deel naar het scherm kopieren. Dit omdat het tekenen niet al te snel gaat en als ik het ga verplaatsen zie je dit steeds opnieuw gebeuren.

Het lukte me wel om een stukje van een canvas naar een canvas te kopieren:
Delphi:
1
windowsDesktopCanvas.CopyRect(Rect(X, Y, 200, 200), DXPaintBox1.Canvas, Rect(20 + X, 20 + Y, 500 + X, 500 + Y)); 
Zoiets zoek ik dus wel.. maar dan net ff anders :9

zoiets is dus wat ik zoek.. maar een canvas is alleen het zichtbare deel (klopt dat?) dus kan je niet vanaf een niet zichtbare Bitmap (oid) kopieren. Ik heb naar mijn idee al vanalles geprobeerd maar het lukt me maar niet :( .

iemand enig idee hoe je dit zou kunnen doen?
Je maakt een zogeheten offscreen bitmap, oftewel een TBitmap die niet op het scherm zichtbaar is. Daarop doe je al het tekenwerk en als je klaar bent kopieer je het in één keer naar het (zichtbare) canvas. Een bijkomend voordeel is dat je de onzichtbare bitmap niet telkens opnieuw hoeft te tekenen in de OnPaint van het Canvas, maar dat je dan alleen nog maar met CopyRect de (reeds eerder getekende) bitmap hoeft te kopiëren.

Dat komt ongeveer overeen met wat jij doet, maar volgens mij gebruik je de verkeerde coördinaten. Misschien haal je client coordinates en screen coordinates door elkaar - zie ClientToScreen en ScreenToClient in de helpfiles.

Een goede grap mag vrienden kosten.

Pagina: 1