Turbo c++ Blokowanie odświeżania

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Turbo c++ Blokowanie odświeżania

Nowy postprzez Adaminho » poniedziałek, 24 maja 2010, 09:58

Witam, mam pewien kłopot. Napisałem program rysujący prostokąty. Po narysowaniu bryły, kiedy zminimalizuje program, a potem maksymalizuje, formatka się odświeża, i prostokąt znika. Czy jest jakiś sposób aby zablokować odświeżanie formatki ?
Avatar użytkownika
Adaminho
Bladawiec
Bladawiec
 
Posty: 3
Dołączył(a): poniedziałek, 24 maja 2010, 09:43
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows 7Chrome

Re: Turbo c++ Blokowanie odświeżania

Nowy postprzez Cyfrowy Baron » poniedziałek, 24 maja 2010, 10:10

Blokowanie odświeżania nic tutaj nie da, gdyż nie w tym leży problem.

Po pierwsze i najważniejsze pytanie po czym rysujesz? Z opisu problemu wynika, że nie rysujesz po obiekcie typy TImage, gdyż ten obiekt przechowywałby to co narysowałeś. Inne obiekty, czy to będzie formularz, czy Panel itp. nie przechowują narysowanych elementów, dlatego maja zdarzenia OnPaint. Cokolwiek rysujesz na takich obiektach, to taki kod rysujący musi znajdować się w zdarzeniu OnPaint obiektu na którym rysujesz. Jeżeli obiekt nie posiada zdarzenia OnPaint to umieść ten kod w zdarzeniu OnPaint formularza na którym ten obiekt się znajduje.



PS. Na przyszłość podawaj więcej szczegółow.
To nie jest odpowiedni dział dla tego wątku. Wątek zostanie przeniesiony do działu: Aplikacje graficzne.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
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: Turbo c++ Blokowanie odświeżania

Nowy postprzez Adaminho » poniedziałek, 24 maja 2010, 10:15

Prostokąt jest rysowany po tzw. płótnie Canvas.
Avatar użytkownika
Adaminho
Bladawiec
Bladawiec
 
Posty: 3
Dołączył(a): poniedziałek, 24 maja 2010, 09:43
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows 7Chrome

Re: Turbo c++ Blokowanie odświeżania

Nowy postprzez Cyfrowy Baron » poniedziałek, 24 maja 2010, 10:19

Płótno TCanvas nie posiada własnej kontrolki, musi przynależeć do jakiegoś obiektu, który dziedziczy po klasie TWinControl. Na jakim obiekcie znajduje się to płótno? Po Canvas jakiego obiektu rysujesz lub jakiemu obiektowi przypisujesz płótno Canvas.

W aplikacjach okienkowych jeżeli nie korzystasz z GDI+ to zawsze wykorzystujesz systemowe GDI, a więc w C++ rysujesz zawsze po płótnie typu TCanvas.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
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: Turbo c++ Blokowanie odświeżania

Nowy postprzez Adaminho » poniedziałek, 24 maja 2010, 11:28

To jest przykładowy kod z mojego programu. Rysuje linie kiedy zostanie naciśnięty lewy przycisk myszki, gdy klawisz zostanie puszczony powstaje linia.
Chciałbym się właśnie dowiedzieć, czy da się zapobiec znikaniu tego co się narysowało.


Kod: Zaznacz cały
#include <vcl.h>
#pragma hdrstop

#include "Rysowanie.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{

}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
     TShiftState Shift, int X, int Y)
{
   Canvas->MoveTo(X,Y);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,
     TShiftState Shift, int X, int Y)
{
   Canvas->LineTo(X,Y);
}
Avatar użytkownika
Adaminho
Bladawiec
Bladawiec
 
Posty: 3
Dołączył(a): poniedziałek, 24 maja 2010, 09:43
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows 7Firefox

Re: Turbo c++ Blokowanie odświeżania

Nowy postprzez Cyfrowy Baron » poniedziałek, 24 maja 2010, 11:48

Rysujesz po formularzu.

Kod rysujący musisz umieścić w zdarzeniu OnPaint formularza. Potrzebujesz zmienny prywatnych (plik nagłówkowy np. Unit1.h) do przechowywania wartości X i Y pobranych ze zdarzeń OnMouseDown i OnMouseUp.

plik nagłówkowy np. Unit1.h:
Kod: Zaznacz cały
private:
        
POINT pDownpUp;
 


plik źródłowy np. Unit1.cpp:
Kod: Zaznacz cały

void __fastcall TForm1
::FormMouseDown(TObject *SenderTMouseButton ButtonTShiftState Shift,
          
int Xint Y)
{
 
pDown.X;
 
pDown.Y;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseUp(TObject *SenderTMouseButton ButtonTShiftState Shift,
          
int Xint Y)
{
 
pUp.X;
 
pUp.Y;
 
this->Invalidate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
  
Canvas->MoveTo(pDown.xpDown.y);
  
Canvas->LineTo(pUp.xpUp.y);
}
 





Jeżeli nie chcesz się posługiwać zdarzeniem OnPaint to posłuż się obiektem typu TImage. Cokolwiek narysujesz na Canvas obiektu Image zostanie zapamiętane nawet po odświeżeniu okna programu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
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


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

cron