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:41 minut
  • Postów:2096
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:około 2 godziny
  • Lokalizacja:Tuchów
  • Postów:12171
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:około 2 godziny
  • Lokalizacja:Tuchów
  • Postów:12171
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:41 minut
  • Postów:2096
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:około 2 godziny
  • Lokalizacja:Tuchów
  • Postów:12171
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:około 2 godziny
  • Lokalizacja:Tuchów
  • Postów:12171
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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.