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

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.

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

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.

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?

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.

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

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.
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?

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.

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.

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1