Lazarus 3.0 (2023.12.21.)
Letöltés

  • Oldal:
  • 1

TÉMA:

Rács rajzolása komponensre - hogyan? 2024 ápr. 22 14:52 #2702

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 504
  • Köszönetek: 86
Javaslom, hogy átkátszó PNG képeket használj, ha átlátszó elemeket szeretnél megjeleníteni.
A jpg és sok más képtípus alaphelyzetben nem igazán alkalma ilyesmire.

A a GIMP képszerkesztő (vagy más) segítségével egyszerűen átlátszóvá teheted a képeket (esetedben a rács képét tartalmazót).
- Nyisd meg a képet a GIMP képszerkesztőben
- A menüben kattints a "Réteg", "Átlátszóság" majd a "Színből alfa..." lehetőségre
- A megjelenő ablakban a "Szín" sor végén látható pipetta ikonra kattintva választd ki a képen azt a színt mely helyett átlátszóságot szeretnél. (Ekkor a szín helyén az átlátszó hátteret jelző szürke mintás háttér jelenik meg.)
- A menüben kattints a "Réteg", "Átlátszóság" majd a "Alfacsatorna kijelöléssé alakítása" lehetőségre
- A menüben kattints a "Kijelölés", "Invertálás" (megfordítés) lehetőségre
- Nyomd le a DEL gombot a billenytűzeten
Elvileg ekkor csak az a rész marad a kép anyagából amit majd láttatni akarsz.
- A módosított kép mentéséhez a menüben kattints a "Fájl" majd az "Exportálás másként..." lehetőségre
- A megjelenő ablakban a "Név" mezőben a fájl kiterjesztését írd át png-re
- Kattints az "Exportálás" gombra
- Ekkor felugrik a png fájlokhoz tartozó paraméterek ablaka, de itt elvileg nem kell semmit változtatni, ezért csak kattints az "Exportálás" gombra
Kész


 
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

Rács rajzolása komponensre - hogyan? 2024 ápr. 21 13:19 #2699

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 78
  • Köszönetek: 1
Ezt, vagyis egy átmeneti bitmap kép közbeiktatását találtam eddig félmegoldásként, amely bár már kirajzolja a rácsot, de amikor létezik, eltakarja az alatta levő TImage-et. Hiába állítom a Transparent tulajdonságokat true-ra, a rácson kívül feketeséget is kirajzol egy nagy téglalapban, nekem meg csak a rácsvonalak kellenének. Lehetséges egyáltalán ily módon ezt megoldani, vagyis egy másik kép ráhelyezésével a TImage-re? Mindenesetre most ez a kód:
procedure TForm1.racsmutatoGombMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var bm: TBitmap;
  vszvonalhely,fugvonalhely: word;
begin
  if tvracsmutat=true then
  begin
     tvracsmutat:=false;
     if vantvracs=true then
     begin
       FreeAndNil(tvracskep);
       vantvracs:=false;
     end;
  end
  else
  begin
    tvracsmutat:=true;
    if vantvracs=false then
    begin
      tvracskep:=TImage.Create(tvScrBox);
      tvracskep.Parent:=tvScrBox;
      tvracskep.Left:=0;
      tvracskep.Top:=0;
      tvracskep.width:=terepVaszon.width;
      tvracskep.height:=terepVaszon.Height;
      tvracskep.Transparent:=true;
      bm:=TBitmap.Create;
      bm.width:=terepVaszon.width;
      bm.height:=terepVaszon.Height;
      bm.Transparent:=true;
      fugvonalhely:=csempeszel;
      vszvonalhely:=csempemag;
      bm.canvas.pen.color:=clBlue;
      while fugvonalhely<terepVaszon.width do
      begin
          bm.canvas.line(fugvonalhely,0,fugvonalhely,terepVaszon.height);
          inc(fugvonalhely,csempeszel);
      end;
      while vszvonalhely<terepVaszon.height do
      begin
          bm.canvas.line(0,vszvonalhely,terepVaszon.width,vszvonalhely);
          inc(vszvonalhely,csempemag);
      end;
      tvracskep.picture.graphic:=bm;
      FreeAndNil(bm);
    end;
    vantvracs:=true;
  end;
end;

Rács rajzolása komponensre - hogyan? 2024 ápr. 21 08:21 #2697

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 78
  • Köszönetek: 1
Sziasztok!

Adott a programomban egy ScrollBox és azon egy TImage komponens. Ezen a TImage-en szeretnék még egy rácsot is rajzolni egy gomb bekapcsolt állapotától függően.
Ehhez most a gomb lenyomásakor, tehát futásidőben létrehozok egy másik TImage-et és annak vásznán rajzolnám ki a rácsot, de nem jelenít meg semmit.
Ez a rácskép létrehozásának kódja:
procedure TForm1.racsmutatoGombMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if tvracsmutat=true then
  begin
     tvracsmutat:=false;
     if vantvracs=true then
     begin
       FreeAndNil(tvracskep);
       vantvracs:=false;
     end;
  end
  else
  begin
    tvracsmutat:=true;
    if vantvracs=false then
    begin
      tvracskep:=TImage.Create(self); //A self helyett próbálkoztam itt más objektumnevekkel is.
      tvracskep.Parent:=tvScrBox;
      tvracskep.Left:=0;
      tvracskep.Top:=0;
      tvracskep.width:=terepVaszon.width;
      tvracskep.height:=terepVaszon.Height;
      tvracskep.OnPaint:=@tvracsrajzolas;
    end;
    tvracskep.invalidate;
    vantvracs:=true;
  end;
end;
ez pedig maga a rajzolás:
procedure TForm1.tvracsrajzolas(Sender: TObject);
var vszvonalhely,fugvonalhely: word;
begin
     fugvonalhely:=csempeszel;
     vszvonalhely:=csempemag;
     brush.color:=clBlue;
     while fugvonalhely<terepVaszon.width do //Próbaképpen függőleges vonalak:
     begin
          tvracskep.canvas.line(fugvonalhely,0,fugvonalhely,terepVaszon.height);
          inc(fugvonalhely,csempeszel);
     end;
end;
Próbáltam TBitmap-ot, de az sem jelenített meg semmit, ráadásul annak Left és Top tulajdonságai sincsenek, hogy a TImage-re igazíthassam.
Aztán kipróbáltam a TPaintBox-ot, ami már megjelenítette, de teljesen takarja az alatta levő képet, és Transparent tulajdonsága sincs, hogy ne takarja.
Esetleg még a TGrid jöhetne szóba, de nem tudom, hogyan használjam és egyáltalán jó-e az én problémám orvoslására.
Hogyan oldható meg végül is ez a kérdés? Fontos, hogy a rács ne legyen része a ScrollBox-on levő TImage-nek, mert azt a képet a rács nélkül kellene elmenteni, tehát a rács külön komponens legyen, ami csak rajta van egy külön rétegként.

  • Oldal:
  • 1