[Delphi] Obdelník kolem kurzoru

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod dyžon 12. 2. 2017 14:27

Zdravím,
chtěl bych si udělat program, kterej po stisknutí tlačítka vykreslí kolem kurzoru rámeček (hodnoty z Editů),
skryje Form (minimalizuje, Hide, nebo zprůhlední) a po kliknutí myši vyfotí to co je pod rámečkem.
zřejmě jednoduchý, ale narazil jsem hned na dva problémy.
pozici kurzoru zjišťuji přes TTimer,
skrýt kurzor a nakreslit obdelník není problém, ale
nevím, jak odstraním nakreslenej obdelník na stary pozici a to hlavně mimo Form,
a jak odchytím událost mouseClick mimo Form.
s vyfocením a případnou lupou už si poradím.
můžete mi prosím někdo poradit ??
AMD FX-6300; Gigabyte 970A-DS3P; DDR3 8192MBytes; AMD Radeon HD 6700 Series
dyžon
Junior
Uživatelský avatar

Odeslat příspěvekod JanFiala 12. 2. 2017 17:02

Tohle uděláš následovně:
skryješ form
uložíš si obsah obrazovky jako bitmapu
na ní nakreslíš rámeček nebo vezmeš jeho rozměry a příslušný kousek uložíš.

Takto pracují programy na snímání onrazovky, čtení barvy z obrazovky apod.

Kód: Vybrat vše
var
  DeskTopDC: HDC;
  DeskTopCanvas: TCanvas;
begin
  DeskTopDC := GetWindowDC(GetDesktopWindow);
  DeskTopCanvas := TCanvas.Create;
  DeskTopCanvas.Handle := DeskTopDC;
  { tady už si uděláš, co potřebuješ, třeba nakopíruješ obsah plochy do Image
  Image1.Canvas.CopyRect(Screen.DesktopRect, DeskTopCanvas, Screen.DesktopRect); }
  ReleaseDC(GetDesktopWindow, DeskTopDC);
  DeskTopCanvas.Free;
end;
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod dyžon 13. 2. 2017 08:40

to: JanFiala,
děkuji, ale asi jsi mi dobře nerozuměl.
jak udělat ten snímek vím, ale dám příklad:
na formu mám dva Edity, kam zadám šířku a výšku "fotky", pak stisknu tlačítko, form zmizí, kurzor zmizí a na jeho místě vykreslím rámeček podle údajů v Editech. To proto, abych mohl vybrat oblast pro fotku.
Dodělám si k tomu ještě i panel se zvětšeninou, pro přesnější výběr.
problém je, že když nakreslím rámeček a pohnu s myší, vykreslí se další na nových souřadnicích a já bych potřeboval ten starej smazat.
prostě potřebuju, aby se mi ten rámeček hýbal zároveň s kurzorem.
no a druhý problém je, jak odchytit událost OnMouseDown mimo form.
teď mě ale napadá, že bych mohl tu událost přidat tomu canvasu, kterej vytvořím.
to ještě vyzkouším, takže mi jde hlavně o to, jak za sebou smazat ten rámeček při pohybu s myší.
AMD FX-6300; Gigabyte 970A-DS3P; DDR3 8192MBytes; AMD Radeon HD 6700 Series
dyžon
Junior
Uživatelský avatar

Odeslat příspěvekod Just_jo 13. 2. 2017 09:03

A co tahle ochcávačka.

1. form by měl AlphaVal 1
2. form by měl velikost podle Editů a TransparentColor tak aby z něj byl vidět jen ten rámeček?

Pohyb a eventy by šli z 1. formu
Just_jo
Junior
Uživatelský avatar

Odeslat příspěvekod dyžon 13. 2. 2017 10:42

