CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Własny kursor myszy - problem

Własny kursor myszy - problem

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Własny kursor myszy - problem

Nowy postprzez Corvis » poniedziałek, 6 grudnia 2010, 14:03

Witam,

Rysuje sobie własny wskaźnik myszy w postaci 2 lini PIONOWEJ i POZIOMEJ XY kod wygląda tak:
MouseX i MouseY na starcie są -1.

KOD cpp:     UKRYJ  
if( X > LMargin && X < this->Width-RMargin && Y > Margines && Y < this->Height-Margines) {
                if(this->Cursor != crNone) this->Cursor = crNone;
                this->Canvas->Pen->Color = clSilver;
                this->Canvas->Pen->Mode = pmXor;

                if( MouseX >= 0 && MouseY >= 0 ) {
                        this->Canvas->MoveTo(MouseX, Margines);
                        this->Canvas->LineTo(MouseX, this->Height-Margines);
                        this->Canvas->MoveTo(LMargin, MouseY);
                        this->Canvas->LineTo(this->Width-RMargin, MouseY);
                }

                this->Canvas->MoveTo(X, Margines);
                this->Canvas->LineTo(X, this->Height-Margines);
                this->Canvas->MoveTo(LMargin, Y);
                this->Canvas->LineTo(this->Width-RMargin, Y);

                MouseX = X; // Przypisanie nowych wartosci
                MouseY = Y;
        } else if(this->Cursor != crArrow) {
                this->Cursor = crArrow;
        }
 


Problem moj polega na tym, gdy otworze np 2 forme na oknie i potem ją zamkne zostaje mi stara pozycja kursora i zniknie dopiero po ponowym odmalowaniu okna :\

Efekt jak na screenach
Czerwony to śmieć którego nie powinno być.

Ma ktoś jakiś pomysł na likwidację tego efektu ???

Pozdrawiam i z góry dzieki za pomoc
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
    Windows VistaChrome

Re: Własny kursor myszy - problem

Nowy postprzez polymorphism » poniedziałek, 6 grudnia 2010, 14:42

Hmm, może zrób obsługę WM_SETFOCUS / WM_KILLFOCUS (oczywiście mowa o VCL-owskim odpowiedniku tych zdarzeń).
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: Własny kursor myszy - problem

Nowy postprzez Cyfrowy Baron » poniedziałek, 6 grudnia 2010, 18:39

Nie rozumiem problemu, opisz go bardziej obrazowo, albo dołącz projekt.
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: Własny kursor myszy - problem

Nowy postprzez Corvis » wtorek, 7 grudnia 2010, 14:05

Dołączam exe testowego.

Problem można wywołać tak:

odpalić exe poruszac myszka po formie, zrobic np Alt + Tab żeby na tą moją forme przywołać okno jakieś i i potem wrócić na okno z moją formą i ruszyć myszką ten mój rysowany kuror pozostawi ślad. W załączniku dodatkowe screeny.

Po prostu mój kursor rysuje się w pozycji w której był przed przywołaniem okna na formę gdy okno znika.

Mam nadzieję, że teraz jest jasno :-)

pzdr,
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
    Windows VistaChrome

Re: Własny kursor myszy - problem

Nowy postprzez Cyfrowy Baron » wtorek, 7 grudnia 2010, 14:45

Tak, teraz rozumiem. Problem polega na tym, że zmieniasz tryb pędzla na pmXor - wymazywanie - prawidłowo, ale nie widzę nigdzie kodu przywracającego styl pędzla pmCopy. Przywrócenie pędzla powinno nastąpić w chwili, gdy okno programu jest dezaktywowane, trzeba więc przechwycić komunikat o dezaktywacji okna. Podawałem taki kod przy okazji porady: total comander w builderze c++. Musisz po przechwyceniu komunikatu o dezaktywacji okna przywrócić styl pióra:

KOD cpp:     UKRYJ  
void __fastcall TForm1::GetActiveApp(TMessage &Msg)
{
 if(Msg.Msg == WM_ACTIVATEAPP && Msg.WParam == FALSE)
 {
  this->Canvas->Pen->Mode = pmCopy;
 }

 ActiveApp(Msg);
}
Musisz to sprawdzić, ale przed zmianą trybu pędzla konieczne jest wymazanie linii, które narysowałeś. Ponieważ jednak umieszczasz kod w jednej funkcji, to konieczne może okazać się przepisanie całego kodu. Gdybyś dzielił kod na bloki-funkcje, to zadanie byłoby prostsze.
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: Własny kursor myszy - problem

