Problem ze skalowaniem komponentów na formie

dział ogólny

Problem ze skalowaniem komponentów na formie

Nowy postprzez Arnold_S » niedziela, 22 kwietnia 2018, 21:24

Witam!
Mam problem ze skalowaniem komponentów na formie programu.
Duży obrazek w formacie PNG (4960x3508) "przeskalowuję" do rozmiaru (1143x808) i odrysowuję go na Canvas formy, która ma rozmiar 1143x854. Dlaczego akurat taki rozmiar obrazka? Ponieważ jest to minimalna wielkość przy której w miarę widać detale.
Obrazek

Na tle formy (na obrazku) jest sporo rubryk, więc na formie umieściłem odpowiadające im pola Memo, Edit, Label itd. Na powyższym rysunku umieściłem tylko jedno pole białego koloru.
Podczas korzystania z programu komponenty zostają wypełniane danymi. Współrzędne tych komponentów są dopasowane do minimalnego rozmiaru tła formy, gdyż z taką rozdzielczością startuje program.
Właściwość BorderStyle formy ustawiłem na bsSingle aby okno można było tylko maksymalizować lub wracać do minimalnego rozmiaru (nie da się płynnie rozciągać okna).
Gdy ktoś naciśnie opcję maksymalizuj, to odpowiednia funkcja przeskalowuje z maksymalnego PNGa (4960x3508) do aktualnego, możliwie największego rozmiaru okna, przy zachowaniu proporcji obrazka. Działa to naprawdę całkiem dobrze.
Problem pojawia się gdy chciałem przeskalować wszystkie obiekty na formie aby po zmaksymalizowaniu trafiły dokładnie w miejsca odpowiadające tłu formy. Zabieg wydaje się być prosty. Przy zwiększaniu formy, mnożyłem właściwości (left, top, width, height) komponentów przez ten sam współczynnik. Niestety wychodzą dziwne akcje. Komponenty nie są w tych miejscach.
Znalazłem przykłady na YT, jak robią podobne rzeczy w Delphi lub C# i tam mało kto pisał ręcznie funkcję skalującą na piechotę, tylko wszystkie komponenty na formie musiały mieć właściwość Align ustawioną na alCustom oraz właściwości Anchors (akLeft=true, akTop=true, akRight=true). Wówczas podczas zmiany rozmiaru okna wszystkie komponenty automatycznie powinny się przeskalować...ale to nie działa, wcale się nie skalują. Moja funkcja przynajmniej powodowała właściwą zmianę skali ale w niewłaściwe miejsce.
Myślę, że problem polega na tym, że na canvasie formy ,o minimalnych współrzędnych (0, 0, 1143, 854), odrysowuję obrazek zmniejszony do 1143x808, nie od Left=0 i Top=0, tylko od Left=0 i Top=25. Te 25 pikseli przeznaczyłem na Buttony. Nie chciałem aby były umieszczone na tle formy (nie ma tam za bardzo miejsca).

Próbowałem na wszelakie sposoby. Nawet liczyłem to na kartce i wydawało mi się, że wszystko się zgadza ale w programie pola edycyjne nie trafiają dokładnie w to samo miejsce tylko trochę przesunięte w lewo. Na początku myślałem, że to wina zaokrągleń floatów na int-y ale teraz wiem, że to nie możliwe.

Proszę o pomoc.
Avatar użytkownika
Arnold_S
Homos antropiczny
Homos antropiczny
 
Posty: 58
Dołączył(a): niedziela, 12 czerwca 2016, 23:22
Podziękował : 15
Otrzymał podziękowań: 0
System operacyjny: Win7 64b
Kompilator: C++ Builder 6, Rad Studio XE2
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem ze skalowaniem komponentów na formie

Nowy postprzez Cyfrowy Baron » wtorek, 24 kwietnia 2018, 10:20

Niczego nie musisz przemnażać, by dopasować komponenty. Przetestuj właściwości Anchors odpowiadające za wyrównywanie komponentu do lewa, praw, góry dołu, do jednego z tych paramentów, kilku lub wszystkich. Przetestuj też właściwość Align. Wrzuć jakiś komponent na formularz i zmieniając te właściwości sam zobacz co się dzieje z komponentem.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4724
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 443
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem ze skalowaniem komponentów na formie

Nowy postprzez Arnold_S » wtorek, 24 kwietnia 2018, 22:03

