Jak obsłużyć mysz wraz z kółkiem?

Jak obsłużyć mysz wraz z kółkiem?
DA
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 2 lata
  • Postów:37
0

Witam.
Próbuję obsłużyć jakkolwiek mysz w Pascalu przy użyciu biblioteki "mouse" - ta chyba była standardem.
Dzieją się dziwne rzeczy:

  • DetectMouse podaje mi, że moja mysz ma 8 przycisków;
  • GetMouseX i GetMouseY zwracają 0 (pewnie nie zwracają nic);
  • w dokumentacji od FreePascala w ogóle nie widzę obsługi kółka myszy.

Mysz niby zainicjowana (InitMouse). Zapytam tak - czy to w ogóle jeszcze działa? Albo: jak obsłużyć mysz (włącznie z kółkiem) we FreePascalu (bez bibliotek Delphi lub Lazarusa)? Całe lata to przecież robili.

Pozdrawiam,
Darek.

edytowany 1x, ostatnio: Riddle
ZD
Yyyy mówisz o gołym DOS czy coś podobnego ????
DA
Normalny FreePascal w Windows. Otwiera się normalne okno windowsowe. Tylko bez tych VCL/LCL i wszystkich tych klas T Delphi.
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 7 godzin
  • Postów:2067
2

@darekdarek bez VCL/LCL ? Tylko że wtedy sam musisz skomunikować się z systemem operacyjnym.
Dużo pracy przed tobą , zrobić okno w Api Win32 a potem oprogramować myszkę https://learn.microsoft.com/en-us/windows/win32/inputdev/mouse-input


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:minuta
  • Lokalizacja:Tuchów
  • Postów:12163
2

Skoro nie chcesz VCL/LCL, to skorzystaj z Win32 API — obsłuż komunikat WM_MOUSEWHEEL.

darekdarek napisał(a):

Próbuję obsłużyć jakkolwiek mysz w Pascalu przy użyciu biblioteki "mouse" - ta chyba była standardem.

Tak, ale nie dla aplikacji graficznych, a dla konsolowych. Masz to nawet w dokumentacji napisane:

Reference for unit Mouse:

The Mouse unit implements a platform independent mouse handling interface. It is implemented identically on all platforms supported by Free Pascal and can be enhanced with custom drivers, should this be needed. It is intended to be used only in text-based screens, for instance in conjunction with the Keyboard and Video unit. No support for graphical screens is implemented, and there are (currently) no plans to implement this.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 3x, ostatnio: flowCRANE
DA
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 2 lata
  • Postów:37
0

OK, nie planuję używania VCL/LCL bo potrzebuję tylko obsługę myszy. Grafikę chcę rysować modułem "graph". Nie potrzebuję kontrolek ani tym bardziej openGL itp.
Czego użyć do obsługi myszy? Może jest jakaś inna biblioteka, którą mógłbym dołączyć do FreePascala?

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:minuta
  • Lokalizacja:Tuchów
  • Postów:12163
2
darekdarek napisał(a):

Grafikę chcę rysować modułem "graph".

Moduł Graph jest dostępny tylko dla zapewnienia możliwości kompilacji bardzo starych programów i nie nadaje się w ogóle do tworzenia nowego oprogramowania. Napisz może co to za projekt będzie — łatwiej będzie coś doradzić.

Nie potrzebuję kontrolek ani tym bardziej openGL itp.

To zależy co konkretnie robisz. Jeśli celujesz w coś, co będzie wymagało renderowania bardziej skomplikowanych rzeczy, to jednak akceleracja sprzętowa będzie potrzebna. W przeciwnym razie zostaniesz z rendererem software'owym, którego wydajność będzie setki razy mniejsza.

Czego użyć do obsługi myszy? Może jest jakaś inna biblioteka, którą mógłbym dołączyć do FreePascala?

Nie napisałeś co dokładnie robisz, więc trudno doradzić. Jeśli rozpoczynasz projekt gry, to polecam bibliotekę SDL, bo z wielu powodów jest to świetny wybór. Jest ona napisana w czystym C w sposób strukturalno-proceduralny (żadnego OOP), jest bardzo lekka i szybka, zapewnia wygodną obsługę myszy, klawiatury i joysticków, daje dostęp do akcelerowanego renderera oraz dość zaawansowany mikser audio, dzięki którym możesz łatwo i wydajnie renderować, a także odtwarzać muzykę i mnóstwo efektów dźwiękowych jednocześnie. Wszystko jest opakowane w proste do użycia funkcje — nie trzeba ręcznie rzeźbić kupy kodu, aby coś wyrenderować czy odpalić dźwięk.

W SDL-u, urządzenia wejścia (i nie tylko) obsługuje się podobnie jak w Win32 API, czyli na podstawie dostarczanych komunikatów (zwanych zdarzeniami). Jeśli preferujesz paradygmat proceduralny, to na pewno się w tym odnajdziesz.

