Odmalowywanie okna - czy da się zablokować ??

dział ogólny

Odmalowywanie okna - czy da się zablokować ??

Nowy postprzez Corvis » poniedziałek, 30 listopada 2009, 11:45

Witam,

Napisałem sobie program który rysuje mi wykresy i troche mnie denerwuje, że jak przejadę jakimś oknem innym typu kalkulator to program mi odmalowuje wykresy, da się jakoś to zablokować ??

Efekt w załączniku


Pozdrawiam
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    NieznanyNieznana

Re: Odmalowywanie okna - czy da się zablokować ??

Nowy postprzez Cyfrowy Baron » poniedziałek, 30 listopada 2009, 12:50

Można to zablokować na pomocą funkcji: LockWindowUpdate(HWND handle);

blokowanie:
Kod: Zaznacz cały
LockWindowUpdate(Form1->Handle);


odblokowanie:
Kod: Zaznacz cały
LockWindowUpdate(0);


ale nie sądzę, by to rozwiązało Tobie problem.
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
    NieznanyNieznana

Re: Odmalowywanie okna - czy da się zablokować ??

Nowy postprzez banita » poniedziałek, 30 listopada 2009, 13:02

z zalaczonego skrina wyglada ze wlasnie nie odmalowujesz okna. rysujesz wykres na canvasie, zaslaniasz go oknem innego programu i po odslonieciu pozostaje biala powierzchnia gdyz nie odmalowales przyslonietej powierzchni.
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    NieznanyNieznana

Re: Odmalowywanie okna - czy da się zablokować ??

Nowy postprzez polymorphism » poniedziałek, 30 listopada 2009, 13:15

banita napisał(a):z zalaczonego skrina wyglada ze wlasnie nie odmalowujesz okna.

Dokładnie. Opcje są dwie: dać procedurę rysującą w obsługę WM_PAINT (lub VCL-owy odpowiednik obsługi tego komunikatu), albo rysować wykres po TImage.
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
    NieznanyNieznana

Re: Odmalowywanie okna - czy da się zablokować ??

Nowy postprzez banita » poniedziałek, 30 listopada 2009, 13:37

jesli w programie posiadasz opcje skalowania badz przewijania wykresu to TImage odpada. wywolanie procedury rysujacej w onpaint rozwiaze problem.
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    NieznanyNieznana

Re: Odmalowywanie okna - czy da się zablokować ??

Nowy postprzez polymorphism » poniedziałek, 30 listopada 2009, 14:23

jesli w programie posiadasz opcje skalowania badz przewijania wykresu to TImage odpada.

Nie widzę przeciwwskazań. Bo jaką widzisz różnicę miedzy rysowaniem przy pomocy kontekstu okna a rysowaniem po bitmapie kontekstem pamięciowym? Ja nie widzę żadnej różnicy.

Jedyny problem jaki może się pojawić jest taki, że każde narysowanie kreski/kropki/whatever może prowokować pełne odrysowanie TImage na oknie, co spowolni rysowanie całego wykresu. Nie pamiętam czy jest taka możliwość, ale być może da się to odświeżanie zablokować na czas rysowania wykresu.
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
    NieznanyNieznana

Re: Odmalowywanie okna - czy da się zablokować ??

Nowy postprzez Corvis » poniedziałek, 30 listopada 2009, 21:13

Dzięki za odpowidzi.

Nie mogę rysować po TImage czy nawet po PaintBoxie bo mi zabije system :) Program to oscyloskop n kanalowy którego zakres działania w czasie to 1 mikrosekunda więc nie mogę sobie pozowlić na żadne zwolnienie rysowania. Rysuje go na bmp potem kopjuje ja na PaintBoxa.

Spróbuje zablokować to funkcją od Barona zobaczymy. Odezwę się jak wyszło


pozdrawiam
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    NieznanyNieznana

Re: Odmalowywanie okna - czy da się zablokować ??

Nowy postprzez polymorphism » poniedziałek, 30 listopada 2009, 21:49

Spróbuje zablokować to funkcją od Barona zobaczymy.

Nie wyjdzie, bo twoim problemem jest brak odrysowania okna.

Rysuje go na bmp potem kopjuje ja na PaintBoxa.

Ta sama idea, za którą stoi pomysł z TImage, tylko te zastrzeżenia, o których pisałem... trzeba by po prostu sprawdzić. A jeśli chodzi o paint box'a, bitmapę powinieneś kopiować w TPaintBox::OnPaint - zapewne tego nie robisz.

Program to oscyloskop n kanalowy którego zakres działania w czasie to 1 mikrosekunda więc nie mogę sobie pozowlić na żadne zwolnienie rysowania.

Te mikrosekundy są mało istotne, bo na systemie takim jak windows i tak nie uzyskasz tak małych czasów. Tylko buforowanie wchodzi w grę.
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
    NieznanyNieznana

Re: Odmalowywanie okna - czy da się zablokować ??

Nowy postprzez Cyfrowy Baron » poniedziałek, 30 listopada 2009, 23:12

Niestety polymorphism ma tym razem absolutną rację. Blokowanie odrysowania jest dokładnie odwrotne do Twoich potrzeb.

Piszesz:
Nie mogę rysować po TImage czy nawet po PaintBoxie bo mi zabije system
[...]
Rysuje go na bmp potem kopjuje ja na PaintBoxa.


To jeszcze gorzej. Jeżeli użyjesz obiektu TImage i będziesz rysował po jego klasie TBitmap to oszczędzisz czas potrzebny na kopiowanie:

Kod: Zaznacz cały
Image1->Picture->Bitmap->Canvas->...funkcja rysująca


jak widzisz niczego nie trzeba kopiować a obiekt Image sam zadba o odrysowywanie, musisz jednak funkcje rysującą umieścić w zdarzeniu OnPaint.

Jeszcze szybciej będzie jeżeli użyjesz obiektu PaintBox i będziesz rysował po jego klasie TCanvas, ale też w zdarzeniu OnPaint.

Kod: Zaznacz cały
PaintBox1->Canvas->...funkcja rysująca


Możesz rysować po każdym obiekcie posiadającym klasę TCanvas, ale musisz posłużyć się zdarzeniem OnPaint.

Nie musisz koniecznie posługiwać się zdarzeniem OnPaint obiektu Image czy też PaintBox. Możesz rysować np. po Image a kod odrysowujący możesz umieścić w zdarzeniu OnPaint formularza.

Mikrosekunda jest równa jednej milionowej sekundy: TeX: 1 \mu s = \frac{1}{1 000 000} s
Windows odlicza z dokładnością do iluś tam milisekund. Milisekunda to jedna tysięczna sekundy.
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
    NieznanyNieznana

Re: Odmalowywanie okna - czy da się zablokować ??

Nowy postprzez Corvis » poniedziałek, 30 listopada 2009, 23:36

Dzięki sprawdzę :)
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    NieznanyNieznana


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 5 gości