CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - GDI+, DrawImage i klawisze Alt/Shift/Ctrl

GDI+, DrawImage i klawisze Alt/Shift/Ctrl

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

GDI+, DrawImage i klawisze Alt/Shift/Ctrl

Nowy postprzez Mironas » sobota, 20 lutego 2021, 13:17

Biblioteka GDI+
Najprostsza możliwa funkcja rysująca obrazek na 'Image1', w pozycji myszki.
Funkcja wywoływana w Image1_OnMouseMove, czyli za każdym razem gdy ruszę myszką na Image1 to obrazek jest rysowany w nowym miejscu.
KOD cpp:     UKRYJ  
void __fastcall TForm1::Image1_OnMouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
{
  Rysowanie(X, Y);
}
//---------------------------------------------------------------------------
void TForm1::Rysowanie(int x, int y)
{
  GGraphics Graf (Image1->Canvas->Handle);
  Graf.Clear(GYellow);

  GRect Rect1 (0, 0, iw, ih);
  GRect Rect2 (x, y, 300, 200);
  Graf.DrawImage(IMAGE, Rect2, Rect1);

  Image1->Repaint();
}
 

Całość działa dość szybko, aż do momentu gdy nacisnę Alt, Shift lub Ctrl. Wtedy nagle zaczyna się niemiłosiernie mulić. Mogę zrobić parę zygzaków myszką a potem, w zwolnionym tempie oglądać jak program odtwarza tę ścieżkę przez kilka następnych sekund. Zaznaczam, że w programie w ogóle nie obsługuję klawiszy Alt/Shift/Ctrl. Zrobiłem specjalny mini-program, który wyłącznie robi to co opisałem, i sytuacja jest dokładnie taka jak powyżej.

Pytania:
1. Dlaczego tak się dzieje?
2. Jak tego uniknąć?

Próba "wyłączenia" klawiszy Shift/Ctrl jak poniżej, przy włączonym KeyPreview, nie daje rezultatu.
KOD cpp:     UKRYJ  
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
  if ( Key==VK_SHIFT || Key==VK_CONTROL )
    Key = 0;
}
 
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 493
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 23
Otrzymał podziękowań: 71
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: GDI+, DrawImage i klawisze Alt/Shift/Ctrl

Nowy postprzez polymorphism » niedziela, 21 lutego 2021, 11:42

Przenieś rysowanie do on-paint kontrolki, a w mouse-move daj jedynie komendę odświeżającą okno.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2271
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 211
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: GDI+, DrawImage i klawisze Alt/Shift/Ctrl

Nowy postprzez lukagrom » niedziela, 21 lutego 2021, 11:54

To chyba nie zależy od tej biblioteki, tylko to jakiś feler "borlandowskiego Canvasa".
Dla odmiany w tradycyjnym ujęciu zrobiłem podobnie:
KOD cpp:     UKRYJ  
void __fastcall TForm1::Rysowanie(int x, int y)
{
  TCanvas *Canv1;
  Canv1=Image1->Canvas;
  Canv1->Brush->Style=bsSolid;
  Canv1->Brush->Color=clRed;
  Canv1->Rectangle(x,y,x+random(x),y+random(y));
}
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X,
                  int Y)
{
 Rysowanie(X,Y);
}

 

I tak samo wciśnięcie powyższych klawiszy funkcyjnych przerywa rysowanie. Ponowne ich kilkukrotne wciśnięcie rysowanie przywraca.
Avatar użytkownika
lukagrom
Intelektryk
Intelektryk
 
Posty: 133
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 9
Otrzymał podziękowań: 5
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    WindowsChrome

Re: GDI+, DrawImage i klawisze Alt/Shift/Ctrl

Nowy postprzez lukagrom » niedziela, 21 lutego 2021, 12:05

Przenieś rysowanie do on-paint kontrolki, a w mouse-move daj jedynie komendę odświeżającą okno.


TImage jest komponentem specyficznym, który nie posiada zdarzenia - on paint, czy podobnych.
Avatar użytkownika
lukagrom
Intelektryk
Intelektryk
 
Posty: 133
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 9
Otrzymał podziękowań: 5
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    WindowsChrome

Re: GDI+, DrawImage i klawisze Alt/Shift/Ctrl

Nowy postprzez polymorphism » niedziela, 21 lutego 2021, 12:12

Fakt. Zapomniałem. Ale niech kombinuje w tym kierunku.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2271
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 211
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: GDI+, DrawImage i klawisze Alt/Shift/Ctrl

Nowy postprzez lukagrom » wtorek, 23 lutego 2021, 14:33

U mnie chyba udało się rozwiązać problem blokowania rysowania przypisując adresy klawiszy funkcyjnych innemu adresowi klawisza, który wciśnięty nie przerywa malunku. Posłużyłem się adresem spacji - ox20.
KOD cpp:     UKRYJ  
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)

{
 if(Key==VK_LSHIFT)
  Key=0x20;
 if(Key==VK_SHIFT)
  Key=0x20;
 if(Key==VK_CONTROL)
  Key=0x20;
 if(Key==VK_MENU)
  Key=0x20;
 }
 
Avatar użytkownika
lukagrom
Intelektryk
Intelektryk
 
Posty: 133
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 9
Otrzymał podziękowań: 5
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    WindowsChrome

Re: GDI+, DrawImage i klawisze Alt/Shift/Ctrl

Nowy postprzez Mironas » wtorek, 23 lutego 2021, 15:49

polymorphism napisał(a):Przenieś rysowanie do on-paint kontrolki, a w mouse-move daj jedynie komendę odświeżającą okno.

lukagrom napisał(a):U mnie chyba udało się rozwiązać problem blokowania rysowania przypisując adresy klawiszy funkcyjnych innemu adresowi klawisza

Niestety oba sposoby nie dają rezultatu.

Za to chyba można obejść problem, robiąc 2 rzeczy:
1. Jakaś zmienna za pomocą której pilnuję, aby w OnMouseMove nie wywoływać ponownie rysowania dopóki poprzednie się nie skończyło.
2. Na początku każdego rysowania wykonać Application->ProcessMessages();

Trzeba tylko pilnować, aby ostatnie rysowanie po zakończeniu ruchu myszki się wykonało.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 493
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 23
Otrzymał podziękowań: 71
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome


  • 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