Dzięki za podpowiedź. Nie ukrywam, że liczyłem troszkę na Twoją wypowiedź, ponieważ masz sporo wspólnego z XE2.
Zanim napisałem tego posta to szukałem odpowiedzi w na YT, przykładach z stackoverflow i innych.
Na YT jest sporo przykładów odnoszących się do tego co piszesz ale w Delphi lub VStudio +C#. Na Twojej stronie też coś znalazłem na ten temat, więc testowałem Anchors i Align. Przyznam szczerze, że nie wychodziło mi to co chciałem osiągnąć, dlatego podjąłem się pisania własnych funkcji.
Spróbuję po testować jeszcze to samo na prostym, nowym projekcie. Jeśli nie ogarnę, to poproszę o pomoc.
Avatar użytkownika
Arnold_S
Homos antropiczny
Homos antropiczny
 
Posty: 58
Dołączył(a): niedziela, 12 czerwca 2016, 23:22
Podziękował : 15
Otrzymał podziękowań: 0
System operacyjny: Win7 64b
Kompilator: C++ Builder 6, Rad Studio XE2
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem ze skalowaniem komponentów na formie

Nowy postprzez Arnold_S » piątek, 27 kwietnia 2018, 16:04

Sprawdziłem na nowym projekcie jak zachowują się komponenty na formie gdy zmieniam właściwości Align, Anchors.
Obawiam się, że nie pomoże to w moim projekcie.
Jak napisałem w pierwszym poście, tło formy (jej Canvas) jest wypełnione bitmapą. Ten obraz resize-uje się po swojemu, a oddzielnie resize-uje się forma i komponenty na niej umieszczone. Chciałem aby wszystkie komponenty z wyjątkiem przycisków, resize-owały się tak, aby po powiększeniu okna, dokładnie wypadały w odpowiadających im miejscach na powiększonej bitmapie formy.

Byłoby znacznie prościej gdybym mógł Ci podesłać ten projekt, jakoś na maila albo gdzieś zhostować. Jest w nim bardzo niewiele kodu, właściwie to tylko trochę linijek odnośnie resize-owania, które wypociłem ale wydają mi się nie eleganckie i nie działają dokładnie.
Nie chciałbym abyś pomyślał, że chcę się Tobą wysłużyć. Naprawdę wyczerpałem już wszystkie pomysły, bardzo dużo szukałem w sieci...skończyły mi się pomysły i sam nie ruszę dalej.
Czy zechciałbyś rzucić okiem?
Avatar użytkownika
Arnold_S
Homos antropiczny
Homos antropiczny
 
Posty: 58
Dołączył(a): niedziela, 12 czerwca 2016, 23:22
Podziękował : 15
Otrzymał podziękowań: 0
System operacyjny: Win7 64b
Kompilator: C++ Builder 6, Rad Studio XE2
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem ze skalowaniem komponentów na formie

Nowy postprzez Cyfrowy Baron » piątek, 27 kwietnia 2018, 23:27

Ja wiem o co tobie chodzi, ale to co robisz nie ma dla mnie większego sensu. Dopasowywanie ułożenia obiektów do bitmapy, do tego skalowanej razem z formą. Czemu ma to służyć. Żeby to dopasować musisz stworzyć algorytm, który będzie wyliczał nowe współrzędne w oparciu o początkowe. Jeżeli twoje wyliczenia nie działają to w twoim algorytmie jest błąd. Przemyśl go.

Dodaj do aplikacji kod wskazujący np. w Label współrzędne Top i Left wskaźnika myszy względem formularza. Potem sprawdzaj na formularzu jakie jest położenie punktu na grafice bez skalowaniu i po skalowaniu do różnych rozmiarów. W ten sposób sprawdzisz czy algorytm prawidłowo liczy i ewentualnie naniesiesz do niego poprawki.

Inny pomysł, to umieść na formularzu komponent TImage i wczytaj do niego bitmapę. Ustaw mu tak właściwości: Aling = alClient; AutoSize = false; Proportional = true;

I daruj sobie rysowanie bezpośrednio na TCanvas, bo TImage zapewnia tą powierzchnię i dodatkowo ma już oprogramowane odrysowywanie. Do tak prostego zadania TImage nadaje się idealnie. Nie widzę uzasadnienia dla użycia TCanvas zamiast TImage.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4724
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 443
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem ze skalowaniem komponentów na formie

Nowy postprzez Arnold_S » niedziela, 29 kwietnia 2018, 12:16

