Wyświetlanie różnych obrazków w zależności od wartości zmien

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Wyświetlanie różnych obrazków w zależności od wartości zmien

Nowy postprzez Cadmer » czwartek, 8 kwietnia 2010, 15:20

Witam, napotkałem na problem którego nie mogę sam rozwiązać. Otóż chciałbym wyświetlić w jednym obiekcie 2 obrazki w zależności od wartości zmiennej typu bool. Ważne jest też to że ma się on zmieniać za każdym razem kiedy zmienia się zmienna.

PS. Jestem zielony w BCB więc prosiłbym o jak najprostsze rozwiązanie.
Avatar użytkownika
Cadmer
Bladawiec
Bladawiec
 
Posty: 5
Dołączył(a): czwartek, 8 kwietnia 2010, 14:53
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows Vista HP SP2
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows VistaFirefox

Re: Wyświetlanie różnych obrazków w zależności od wartości zmien

Nowy postprzez Cyfrowy Baron » czwartek, 8 kwietnia 2010, 15:22

Skąd pobierane będą obrazki? W jakim zdarzeniu następuje zmiana wartości zmiennej? Skoro zmiana obrazków następuje wraz ze zmianą wartości zmiennej to po co zmienna?!
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wyświetlanie różnych obrazków w zależności od wartości zmien

Nowy postprzez Cadmer » czwartek, 8 kwietnia 2010, 15:42

