CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Button SpeedButton BitBtn i Canvas?

Button SpeedButton BitBtn i Canvas?

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Button SpeedButton BitBtn i Canvas?

Nowy postprzez event15 » środa, 27 lutego 2013, 16:51

Witam.

Mam pewien problem, którego rozwiązania już szukam trochę czasu.

Mianowicie, chciałbym narysować na jednym z obiektów podanych w temacie kwadrat, elipsę czy prostokąt.
Kiedyś już coś takiego udało mi się zrobić, jednak w tej chwili za nic w świecie nie potrafię sobie przypomnieć.

Czy ktoś mógłby mi pomóc w rozwiązaniu problemu?

Próbowałem już za pomocą SpeedButton->Glyph->Canvas->Rectangle();
Jednak nie rysuje mi się żadna figura.

Robię to w metodzie OnPaint.

Prosiłbym o ewentualne wskazówki.
Avatar użytkownika
event15
Bladawiec
Bladawiec
 
Posty: 19
Dołączył(a): środa, 27 lutego 2013, 16:44
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: Personal 6
XE 2
Gadu Gadu: 0
    Windows 7Firefox

Re: Button SpeedButton BitBtn i Canvas?

Nowy postprzez Cyfrowy Baron » środa, 27 lutego 2013, 17:03

Można to zrobić, ale efekt nie będzie trwały gdyż przyciski mają własny mechanizm odrysowujący, które będzie zamazywał to co na nich narysujesz:

Plik nagłówkowy np. Unit1.h
KOD cpp:     UKRYJ  
private:
        TControlCanvas *FCanvas;


Plik źródłowy np. Unit1.cpp
KOD cpp:     UKRYJ  
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
   FCanvas = new TControlCanvas;
   FCanvas->Control = SpeedButton1;
}
void __fastcall TForm1::FormPaint(TObject *Sender)
{
 FCanvas->Rectangle(5, 5, SpeedButton1->Width - 5, SpeedButton1->Height - 5);

}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton1MouseMove(TObject *Sender, TShiftState Shift,
                  int X, int Y)
{
FormPaint(Sender);
}


W te przyciski można wstawiać grafikę, więc lepiej stwórz bitmapę z kwadratemi ją tam wstaw.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4727
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Button SpeedButton BitBtn i Canvas?

Nowy postprzez Mironas » środa, 27 lutego 2013, 17:05

Aby rysować na SpeedButton->Glyph musisz mieć coś wpisane do Glyph (w inspektorze obiektów)

W ten sposób możesz tylko rysować po ikonie na przycisku. Jeśli chcesz rysować po całym przycisku przeczytaj poradę Rysowanie na obiektach nie posiadających Canvas.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 446
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 21
Otrzymał podziękowań: 63
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Button SpeedButton BitBtn i Canvas?

Nowy postprzez Cyfrowy Baron » środa, 27 lutego 2013, 17:16

Mironas napisał(a):Jeśli chcesz rysować po całym przycisku przeczytaj poradę Rysowanie na obiektach nie posiadających Canvas.


Ja właśnie przytoczyłem tą poradę i efekt jest niestety nie trwały gdyż przycisk ma własny mechanizm rysujący gdy obiekt zostanie wskazany myszą lub kliknięty.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4727
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Button SpeedButton BitBtn i Canvas?

Nowy postprzez Mironas » środa, 27 lutego 2013, 17:30

Albo wg porady dodajesz Canvas do przycisku i rysujesz po nim. Ale wtedy musisz przerysowywać wszystko w OnPaint formy (bo będzie nietrwałe).

Albo rysujesz po Glyph ale wtedy musisz mieć wcześniej wczytaną ikonę

Albo wstawiasz ikonę z już narysowanym przyciskiem (tak jak radzi Cyfrowy Baron).

Za ten post autor Mironas otrzymał podziękowanie od:
event15
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 446
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 21
Otrzymał podziękowań: 63
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Button SpeedButton BitBtn i Canvas?

Nowy postprzez Cyfrowy Baron » środa, 27 lutego 2013, 17:32

Mironas napisał(a):Ale wtedy musisz przerysowywać wszystko w OnPaint formy (bo będzie nietrwałe).


To niestety nie rozwiązuje problemu, gdyż animacja buttona nie oznacza wywołania zdarzenia OnPaint dla formularza.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4727
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Button SpeedButton BitBtn i Canvas?

Nowy postprzez Mironas » środa, 27 lutego 2013, 17:46

Cyfrowy Baron napisał(a):
Mironas napisał(a):Ale wtedy musisz przerysowywać wszystko w OnPaint formy (bo będzie nietrwałe).

To niestety nie rozwiązuje problemu, gdyż animacja buttona nie oznacza wywołania zdarzenia OnPaint dla formularza.


To trzeba dodatkowo przerysowywać przy OnClick i innych zdarzeniach przy których rysunek znika.
Ale chyba lepsze będą dwa pozostałe sposoby.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 446
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 21
Otrzymał podziękowań: 63
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Button SpeedButton BitBtn i Canvas?

Nowy postprzez Cyfrowy Baron » środa, 27 lutego 2013, 18:05

Mironas napisał(a):To trzeba dodatkowo przerysowywać przy OnClick i innych zdarzeniach przy których rysunek znika.