Nowy postprzez Cyfrowy Baron » wtorek, 7 grudnia 2010, 15:27

Właściwie to przywracanie stylu pędzla nie jest konieczne, jeżeli tylko rysujesz w oknie. Niemniej jednak przed dezaktywacją okna musisz wymazać linie.
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: Własny kursor myszy - problem

Nowy postprzez Corvis » wtorek, 7 grudnia 2010, 20:32

Hmmm,

Zrobiłem z rysowania kursora funkcję tak jak radziłeś:

KOD cpp:     UKRYJ  
void __fastcall TWykresy::MalowanieKursorow(int X,int Y)
{
        this->Canvas->MoveTo(X, Margines);
        this->Canvas->LineTo(X, this->Height-Margines);

        this->Canvas->MoveTo(LMargin, Y);
        this->Canvas->LineTo(this->Width-RMargin, Y);
}
Kod OnMouseMove wygląda teraz :

KOD cpp:     UKRYJ  
void __fastcall TWykresy::MyMouseMove(TObject* Sender,TShiftState Shift, int X, int Y) {  
        if( X > LMargin && X < this->Width-RMargin && Y > Margines && Y < this->Height-Margines) {

                if(this->Cursor != crNone) this->Cursor = crNone;

                this->Canvas->Pen->Color = clSilver;
                this->Canvas->Pen->Mode = pmXor;

                if(MouseX >= 0 && MouseY >= 0)  MalowanieKursorow(MouseX,MouseY); // Zamalowanie starego
                MalowanieKursorow(X,Y); // Namalowanie nowego

                MouseX = X; // Przypisanie biezacej Wartosci X
                MouseY = Y; // Przypisanie biezacej Wartosci Y

        } else if(this->Cursor != crArrow) this->Cursor = crArrow;
}


No i teraz złapałem takie zdarzenia jak: FormDeactivate czy ApplicationDeacvivate w których wykonuje zamalowanie starej pozycji linii czyli:

KOD cpp:     UKRYJ  
 MalowanieKursorow(MouseX,MouseY); // Zamalowanie starego  


No i faktycznie kursor znika, tylko jak znowu forma staje się aktywna to znowu mam taki sam efekt, jak tylko rusze myszą wpierw kursor maluje się tam gdzie był wcześniej :twisted: Próbowałem zerować wartości MouseX i MouseY po zamalowaniu starego ale to nic nie daje czyli robiłem w tych 2 zdarzeniach deactivate:
KOD cpp:     UKRYJ  
 MalowanieKursorow(MouseX,MouseY); // Zamalowanie starego
MouseX = -1;
MouseY = -1;


No i wynika z tego, że jak teraz wykona się MouseMove to nie powinien ich namalować bo są mniejsze od zera. Powinien od razu namalować nową pozycję. Dlaczego jest inaczej :roll:
"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
    Windows VistaChrome

Re: Własny kursor myszy - problem

Nowy postprzez Cyfrowy Baron » wtorek, 7 grudnia 2010, 22:31

Po dezaktywacji okna program przestaje pobierać aktualne położenie wskaźnika myszy, więc po aktywacji ma w pamięci stare koordynaty i rysuje w oparciu o te stare koordynaty, a nie nowe. Po przechwyceniu komunikatu o aktywacji okna powinieneś pobrać nowe koordynaty myszki i jeszcze raz wymazać stare linie.

Tak wogóle to mógłbyś wrzucić ten testowy program, by można było przeprowadzić jakiś test.
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: Własny kursor myszy - problem

Nowy postprzez Corvis » wtorek, 7 grudnia 2010, 23:50

EDIT:

W załączniku zrobiłem na szybko program do testów
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
    Windows VistaChrome

Re: Własny kursor myszy - problem

Nowy postprzez Cyfrowy Baron » środa, 8 grudnia 2010, 11:23

Postanowiłem zrobić to jednak po swojemu, gdyż zbyt wiele musiałbym Tobie tutaj tłumaczyć. niżej zamieszczam kod - przeanalizuj go drobiazgowo a zrozumiesz. Przewidując przyszłe problemy jakie mogą wyniknąć, dodałem również to, czego jeszcze nie przewidziałeś, a mianowicie problemy ze zmianą rozmiaru okna i z jego maksymalizacją. Zwróć uwagę jak uporządkowałem kod. Teraz widać co bierze się z czego. Unikam powtarzających się elementów kodu.
Plik nagłówkowy:
KOD cpp:     UKRYJ  
private:

        void __fastcall DrawLines(void);

        TWndMethod ActiveApp;
        void __fastcall GetActiveApp(TMessage &Msg);

        BOOL fDraw, fFirstDraw;
        TPoint fPoint;