Najprościej będzie te obrazki w zasobach programu trzymać, chyba? Jeszcze w żadnym bo na dobrą sprawę jeszcze tego pisać nie zacząłem bo przez te obrazki stoję w miejscu, ogólnie ma być to prosty symulator Game of life(http://pl.wikipedia.org/wiki/Gra_w_%C5%BCycie).
Avatar użytkownika
Cadmer
Bladawiec
Bladawiec
 
Posty: 5
Dołączył(a): czwartek, 8 kwietnia 2010, 14:53
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows Vista HP SP2
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows VistaFirefox

Re: Wyświetlanie różnych obrazków w zależności od wartości zmien

Nowy postprzez Cyfrowy Baron » czwartek, 8 kwietnia 2010, 17:51

No, ale nikt za Ciebie tego programu nie napisze. Co do umieszczania grafiki w zasobach programu to odpowiedź znajdziesz serwisie Cyfrowy Baron w dziale: porady -> grafika, porady: Umieszczanie bitmapy w zasobach programu     Umieszczanie grafiki w formacie JPEG w zasobach programu.

Co do reszty to musisz się określić, ale skoro nie stworzyłeś jeszcze wogóle kodu, to nie ma nad czym pracować.
Symulator gry w życie może jest i prosty, ale poruszanie obiektami będzie wymagało stworzenia dość złożonego algorytmu matematycznego, a potem trzeba ten algorytm jeszcze podłączyć pod grafikę, co wcale nie będzie takie proste. Nie wydaje mi się, żeby tutaj wogóle potrzebna była jakaś grafika, skoro kropki, kreski, kwadraciki itp. można rysować bezpośrednio na płótnie TCanvas.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wyświetlanie różnych obrazków w zależności od wartości zmien

Nowy postprzez Cadmer » czwartek, 8 kwietnia 2010, 18:36

Wiadomo że nikt za mnie tego nie napisze i w sumie to już pisałem ten symulator tylko że pod C w konsoli. Więc wszystkie algorytmy mam zaprojektowane pozostał problem podłączenia tego pod grafikę. W sumie to jak teraz przejrzałem kod tego starego symulatora to wpadł mi do głowy dość łopatologiczny pomysł. Jak mi z nim nie wyjdzie to wypróbuje to TCanvas.
Avatar użytkownika
Cadmer
Bladawiec
Bladawiec
 
Posty: 5
Dołączył(a): czwartek, 8 kwietnia 2010, 14:53
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows Vista HP SP2
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows 7Firefox

Re: Wyświetlanie różnych obrazków w zależności od wartości zmien

Nowy postprzez Cyfrowy Baron » piątek, 9 kwietnia 2010, 07:44

Jak mi z nim nie wyjdzie to wypróbuje to TCanvas.


Jeżeli ma to być aplikacja okienkowa, to nie masz wielkiego wyboru, możesz wykorzystać TCanvas, GDI+ lub DirectDraw. Z tych trzech możliwości TCanvas jest najprostsze, gdyż GDI+ również bazuje na TCanvas, a DirectDraw wymaga znajomości obsługi DirectX.

Wszystko znajdziesz w serwisie Cyfrowy Baron. TCanvas to w zasadzie cały dział porady -> grafika. GDI+ porady -> grafika -> Wyświetlanie grafiki z wykorzystaniem biblioteki gdiplus.dll GDI+. DirectDraw teoria -> DirectDraw.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wyświetlanie różnych obrazków w zależności od wartości zmien

Nowy postprzez polymorphism » piątek, 9 kwietnia 2010, 09:53

Z tych trzech możliwości TCanvas jest najprostsze, gdyż GDI+ również bazuje na TCanvas

Gwoli ścisłości. GDI+ nie bazuje na TCanvas, bo to dwa różne API graficzne. TCanvas to VCL-owa obudowa windowsowego GDI. Jeśli chodzi o możliwości, to fakt, GDI+ trochę tego ma. Wprawdzie nie wiem jak to dzisiaj wygląda, ale pierwsze wersje tej biblioteki były niemiłosiernie wolne (brak sprzętowego wsparcia), przez co GDI wciąż było jedynym sensownym wyborem, jeśli chodzi o szybkie rysowanie.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Wyświetlanie różnych obrazków w zależności od wartości zmien

Nowy postprzez Cyfrowy Baron » piątek, 9 kwietnia 2010, 10:06

Wprawdzie nie wiem jak to dzisiaj wygląda, ale pierwsze wersje tej biblioteki były niemiłosiernie wolne (brak sprzętowego wsparcia), przez co GDI wciąż było jedynym sensownym wyborem, jeśli chodzi o szybkie rysowanie.


Więc już nie wiem, były niemiłosiernie wolne, czy są sensownym wyborem - szybkie rysowanie? Jedno przeczy drugiemu.



TCanvas to VCL-owa obudowa windowsowego GDI


Zgadza się, źle to ująłem, postawiłem wóz przed koniem.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wyświetlanie różnych obrazków w zależności od wartości zmien

Nowy postprzez polymorphism » piątek, 9 kwietnia 2010, 10:16

Cyfrowy Baron napisał(a):Jedno przeczy drugiemu.

Nic niczemu nie przeczy. Pominąłeś zdanie, które jest przed cytowanym przez Ciebie fragmentem. Ono jasno mówi o GDI+, więc całą resztę można zrozumieć tak:

    (...) GDI+ było niemiłosiernie wolne, przez co GDI wciąż było jedynym sensownym wyborem, jeśli chodzi o szybkie rysowanie.
Czy już wszystko jasne?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Wyświetlanie różnych obrazków w zależności od wartości zmien

Nowy postprzez Cyfrowy Baron » piątek, 9 kwietnia 2010, 12:06

GDI+ weszło do użycia dopiero w Windows XP zastępując GDI, we wcześniejszych systemach było tylko GDI, więc trudno tutaj mówić o sensowym wyborze, gdyż wyboru nie było.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wyświetlanie różnych obrazków w zależności od wartości zmien

Nowy postprzez polymorphism » piątek, 9 kwietnia 2010, 12:32

A kto powiedział, że pisałem o czasach Win9x?! Zresztą jeśli pisałem o początkach GDI+, to oczywistym jest, że kwestia tego, kiedy to było i na jakim systemie, jest wtórna. Z własnego doświadczenia pamiętam, że GDI+ we wczesnych wersjach był niemiłosiernie wolny, wypadał kiepsko w porównaniu z GDI, które od dawna miało wsparcie sprzętowe. Więc nie pisz mi, że nie było wyboru, bo był - albo ładna grafika, która jest wolno malowana, albo szybkość z brzydszą grafiką (GDI). No i tak naprawdę GDI+ nigdy nie zastąpiło starego GDI, jeśli już mówimy o winXP. Większość rzeczy, nawet Twoje aplikacje, korzystają z poczciwego, archaicznego GDI.

---- EDIT ----

Zaraz, zaraz. A może Ty nie wiesz, że GDI+ i GDI to dwie różne biblioteki/API, które istnieją równolegle? :shock:
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Wyświetlanie różnych obrazków w zależności od wartości zmien

Nowy postprzez Cyfrowy Baron » piątek, 9 kwietnia 2010, 14:54

W stosunku do starego GDI, GDI+ jest zaawansowanym silnikiem graficznym. Pisząc, że nie ma tak naprawdę wyboru, chodzi mi o to, że GDI nie oferuje tego co ma do zaoferowania GDI+. Klasa TCanvas bazuje na GDI, a nie na GDI+, więc miałem rację pisząc, że masz do wyboru albo TCanvas albo GDI+.

Podsystem GDI (Interfejs Urządzeń Graficznych) zawarty jest w bibliotece gdi32.dll znajdującej się w zasobach systemu (katalog System32). Biblioteka gdiplus.dll znajduje się podkatalogach katalogu WinSxS przechowującym różne wersje bibliotek mogących wywoływać konflikt. Zasadniczo jednak pisząc aplikację opartą na GDI+ należałoby dołączyć do niej tą bibliotekę, gdyż może się okazać, że na komputerze użytkownika występuje biblioteka w innej wersji niż ta użyta w programie.

Wszelkie operacje rysowania na ekranie (w tym systemowe mechanizmy graficzne) wykorzystują funkcje GDI, więc aplikacje napisane w C++Builder również.

Narobiłem trochę zamieszania pisząc, że GDI+ bazuje na TCanvas. By nie ciągnąć w nieskończoność tego tematu, poprawiam swoją wypowiedź:


Jeżeli ma to być aplikacja okienkowa, to nie masz wielkiego wyboru, możesz wykorzystać TCanvas, GDI+ lub DirectDraw. Z tych trzech możliwości TCanvas jest najprostsze gdyż bazuje na GDI, a DirectDraw wymaga znajomości obsługi DirectX.


Co do wydajności GDI+ to mogę tylko z własnej obserwacji stwierdzić, że jest wydajniejsze od TCanvas, więc od GDI. GDI ma wsparcie sprzętowe kart graficznych, co do GDI+ to nie wiem. GDI ma jednak pewien mankament, potrafi wczytywać tylko bitmapy, nie obsługuje innych formatów. GDI potrafi co prawda dekompresować formaty JPEG i GIF, ale odbywa się to poprzez interfejs IPicture udostępniany przez mechanizm OLE. Poza tym korzystanie z przeźroczystości, czy też alpha-blend jest ograniczone i sprowadza się do kopiowania bitmapy.

Biblioteka GDI+ oferuje dwa sposoby wywoływania funkcji, standardowy, taki jak w GDI oraz obiektowy przygotowany do wykorzystywania z poziomu C++. Wygodną zmianą w GDI+ w stosunku do poprzedniczki jest to, że kontekst jest powiązany z konkretnym obiektem, podczas gdy w GDI do każdej funkcji trzeba podać kontekst w parametrach. Możliwości GDI+ w stosunku do GDI są dużo większe, a mechanizmy wydajniejsze.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wyświetlanie różnych obrazków w zależności od wartości zmien

Nowy postprzez Cadmer » niedziela, 11 kwietnia 2010, 15:19

Znów mam problem tym razem innej natury, bo z tamtym poradziłem sobie swoim łopatologicznym sposobem. Teraz chciałbym żeby po wciśnięciu buttona rozpoczęła się symulacja i przerywała się dopiero po ponownym naciśnięciu tego samego buttona. Ważne jest też to że symulacja ma się wykonywać nawet w tle.

Kod: Zaznacz cały
bool startStop=0;
(...)

void Tokno_life::wypiszKomorki()//wypisuje plansze z komórkami na ekran
{(...)}

void Tokno_life::nastepnePokolenie(int x)//oblicza następne pokolenie, x - ilość pokoleń do obliczenia
{(...)}

void __fastcall Tokno_life::start_stop_BTNClick(TObject *Sender)
{
   if(startStop==0)
   {
      startStop=1;
      start_stop_BTN->Caption="Stop";
   }
   else
   {
      startStop=0;
      start_stop_BTN->Caption="Start";
   }
}


Myśląłem o jakieś pętl nieskończonej typu:
Kod: Zaznacz cały
while(true)
{
nastepnePokolenie(1)
wypiszKomorki()
}
ale nie mam pojęcia jak ją przerwać.
Avatar użytkownika
Cadmer
Bladawiec
Bladawiec
 
Posty: 5
Dołączył(a): czwartek, 8 kwietnia 2010, 14:53
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows Vista HP SP2
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows VistaFirefox

Re: Wyświetlanie różnych obrazków w zależności od wartości zmien

Nowy postprzez Cyfrowy Baron » niedziela, 11 kwietnia 2010, 15:40

Co do wykonywania aplikacji w tle to powinieneś to zrobić za pomocą wątku. Temat wątku był już szeroko i wielokrotnie opisywany na tym forum w dziale ogólnym więc poszukaj.

Co do przerwania pętli to musisz umieścić w niej funkcję odświeżającą kolejkę komunikatów i sterować zmienną, czyli tworzysz sobie zmienną globalną typu bbol, której ustawiasz wartość początkową na true, a jeżeli chcesz przerwać pętlę to zmieniasz wartość tej zmiennej na false. Przy pobieraniu komunikatów z kolejki aplikacja przerwie pętlę:

Kod: Zaznacz cały
// zmienna globalna
bool przerwij = true;
//------------------------------------------

while(przerwij)
{
  nastepnePokolenie(1);
  wypiszKomorki();

 Application->ProcessMessages(); // odświeżanie kolejki komunikatów
}
//----------------------------------------
// by przerwać pętlę wystarczy

przerwij = false;
 

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Cadmer
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wyświetlanie różnych obrazków w zależności od wartości zmien

Nowy postprzez Cadmer » niedziela, 11 kwietnia 2010, 16:02

Działa idealnie, dzięki. Co do działania w tle to chodzi nawet bez żadnych przeróbek.
Avatar użytkownika
Cadmer
Bladawiec
Bladawiec
 
Posty: 5
Dołączył(a): czwartek, 8 kwietnia 2010, 14:53
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows Vista HP SP2
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows VistaFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje multimedialne, graficzne

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 5 gości

cron