Próbowałem, ale niestety bez efektu. Jedyne co daje jako taki dobry efekt to zdarzenie OnMouseMove dla buttona i ewentualnie dla formularza. Jednak cały ten pomysł z rysowaniem po buttonach uważam za kiepski. Co właściwie chcesz w ten sposób osiągnąć?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4727
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Button SpeedButton BitBtn i Canvas?

Nowy postprzez event15 » środa, 27 lutego 2013, 18:25

Dziękuję wszystkim za porady.

Co chcę osiągnąć?
Chciałem zrobić swojego painta i potrzebowałem zrobić takie przyciski jak w starym Windowsowym paincie. Ale nie chciałem tego robić za pomocą wczytywania obrazka, tylko szybko sobie narysować Canvas->Rectangle();
Avatar użytkownika
event15
Bladawiec
Bladawiec
 
Posty: 19
Dołączył(a): środa, 27 lutego 2013, 16:44
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: Personal 6
XE 2
Gadu Gadu: 0
    Windows 7Firefox

Re: Button SpeedButton BitBtn i Canvas?

Nowy postprzez Mironas » środa, 27 lutego 2013, 18:38

Ale w Paincie na przyciskach masz zwykłe statyczne ikony. Po co je przerysowywać?
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 446
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 21
Otrzymał podziękowań: 63
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Button SpeedButton BitBtn i Canvas?

Nowy postprzez Cyfrowy Baron » środa, 27 lutego 2013, 18:47

Dokładnie tak! Tam są małe bitmapy, które są zresztą dołączane do środowiska C++Builder. W katalogu: c:\Documents and Settings\All Users\Dokumenty\RAD Studio\9.0\Samples\CPP\VCL\Graphex\ masz przykład takiego programu i zauważ, że tam do przycisków typu TSpeedButton wczytano bitmapy.

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

Re: Button SpeedButton BitBtn i Canvas?

Nowy postprzez event15 » czwartek, 28 lutego 2013, 08:58

Dobrze, zrobię to na bitmapkach, chciałem sobie ułatwić pracę, jednak wyszło na to, że utrudniłem.
Dziękuję Wam za pomoc, temat rozwiązany :)
Avatar użytkownika
event15
Bladawiec
Bladawiec
 
Posty: 19
Dołączył(a): środa, 27 lutego 2013, 16:44
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: Personal 6
XE 2
Gadu Gadu: 0
    Windows 7Firefox

Re: Button SpeedButton BitBtn i Canvas?

Nowy postprzez event15 » piątek, 1 marca 2013, 16:56

Nie chcąc otwierać nowego wątku dopiszę tutaj.

Kod: Zaznacz cały
void __fastcall TPaintExt::OtworzClick(TObject *Sender)
{
      if((licznik_okien < 5) && (OpenDialog->Execute()))
      {
         child[licznik_okien] = new TChild(this);
         child[licznik_okien]->Parent = this;
         child[licznik_okien]->Hint = IntToStr(licznik_okien);


         child[licznik_okien]->Image->Picture->LoadFromFile(OpenDialog->FileName);
         child[licznik_okien]->Caption = OpenDialog->FileName;
         child[licznik_okien]->Top = 5;
         child[licznik_okien]->Left = 5;

         child[licznik_okien]->Width = child[licznik_okien]->Image->Width;
         child[licznik_okien]->Height = child[licznik_okien]->Image->Height;
         licznik_okien++;
      }
      else ShowMessage("Program umożliwia uruchomienie maksymalnie 5 okien");
}


Tworzę w ten sposób maksymalnie pięć okienek MDIChild, które można otwierać w moim Paincie. Problem polega na tym, że w chwili, gdy chcę coś wykonać na aktywnym oknie MDI to nie mam już pojęcia jak wywoływać np w metodzie:
Kod: Zaznacz cały
void __fastcall TPaintExt::SpeedButton1Click(TObject *Sender)
{
   child[i co tu wpisać]->Image->Canvas->Rectangle(10, 10, 100, 100);
}


W miejscu "i co tu wpisać" ma być oczywiście liczba, tylko skąd tą liczbę wyłuskać? Ta liczba musi być liczbą aktualnie wybranego formularza MDIChild.
Avatar użytkownika
event15
Bladawiec
Bladawiec
 
Posty: 19
Dołączył(a): środa, 27 lutego 2013, 16:44
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: Personal 6
XE 2
Gadu Gadu: 0
    Windows 7Firefox

Re: Button SpeedButton BitBtn i Canvas?

Nowy postprzez Mironas » piątek, 1 marca 2013, 17:23

Dostęp do aktywnego okna MDI masz z ActiveMDIChild
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 446
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 21
Otrzymał podziękowań: 63
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Button SpeedButton BitBtn i Canvas?

Nowy postprzez event15 » piątek, 1 marca 2013, 17:32

A w jaki sposób odwołać się do komponentu znajdującego się na takim formularzu?

Kod: Zaznacz cały
child[PaintExt->ActiveMDIChild]->Image->Canvas->Rectangle(10, 10, 100, 100);

oraz
Kod: Zaznacz cały
PaintExt->ActiveMDIChild->Image->Canvas->Rectangle(10, 10, 100, 100);


Nie działają.
Avatar użytkownika
event15
Bladawiec
Bladawiec
 
Posty: 19
Dołączył(a): środa, 27 lutego 2013, 16:44
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: Personal 6
XE 2
Gadu Gadu: 0
    Windows 7Firefox

Następna strona

  • 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 3 gości

cron