[Delphi] Graficzny interfejs aplikacji

0

Witam!

Tworzę w swoim progrmie interfejs z wykorzystaniem plików graficznych wrzucanych do TImage (typu przyciski, tło itp.). W tym celu wykorzystuję pliki png (kanał alpha). Wszytko ładnie wygląda, jednak pojawiły się pewne problemy:

1. Niektóre elementy graficzne, na których leży kilka innych komponentów (np. TLabel), przesuwają się, w innych jest zmieniana właściwość visible, i tym samym we szystkich komponentach które leżą na nim muszę robić to samo (tzn. przesuwać, chować).
I pytanie: czy jest jakiś sposób by działało to tak jak z komponentami na TPanel: on się chowa - komponenty na nim się chowają; to samo z przesuwaniem? Myślałem nad pętlą typu FindComponent i np. właściwością Tag, ale nie wiem czy to najlepszy sposób;

2. To chyba trochę ważniejsze dla mnie: W porównaniu do np. bmp, pliki png zajmują o wiele więcej pamięci. Czy jest jakiś sposób by to zmienić? Oczywiście nie naruszając przy tym kanału alpha

3. Nasunęła mi się też myśl, że trzeba tu wykorzystać coś innego niż TImage, zastanawiałem się jak to jest robione w profesjonalnych aplikacjach, gdyż nie wydaję mi się, by było do tego celu wykorzytywane kilkanaście obiektów TImage. Może i w tej kwestii ktoś z szanownych programistów mógłby mi co nie co wytłumaczyć?

0
  1. Myślę, że tworzone są własne komponenty

  2. To żeś mi ćwieka zabił. Zawsze mi się wydawało, że PNG jest o niebo lepsze od BMP m.in. dlatego, że jest dużo mniejsze ;>

0
  1. Myślę, że tworzone są własne komponenty

A czy te komponenty oparte są o TImage czy coś podobnego, czy zupełnie od nowa tworzone?

  1. To żeś mi ćwieka zabił. Zawsze mi się wydawało, że PNG jest o niebo lepsze od BMP m.in. dlatego, że jest dużo mniejsze ;>

Też tak myślałem, ale po podmianie na bmp program zajmował mnej w pamięci, chociaż plik był 5x większy od png

A może ktoś się orientuje, czy istnieje bardziej efektywny sposób na tworzenie interfejsu z plików graficznych niż z wykorzystaniem kilkunastu TImage?

0

Istnieja przeciez bitmapy 32bit, ktore rowniez maja kanal alpha.

Mysle, ze ten artykul moze Cie zainteresowac.

0

A dlaczego nie możesz malować na Canvasie TPanela ?

0

To tak:
1.FindComponent z jednej strony może troszkę utrudnić z drugiej ułatwić ale ogólnie nie próbowalem takich rzeczy robić czasami warto ustawić kilka komponentów na innym np panelu ale to jest tylko luźna propozycja.

  1. Jest to możliwe że TImage jakoś dziwnie to koduje i zajmuje więcej miejca ale BMP też ma kanał Alpha czyli kolor 0 inaczej przezroczystość. :) BMP 32 bit-owy.

3.Te nowe komponenty mogą być albo oparte na TImage albo na funkcjach przerysowujących np:

x:=0;  wd:=BitMap.Width;
while x<wd do begin
  // Pominięcie piksli w kolorze tła 
  while (Bitmap.Canvas.Pixels[x,y]=KolorTla) and (x<=wd) do
    inc(x);
  startx:=x;
  inc(x);
  // Znalezienie następnego piksla w kolorze tła
  while (Bitmap.Canvas.Pixels[x,y]<>KolorTla) and (x<=wd) do
    inc(x);
  endx:=x;
  // Dodanie nowego regionu (ale tylko gdy był jakiś piksel innego koloru)
  if startx<wd then begin
    rgn2 := CreateRectRgn(startx+1,y,endx,y+1);
    if rgn2<>0 then
      combinergn(rgn1,rgn1,rgn2,RGN_OR);
    deleteobject(rgn2);
  end;
end;

toyman nie wiem czemu się nie da wydawało mi się że dało by radę ale szczerze nie probowałem sprawdz czy na innym obiekcie rysuje może coś żle wpisałeś albo jest to związane z tym że Panel ma kilka ustawień w inspektorze graficznych i się one gryzą z rysowaniem. Nigdy nie zaglądałem do źródła komponentu.

0

do rysowania zobacz na TjvPanel. a poza tym najprościej byłoby w tej sytuacji (żeby od początku tego nie robić całkiem), wrzucić każdy image na TPanel.

1 użytkowników online, w tym zalogowanych: 0, gości: 1