W razie czego, gdybyś potrzebował pomocy z podłączeniem SDL-a do Lazarusa, to służę pomocą — roboty nie ma z tym zbyt wiele, raptem kilka kliknięć. Sam pracuję aktualnie nad projektem gry, pisanej w formie struktoralno-proceduralnej we Free Pascalu i z użyciem SDL-a, więc co nieco już na ten temat wiem.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 3x, ostatnio: flowCRANE
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 7 godzin
  • Postów:2067
2

@darekdarek: Nie słuchasz rad ,
@furious programming: w sumie CI opisał dokłądnie co masz zrobić

Tu masz przykład na bazie https://stackoverflow.com/questions/10180016/creating-forms-without-using-vcl
dopisałem dwie linijki

Kopiuj
program Project12;

{$mode delphi}{$H+} // pierwsza dopisana 

uses
  Windows,
  Messages,
  SysUtils;

var
  Msg        : TMSG;
  LWndClass  : TWndClass;
  hMainHandle: HWND;
  hButton    : HWND;
  hStatic    : HWND;
  hEdit      : HWND;
  hFontText  : HWND;
  hFontButton: HWND;

procedure ReleaseResources;
begin
  DestroyWindow(hButton);
  DestroyWindow(hStatic);
  DestroyWindow(hEdit);
  DeleteObject(hFontText);
  DeleteObject(hFontButton);
  PostQuitMessage(0);
end;

function WindowProc(hWnd,Msg:Longint; wParam : WPARAM; lParam: LPARAM):Longint; stdcall;
var
  s: string;
begin
  case Msg of
      WM_COMMAND: if lParam = hButton then
                    MessageBox(hMainHandle,'You pressed the button Hello', 'Hello',MB_OK or MB_ICONINFORMATION);
      WM_DESTROY: ReleaseResources;
      WM_MOUSEWHEEL: SetWindowText(hWnd,pchar(format('wParam:%d  X:%d Y:%d', [wParam, lParam AND $FFFF, lParam SHR 16 ]))); //druga dopisana
  end;
  Result:=DefWindowProc(hWnd,Msg,wParam,lParam);
end;

begin
  //create the window
  LWndClass.hInstance := hInstance;
  with LWndClass do
    begin
      lpszClassName := 'MyWinApiWnd';
      Style         := CS_PARENTDC or CS_BYTEALIGNCLIENT;
      hIcon         := LoadIcon(hInstance,'MAINICON');
      lpfnWndProc   := @WindowProc;
      hbrBackground := COLOR_BTNFACE+1;
      hCursor       := LoadCursor(0,IDC_ARROW);
    end;

  RegisterClass(LWndClass);
  hMainHandle := CreateWindow(LWndClass.lpszClassName,'Window Title', WS_CAPTION or WS_MINIMIZEBOX or WS_SYSMENU or WS_VISIBLE, (GetSystemMetrics(SM_CXSCREEN) div 2)-190,
      (GetSystemMetrics(SM_CYSCREEN) div 2)-170, 386,200,0,0,hInstance,nil);

  //Create the fonts to use
  hFontText := CreateFont(-14,0,0,0,0,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,VARIABLE_PITCH or FF_SWISS,'Tahoma');
  hFontButton := CreateFont(-14,0,0,0,0,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,VARIABLE_PITCH or FF_SWISS,'Tahoma');

  //create the static
  hStatic:=CreateWindow('Static','This is static text, like a TLabel',WS_VISIBLE or WS_CHILD or SS_LEFT, 10,10,360,44,hMainHandle,0,hInstance,nil);
  SendMessage(hStatic,WM_SETFONT,hFontText,0);

  //create the edit
  hEdit:=CreateWindowEx(WS_EX_CLIENTEDGE,'Edit','This a Edit like and TEdit', WS_VISIBLE or WS_CHILD or ES_LEFT or ES_AUTOHSCROLL,10,35,360,23,hMainHandle,0,hInstance,nil);
  SendMessage(hEdit,WM_SETFONT,hFontText,0);

  //create the button
  hButton:=CreateWindow('Button','Hello', WS_VISIBLE or WS_CHILD or BS_PUSHBUTTON or BS_TEXT, 10,130,100,28,hMainHandle,0,hInstance,nil);
  SendMessage(hButton,WM_SETFONT,hFontButton,0);

  //message loop
  while GetMessage(Msg,0,0,0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;

end.

--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
DA
Dzięki, oczywiści odezwę się jak uda mi się to przetestować, szczególnie "wheel".
DA
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 2 lata
  • Postów:37
0
furious programming napisał(a):
darekdarek napisał(a):

To zależy co konkretnie robisz. Jeśli celujesz w coś, co będzie wymagało renderowania bardziej skomplikowanych rzeczy, to jednak akceleracja sprzętowa będzie potrzebna. W przeciwnym razie zostaniesz z rendererem software'owym, którego wydajność będzie setki razy mniejsza.

Będę klepał grafikę 2D. Z "własnoręcznych" wektorów i bitmap (skalowanych, obracanych). Na akcelerację sprzętową nie zwróciłem uwagi, to fakt, bo zakładałem, że żeby skorzystać trzeba pisać w opengl/directX.

W razie czego, gdybyś potrzebował pomocy z podłączeniem SDL-a do Lazarusa, to służę pomocą — roboty nie ma z tym zbyt wiele, raptem kilka kliknięć. Sam pracuję aktualnie nad projektem gry, pisanej w formie struktoralno-proceduralnej we Free Pascalu i z użyciem SDL-a, więc co nieco już na ten temat wiem.

Dlaczego wybrałeś SDL? (SDL2?) a nie Allegro5 lub SFML? Tez się nad tym zastanawiałem, ale wydało mi się, że to jakieś kobyły, do tego w wersji standardowej pod C/C++. Tłumaczenie tego na Pascala samo w sobie nie spowalnia działania?

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:minuta
  • Lokalizacja:Tuchów
  • Postów:12163
2
darekdarek napisał(a):

Będę klepał grafikę 2D.

Po to właśnie GPU wymyślono, żeby nie katować CPU. ;)