Ja wiem o co tobie chodzi, ale to co robisz nie ma dla mnie większego sensu. Dopasowywanie ułożenia obiektów do bitmapy, do tego skalowanej razem z formą. Czemu ma to służyć.

Sens jest w tym taki, że tłem programu jest karta postaci do gry fabularnej. Karta postaci jest bardzo ładna i chciałbym aby program zachował klimat, a nie wyglądał jak formularz do zeznań podatkowych. Dlatego męczę ten kamień pod górę.
Rysowałem na Canvas formy z podstawowego powodu: używam GDI+, która obsługuje PNG. Obiekt TImage chyba najlepiej radzi sobie z BMP. Wszystkie grafiki w programie upycham do pliku.RES więc zależy mi aby zajmowały jak najmniej. Chyba najbardziej optymalnym dla mnie wyjściem jest PNG lub praca na wektorach. Wybrałem PNG.

Gdybym wiedział jak zrobić aby obiekt TImage pracował bez zastrzeżeń na PNG-ach, to pewnie zrobiłbym tak jak piszesz.
No i nasuwa mi się kolejne pytanie: jak zrobić aby obiekty poukładane na formie słuchały się automatycznego resajzu tego głównego obiektu TImage - który jest tłem?
Czy wystarczyłoby odpowiednie poustawianie im właściwości: Align i Anchors?
Avatar użytkownika
Arnold_S
Homos antropiczny
Homos antropiczny
 
Posty: 58
Dołączył(a): niedziela, 12 czerwca 2016, 23:22
Podziękował : 15
Otrzymał podziękowań: 0
System operacyjny: Win7 64b
Kompilator: C++ Builder 6, Rad Studio XE2
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem ze skalowaniem komponentów na formie

Nowy postprzez Cyfrowy Baron » wtorek, 1 maja 2018, 11:20

Arnold_S napisał(a):No i nasuwa mi się kolejne pytanie: jak zrobić aby obiekty poukładane na formie słuchały się automatycznego resajzu tego głównego obiektu TImage - który jest tłem?


Image nie posiada własnej powierzchni. Korzysta za powierzchni obiektów na których się znajduje. Nie może kontrolować innych obiektów.

Arnold_S napisał(a):Rysowałem na Canvas formy z podstawowego powodu: używam GDI+, która obsługuje PNG. Obiekt TImage chyba najlepiej radzi sobie z BMP.

Przecież w C++Builder XE2 TImage obsługuje PNG, JPEG, GIF, TIFF. Każdy z tych formatów można upchnąć w RES i wczytać z zasobów do Image.


Tutaj jest potrzebny algorytm matematyczny, a ja jestem w tym kiepski. Z moich testów jasno wynika, że nie wystarczy jeden współczynnik proporcji.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4724
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 443
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem ze skalowaniem komponentów na formie

Nowy postprzez Arnold_S » wtorek, 1 maja 2018, 12:37

Udało mi się to zrobić, niezbyt precyzyjnie ale działa. Jest mniej więcej tak jak piszesz. Do resajzu tła formy i korekty rozmiaru okna potrzebny jest jeden mnożnik. Do resajzu i korekty położenia obiektów na formie potrzebne są dwa oddzielne mnożniki. Jeden jest wyliczany inaczej niż pozostałe i mnożę nim tylko właściwość Left obiektu. Drugim mnożnikiem mnożę pozostałe właściwości: Top, Width i Height.
Próbowałem na różne sposoby i działa tylko gdy zrobię tak jak napisałem powyżej. Wciąż nie jest to precyzyjne ale wygląda tak jak gdyby błąd wynikał z zaokrągleń double do int. Jest do przyjęcia. Bardzo Ci dziękuję za zainteresowanie postem. 8-)
Avatar użytkownika
Arnold_S
Homos antropiczny
Homos antropiczny
 
Posty: 58
Dołączył(a): niedziela, 12 czerwca 2016, 23:22
Podziękował : 15
Otrzymał podziękowań: 0
System operacyjny: Win7 64b
Kompilator: C++ Builder 6, Rad Studio XE2
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem ze skalowaniem komponentów na formie

Nowy postprzez Mironas » środa, 2 maja 2018, 10:15

Wstaw ten kod którym wyliczasz pozycje komponentów przy OnResize.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 430
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder XE
TMS Components Pack
    WindowsChrome


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

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

cron