Plik źródłowy:
KOD cpp:     UKRYJ  
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 ActiveApp = this->WindowProc;
 this->WindowProc = GetActiveApp;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::GetActiveApp(TMessage &Msg)
{
 /* Przechwytywanie komunikatów o aktywacji i dezaktywacji okna */
 if(Msg.Msg == WM_ACTIVATEAPP)
 {
  fPoint.x = 0;
  fPoint.y = 0;

  if(Msg.WParam == TRUE)
  {
    fDraw = true;
    fFirstDraw = true;
  }
  else
  {
   fDraw = false;

   DrawLines();

   this->Canvas->Pen->Mode = pmCopy;
  }
 }

 /* Przechwytywanie komunikatów o zmianie rozmiaru okna */
 if(Msg.Msg == WM_SIZE)
 {
  if( Msg.WParam == SIZE_MAXIMIZED || Msg.WParam == SIZE_RESTORED )
  {
   fFirstDraw = true;
   DrawLines();

   this->Canvas->Pen->Mode = pmCopy;
  }
 }


 ActiveApp(Msg);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DrawLines(void)
{
 int hMax = this->ClientHeight;
 int wMax = this->ClientWidth;

 // linia pionowa
 this->Canvas->MoveTo(fPoint.x, 0);
 this->Canvas->LineTo(fPoint.x, hMax);

 // linia pozioma
 this->Canvas->MoveTo(0, fPoint.y);
 this->Canvas->LineTo(wMax, fPoint.y);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X,
          int Y)
{
  if( fDraw )
  {
   this->Canvas->Pen->Mode = pmNotXor;

   if( fFirstDraw == false ) DrawLines(); // wymazanie poprzednich linii

   fPoint.x = X;
   fPoint.y = Y;

   fFirstDraw = false;

   DrawLines();

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



Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Corvis
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: Własny kursor myszy - problem

Nowy postprzez Corvis » środa, 8 grudnia 2010, 11:28

Dzięki, biorę się za analize.
"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
    Windows VistaChrome

Re: Własny kursor myszy - problem

Nowy postprzez Corvis » wtorek, 14 grudnia 2010, 10:15

Baronie - jeżeli u siebie w aplikacji którą dałeś naciśniesz ikonę maxymilizacji okna to zostają ci kursory podobnie jak na screenie ??? Nic w kodzie nie grzebałem po prostu nacisnąłem ikonę maxymilizacji okna. I co ciekawe jak klikne 2 razy na górny pasek aplikacji - okno się rozszerza ale kursory znikają tak jak być powinno.
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
    Windows VistaChrome

Re: Własny kursor myszy - problem

Nowy postprzez Cyfrowy Baron » wtorek, 14 grudnia 2010, 10:22

Baronie - jeżeli u siebie w aplikacji którą dałeś naciśniesz ikonę maxymilizacji okna to zostają ci kursory podobnie jak na screenie ???


NIE! U mnie linie znikają! I nie nazywaj tego kursorem, gdyż jest to mylące. Kursor to wskaźnik myszy.
Czy w moim programie testowym też masz ten błąd?



W jakim systemie to testujesz. Okno wygląda jak w Windows 98?
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: Własny kursor myszy - problem

Nowy postprzez Cyfrowy Baron » wtorek, 14 grudnia 2010, 10:27

Już znalazłem przyczynę. Problem dotyczy tylko Stylu Klasycznego Windows. Czy można ten problem jakoś rozwiązać? Nie wiem!
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: Własny kursor myszy - problem

Nowy postprzez Corvis » wtorek, 14 grudnia 2010, 10:27

Wyłączyłem wszystkie efekty wizualne VISTY, żeby mieć lepszą wydajność PC - dlatego te okno tak wygląda.


Właśnie błąd mam w twoim programie testowym.

Edit: Dokładnie tak, właśnie zmieniłem na styl podstawowy i AERO i działa.
Ostatnio edytowano wtorek, 14 grudnia 2010, 10:30 przez Corvis, łącznie edytowano 1 raz
"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
    Windows VistaChrome

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 1 gość

cron