Z "własnoręcznych" wektorów i bitmap (skalowanych, obracanych).

Wektorów? Masz na myśli grafikę wektorową czy coś innego?

Jeśli chodzi o bitmapy, to masz wiele opcji — własne, software'owe renderowanie (opcja najwolniejsza); GDI, GDI+, które mogą wykorzystywać akcelerację, albo DirectX/OpenGL/Vulkan/Metal, aby pośrednio lub bezpośrednio wykorzystać GPU. Przy czym SDL wszystko opakowuje (a nawet sam wybiera graficzne API), więc stworzenie czy załadowanie bitmapy do pamięci GPU to jedna funkcja, potem wyrenderowanie to też jedna funkcja — np. SDL_RenderCopy(Ex), dowolnego obszaru tekstury, z rozciągnięciem lub bez, z rotacją lub bez.

Na akcelerację sprzętową nie zwróciłem uwagi, to fakt, bo zakładałem, że żeby skorzystać trzeba pisać w opengl/directX.

Jeśli wybierzesz jakąkolwiek bibliotekę multimedialną, to będziesz mógł korzystać z OpenGL/DirectX pośrednio, za pomocą prostych i wygodnych funkcji, bez koniecznosci ręcznego rzeźbienia w OpenGL. Choć jeśli chcesz, możesz nie korzystać z SDL-owego renderera i pisać w czystym OpenGL.

Dlaczego wybrałeś SDL? (SDL2?) a nie Allegro5 lub SFML?

Z wielu powodów — szukałem lekkiego, bardzo wydajnego i niskopoziomowego rozwiązania, z API strukturalno-proceduralnym. Takie wynalazki jak SFML czy raylib odpadają od razu, bo nie dość, że obiektowe, to w dodatku ociężałe. W skrócie, wybór zawęził się do SDL i Allegro, a ostatecznie wybrałem SDL-a, bo przyjemniejsze API i jest to chyba najbardziej popularna biblioteka multimedialna.

Tez się nad tym zastanawiałem, ale wydało mi się, że to jakieś kobyły, do tego w wersji standardowej pod C/C++.

Zależy co nazywasz kobyłą. SDL to kilkaset tysięcy linijek kodu, ale to nie jest VCL, gdzie durna kontrolka dziedziczy milion pól i metod z 20 klas bazowych, a potężny zestaw prostych i szybkich funkcji. Nie ma znaczenia ilu ich użyjesz, samo ich istnienie w DLL nie powoduje żadnego narzutu wydajnościowego.

Testowaliśmy kiedyś różne podejścia — SDL był najszybszy, Allegro wypadłoby podobnie.

Tłumaczenie tego na Pascala samo w sobie nie spowalnia działania?

Niczego nie trzeba tłumaczyć, bo SDL jest w formie natywnego kodu wpakowanego do DLL. Jedyne co potrzeba to nagłówki Pascalowe — sam korzystam z SDL2-for-Pascal.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
DA
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 2 lata
  • Postów:37
0

W razie czego, gdybyś potrzebował pomocy z podłączeniem SDL-a do Lazarusa, to służę pomocą — roboty nie ma z tym zbyt wiele, raptem kilka kliknięć. Sam pracuję aktualnie nad projektem gry, pisanej w formie struktoralno-proceduralnej we Free Pascalu i z użyciem SDL-a, więc co nieco już na ten temat wiem.

Dużo roboty, żeby to podłączyć pod FreePascala? Nie używam Lazarusa, piszę w notatniku.

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:minuta
  • Lokalizacja:Tuchów
  • Postów:12163
0
darekdarek napisał(a):

Dużo roboty, żeby to podłączyć pod FreePascala?

Wystarczy pobrać nagłówki i dodać ich ścieżkę w ustawieniach projektu.

Nie używam Lazarusa, piszę w notatniku.

Lubisz się umartwiać? Sam nie wyobrażam sobie programowania czegokolwiek bez odpowiednich narzędzi — szkoda czasu i nerwów. Rozważ instalację Lazarusa.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
DA
Właśnie ze względu na nerwy wywaliłem IDE Lazarusa. Tam połowa funkcjonalności nie działa... O Delphi - to Borlandowskie - to co innego - tam działało wszystko. To nowe (Embarcadero) i Lazarus to tragedia...
flowCRANE
U mnie działa. :D
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)