Just_jo: to je ale dobrej nápad .. ;-)
akorát mám strach, aby ikdyž ten form bude průhlednej, tak aby nezanechal na výsledné fotce nějakej alfa kanál.
musí být naprosto shodná s podkladem.
děkuju za nápad, vyzkouším to a dám vědět.
AMD FX-6300; Gigabyte 970A-DS3P; DDR3 8192MBytes; AMD Radeon HD 6700 Series
dyžon
Junior
Uživatelský avatar

Odeslat příspěvekod našinec 13. 2. 2017 10:43

Tohle na mne působí jako začátečnický program z minulého století. Doufám, že se s ním nikde nepotkám. :-)
Jinak, řešení je samozřejmě plno. Možná, že pro Tebe by bylo nejjednodušší použít tohle:

procedure TForm.(komponenta)MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
TWinControl(Sender).perform(WM_SYSCOMMAND, $f012, 0);
našinec
Junior

Odeslat příspěvekod JanFiala 13. 2. 2017 11:10

dyžon píše:to: JanFiala,

problém je, že když nakreslím rámeček a pohnu s myší, vykreslí se další na nových souřadnicích a já bych potřeboval ten starej smazat.


Možná, kdybys to popsal rovnou takto, byla by odpověď taky rovnou.
K tomu slouží XOR metoda vykresování, kterou si nastavíš pro PEN.
Jednou jej nakreslíš, podruhe jej nakreslíš na těch samých pozicích (tím jej smažeš) a následně nakreslíš na nových pozicích, takže se ti bude "hýbat".

Případně si můžeš pohrát se "selection rectangle", příklad třeba zde:
http://stackoverflow.com/questions/3422 ... -onmouseup
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod dyžon 14. 2. 2017 11:16

víš jak to je, několik hodin hledám na netu a přemýšlím, jak se správně zeptat,
až z toho nakonec mám v hlavě bordel a vyjadřovací schopnosti značně klesají.
každopádně ta Xor metoda je to co potřebuju, takže děkuji.

to našinec: neboj, s tímhle programem se fakt nesetkáš, je jen pro moje účely. potřebuju udělat mraky snímků o rozměrech 15 * 25 px a chci si to ulehčit.
jinak to co jsi psal funguje až po stisknutí tlačítka myši.
to už musí fotit. rámeček se musí pohybovat zároveň s myší, když není stisknuty žádný tlačítko.
při stisku pravýho tlačítka myši zase rámeček zmizí a nahradí ho kurzor.
AMD FX-6300; Gigabyte 970A-DS3P; DDR3 8192MBytes; AMD Radeon HD 6700 Series
dyžon
Junior
Uživatelský avatar

Odeslat příspěvekod Brcer 5. 5. 2017 00:37

Dotaz je už staršího data, ale třeba se to ještě hodí. Já bych udělal to, že bych daný obraz nakopíroval přímo do canvasu formuláře. Vytvořil bych druhý bitmap podle požadované velikosti a orámoval jej. Což lze velice jednoduše vytvořit po stisknuti myší nad obrázkem z uvedených souřadnic a ve funkci OnPaint pomoci Blittru kopíroval do Canvasu přes XOR. Postup následovný.
Po stisknuti myši
Podle uvedených požadavků uvedených v Editu, Bitmap.Create (bílý)
Pomoci LineTo vykreslit rámeček
Ve funkci OnPaint kopírovat Bitmap do Canvasu formy jako XOR podle momentální pozice myši.
funkce BitBlt(hdcDest,nXDest,nYDest,nWidth,nHeight,hdcSrc,nXSrc,nYSrc,dwRop );
Po posunutí myši kopírovat totéž s původními souřadnicemi a následně opět s novými souřadnicemi.
A tak pořád dokola.
Po puštění tlačítka myši místo kopirování pro výmaz, překopírovat obraz pod rámečkem(vymění se pouze Src Dest), do Bitmapy a odtud kamkoliv, třeba uložit. Nezapomenout uvolnit Bitmap.
Brcer
Kolemjdoucí


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků