• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Obsługa zdarzeń na przyciśniecie przycisku myszy oraz na "puszczenie" tego klawisza. [Borland C++]

Object Storage Arubacloud
0 głosów
685 wizyt
pytanie zadane 2 lipca 2016 w C i C++ przez Raffallo Początkujący (290 p.)
Witam,

uczę się programować i z programowania w C::B przeszedłem do programowania w Borland C++.

Chciałbym zrobić funkcję przesuwania mapy/rysunku w taki sposób, że klikam w danym miejscu i przesuwam w inne miejsce, gdzie puszczam przycisk myszy, a cały obrazek się przesuwa.

Niestety problemem jest, że nie wiem w jaki sposób uzyskać jakiś efekt przy przytrzymaniu klawisza oraz przy jego puszczeniu w programie Borland C++, czy ktoś mógłby udzielić jakiejś porady?

Dodam ponownie, iż się uczę dopiero :)

Z góry dziękuję za pomoc.

1 odpowiedź

0 głosów
odpowiedź 2 lipca 2016 przez JAKUBW Nałogowiec (33,470 p.)
wybrane 2 lipca 2016 przez Raffallo
 
Najlepsza
Możesz to zrobić na 2 sposoby. Pierwszy prostszy, ale gorzej działający i odbierajacy pewne funkcje, który trzeba tylko włączyć i gotowe. Jest on wbudowany w Builder. Drugi sposób to taki, że sam wszystko piszesz. Ja gdy robiłem edytor map typu właśnie przesuwania elementów to sam napisałem to przesuwanie. Też Ci polecam tak zrobić.
komentarz 2 lipca 2016 przez Raffallo Początkujący (290 p.)
Cały problem polega na tym, że nie wiem jak sprawdzać, kiedy dany klawisz został naciśnięty lub puszczony, bo całą resztę wiem chyba jak wykonać, a w builderze nie znalazłem takiej opcji :(
komentarz 2 lipca 2016 przez JAKUBW Nałogowiec (33,470 p.)
To zdarzenia OnMouseDown oraz OnMouseUP.
komentarz 2 lipca 2016 przez Raffallo Początkujący (290 p.)
edycja 2 lipca 2016 przez Raffallo
A jeszcze mógłbyś mi tylko powiedzieć jak sprawdzić, który z przycisków myszy został kliknięty?
komentarz 3 lipca 2016 przez JAKUBW Nałogowiec (33,470 p.)

Możesz to zrobić korzystając z dwóch klas, które dostajesz w funkcji:

  1. TMouseButton (http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Controls_TMouseButton.html)
  2. TShiftState (http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Classes_TShiftState.html

A to przykład użycia tego drugiego:

void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
        if(Shift.Contains(ssMiddle))ShowMessage("Srodkowy");
        if(Shift.Contains(ssLeft))ShowMessage("Lewy");
        if(Shift.Contains(ssRight))ShowMessage("Prawy");
}

 Gdybyś miał jeszcze jakieś problemy i zapytania to pisz.

komentarz 3 lipca 2016 przez Raffallo Początkujący (290 p.)
Super, działa! :) dziękuję bardzo za pomoc :)

teraz muszę się jeszcze uporać z jednym małym problemem i czas brać się za bazę danych :)
komentarz 3 lipca 2016 przez JAKUBW Nałogowiec (33,470 p.)
Proszę bardzo. Jak trzeba służę pomocą, bo sam to przerabiałem.
komentarz 3 lipca 2016 przez Raffallo Początkujący (290 p.)
a czy zawsze (poza przypadkiem, gdy okno jest zmaksymalizowane) jest tak, że ramka wokół okienka ma 8 pixeli, a na górze dodatkowo dochodzi jeszcze 22 pix ?

Z przesuwaniem już sobie poradziłem dzięki Tobie, tylko teraz robię przybliżanie i oddalanie, to też już w sumie mam zrobione, ale chciałem zrobić żeby "punkt zaczepienia" przy przybliżaniu lub oddalaniu nie znajdował się w początku układu pixelowego, ale w miejscu, w którym znajduje się aktualnie kursor. Problem pojawił się, gdy  pobierałem pozycję kursora z "TPoint &MousePos", ponieważ te wsp miały odniesienie do całego ekranu, a nie mojej mapki. W związku z tym musiałem odpowiednio zredukować te współrzędne o położenie programu oraz grubość ramki, tylko chciałem się upewnić, czy takowa ramka ma zawsze tą samą grubość :)

P.S.: z jakiej bazy danych skorzystać? :)
komentarz 3 lipca 2016 przez JAKUBW Nałogowiec (33,470 p.)
Na pewno nie zawsze wynosi tyle, ponieważ są różne systemy, różne kompozycje ekranu itd. Ale przecież zdarzenia OnMouseDown, OnMouseUp oraz OnMouseMove dają Ci X. Wystarczy jeszcze dodać Left obiektu który jest klikany i masz lokalizację (względem parenta na którym leży).
komentarz 3 lipca 2016 przez Raffallo Początkujący (290 p.)
to wiem, ale przy przybliżaniu i oddalaniu korzystam z OnMouseWheelDown, OnMouseWheelUp i OnMouseWheel, gdzie takiej lokalizacji neistety nie podają
komentarz 3 lipca 2016 przez JAKUBW Nałogowiec (33,470 p.)
Przybliżasz całą planszę? A ma planszy masz TImage?
komentarz 3 lipca 2016 przez Raffallo Początkujący (290 p.)
mam TPaintBox, który przyjmuje rozmiar TFrame, ale nie wiem czy o to pytałeś.

A przybliżając lub oddalając zmieniam po prostu skalę i jak by rysuję na nowo z nową skalą.
komentarz 3 lipca 2016 przez JAKUBW Nałogowiec (33,470 p.)
Aha, no o to pytałem. Ale ja ci już nie pomogę. Bo w ten sposób nie robiłem. Powodzenia.
komentarz 4 lipca 2016 przez maly Nałogowiec (37,190 p.)
W zdarzeniach OnMouseWheel pozycja myszy jest w zmiennej MousePos.
komentarz 4 lipca 2016 przez Raffallo Początkujący (290 p.)
tak, wiem o tym, ale jak wspomnialem ta pozycja odnosi sie do pozycji na calym ekranie, a ja potrzebuje tylko pozycje na moim TPaintBox
komentarz 4 lipca 2016 przez maly Nałogowiec (37,190 p.)
void __fastcall TForm1::FormMouseWheel(TObject *Sender, TShiftState Shift,
      int WheelDelta, TPoint &MousePos, bool &Handled)
{
	TPoint position = PaintBox1->ScreenToClient(MousePos);
}

 

Podobne pytania

0 głosów
1 odpowiedź 167 wizyt
0 głosów
1 odpowiedź 109 wizyt
0 głosów
1 odpowiedź 698 wizyt
pytanie zadane 4 lipca 2016 w C i C++ przez Raffallo Początkujący (290 p.)

92,597 zapytań

141,446 odpowiedzi

319,722 komentarzy

61,981 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...