Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

Тут вопрос задавали, как с джойстиками работать   Найти похожие ветки 

 
тихий вовочка ©   (2004-04-16 13:21) [0]

Тут паренек хотел руль использовать как доп. клавиатуру, а его засмеяли. Вот код работы с рулем:
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, MMSystem, ComCtrls, StdCtrls;

type
 TForm1 = class(TForm)
   StatusBar1: TStatusBar;//??????? ?? ?????? ????????? ?????????? ? ?????????
   RadioButton1: TRadioButton; //?????? ?????? ?? ?????????
   RadioButton2: TRadioButton; //?????? ?????? ?? ?????????
   RadioButton3: TRadioButton; //?????? ?????? ?? ?????????
   RadioButton4: TRadioButton; //????????? ?????? ?? ?????????

   //??????????? ????????? ?? ??? X (??????? ??? ????)
   //trHorizontal, Min = 0, Max = 65535, Position = 32768
   TrackBar1: TTrackBar;

   //??????????? ????????? ?? ??? Y(???-?????? ??? ????)
   //trVertical, Min = 0, Max = 65535, Position = 32768
   TrackBar2: TTrackBar;
   procedure FormCreate(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   { Private declarations }
  connect  : boolean;
  JCaps    : JOYCAPS;  //?????????????? ?????????
  JInfo    : JOYINFOEX;//?????????? ? ?????????????? ??????????
  jnum     : Cardinal;
 public
   { Public declarations }

//?????????? ??????? ?????? ?????????
procedure Joy1ButtonDown(var Msg: TMessage); message MM_JOY1BUTTONDOWN;
procedure Joy1ButtonUp(var Msg: TMessage); message MM_JOY1BUTTONUP;

//?????????? ??????????? ?????????
procedure Joy1UpdCoord(var Msg : TMessage); message MM_JOY1MOVE;

end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
 joycount : integer;
 jres     : integer;
 StString : string;
begin
joycount := joyGetNumDevs(); //??????????? ?? ???????? ??????????.
 if (joycount = 0) then
   begin
     StatusBar1.Panels.Items[0].Text := ("???????? ????????? ?? ???????????");
     connect := false;
   end
  else
    connect := true;

if connect then
 begin
   connect := false;
   JInfo.dwSize := sizeof(JOYINFOEX);
   jres := joyGetPosEx(JOYSTICKID1, @JInfo); //???????, ??? ???? ? ????????? 1
    if (jres = JOYERR_NOERROR) then
      begin
        connect := true;
        jnum    := JOYSTICKID1;
      end
    else
      if (jres = MMSYSERR_INVALPARAM) then
        ShowMessage("?????? ??????????? ??????? ?????????")
      else
        begin
          jres := joyGetPosEx(JOYSTICKID2, @JInfo);
          if(jres = JOYERR_NOERROR) then
            begin
              connect := false;
              jnum    := JOYSTICKID2;
              ShowMessage("?? ???? ???????? ?? ?????? ??????????.");
            end;
        end;
  joyGetDevCaps(jnum,@JCaps,sizeof(JOYCAPS)); //???????? ???-?? ????????? 1
 end;

StString :=  "Device name - "" + JCaps.szPname + """ ;
StString := StString + ", number of buttons - " + IntToStr(JCaps.wNumButtons);
StatusBar1.Panels.Items[0].Text := StString;

//????????? Windows ?? ??, ????? ??? ??? ????????????? ? ????????? ?????????
if(connect) then
 joySetCapture(Handle,jnum,JCaps.wPeriodMin*2,FALSE);

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//????????? Windows, ??? ??? ?????? ??????????? ????? ????????? ?????????
if (connect) then
 joyReleaseCapture(jnum);

end;

//??????????? ????????? ? ????????? ?????????
procedure TForm1.Joy1ButtonDown(var Msg: TMessage);
var res : integer;
begin
RadioButton1.Checked := boolean(Msg.WParam AND JOY_BUTTON1);
RadioButton2.Checked := boolean(Msg.WParam AND JOY_BUTTON2);
RadioButton3.Checked := boolean(Msg.WParam AND JOY_BUTTON3);
RadioButton4.Checked := boolean(Msg.WParam AND JOY_BUTTON4);
end;

procedure TForm1.Joy1ButtonUp(var Msg: TMessage);
begin
RadioButton1.Checked := boolean(Msg.WParam AND JOY_BUTTON1);
RadioButton2.Checked := boolean(Msg.WParam AND JOY_BUTTON2);
RadioButton3.Checked := boolean(Msg.WParam AND JOY_BUTTON3);
RadioButton4.Checked := boolean(Msg.WParam AND JOY_BUTTON4);
end;

procedure TForm1.Joy1UpdCoord(var Msg : TMessage);
var Pos : TPoint;
begin

Pos.x :=  msg.LParamLo;
Pos.y :=  msg.LParamHi;

TrackBar1.Position := msg.LParamLo;
TrackBar2.Position := msg.LParamHi;

end;

end.


 
тихий вовочка ©   (2004-04-16 13:21) [1]

Что-то с кодировкой не то. Комментарии пропали


 
Sun bittern ©   (2004-04-16 13:25) [2]

тихий вовочка ©   (16.04.04 13:21) [1]

Это, когда копируешь из Delphi, рскладка клавы должна быть на русском, иначе приведенный выше результат.


 
тихий вовочка ©   (2004-04-16 13:26) [3]

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, MMSystem, ComCtrls, StdCtrls;

type
 TForm1 = class(TForm)
   StatusBar1: TStatusBar;//Выведем на строку состояния информацию о джойстике
   RadioButton1: TRadioButton; //Первая кнопка на джойстике
   RadioButton2: TRadioButton; //Вторая кнопка на джойстике
   RadioButton3: TRadioButton; //Третья кнопка на джойстике
   RadioButton4: TRadioButton; //Четвертая кнопка на джойстике

   //перемещение джойстика по оси X (поворот для руля)
   //trHorizontal, Min = 0, Max = 65535, Position = 32768
   TrackBar1: TTrackBar;

   //перемещение джойстика по оси Y(газ-тормоз для руля)
   //trVertical, Min = 0, Max = 65535, Position = 32768
   TrackBar2: TTrackBar;
   procedure FormCreate(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   { Private declarations }
  connect  : boolean;
  JCaps    : JOYCAPS;  //Характеристики джойстика
  JInfo    : JOYINFOEX;//Информация о присутствующих джойстиках
  jnum     : Cardinal;
 public
   { Public declarations }

//Обработчик нажатия кнопок джойстика
procedure Joy1ButtonDown(var Msg: TMessage); message MM_JOY1BUTTONDOWN;
procedure Joy1ButtonUp(var Msg: TMessage); message MM_JOY1BUTTONUP;

//Обработчик перемещения джойстика
procedure Joy1UpdCoord(var Msg : TMessage); message MM_JOY1MOVE;

end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
 joycount : integer;
 jres     : integer;
 StString : string;
begin
joycount := joyGetNumDevs(); //Установлены ли драйверы джойстиков.
 if (joycount = 0) then
   begin
     StatusBar1.Panels.Items[0].Text := ("Драйверы джойстика не установлены");
     connect := false;
   end
  else
    connect := true;

if connect then
 begin
   connect := false;
   JInfo.dwSize := sizeof(JOYINFOEX);
   jres := joyGetPosEx(JOYSTICKID1, @JInfo); //Смотрим, как дела у джойстика 1
    if (jres = JOYERR_NOERROR) then
      begin
        connect := true;
        jnum    := JOYSTICKID1;
      end
    else
      if (jres = MMSYSERR_INVALPARAM) then
        ShowMessage("Ошибка определения наличия джойстика")
      else
        begin
          jres := joyGetPosEx(JOYSTICKID2, @JInfo);
          if(jres = JOYERR_NOERROR) then
            begin
              connect := false;
              jnum    := JOYSTICKID2;
              ShowMessage("Не хочу работать со вторым джойстиком.");
            end;
        end;
  joyGetDevCaps(jnum,@JCaps,sizeof(JOYCAPS)); //Получаем хар-ки джойстика 1
 end;

StString :=  "Device name - "" + JCaps.szPname + """ ;
StString := StString + ", number of buttons - " + IntToStr(JCaps.wNumButtons);
StatusBar1.Panels.Items[0].Text := StString;

//Указываем Windows на то, чтобы она нас информировала о состоянии джойстика
if(connect) then
 joySetCapture(Handle,jnum,JCaps.wPeriodMin*2,FALSE);

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//Указываем Windows, что нас дальше неинтересно знать состояние джойстика
if (connect) then
 joyReleaseCapture(jnum);

end;

//Обработчики сообщений о состоянии джойстика
procedure TForm1.Joy1ButtonDown(var Msg: TMessage);
var res : integer;
begin
RadioButton1.Checked := boolean(Msg.WParam AND JOY_BUTTON1);
RadioButton2.Checked := boolean(Msg.WParam AND JOY_BUTTON2);
RadioButton3.Checked := boolean(Msg.WParam AND JOY_BUTTON3);
RadioButton4.Checked := boolean(Msg.WParam AND JOY_BUTTON4);
end;

procedure TForm1.Joy1ButtonUp(var Msg: TMessage);
begin
RadioButton1.Checked := boolean(Msg.WParam AND JOY_BUTTON1);
RadioButton2.Checked := boolean(Msg.WParam AND JOY_BUTTON2);
RadioButton3.Checked := boolean(Msg.WParam AND JOY_BUTTON3);
RadioButton4.Checked := boolean(Msg.WParam AND JOY_BUTTON4);
end;

procedure TForm1.Joy1UpdCoord(var Msg : TMessage);
var Pos : TPoint;
begin

Pos.x :=  msg.LParamLo;
Pos.y :=  msg.LParamHi;

TrackBar1.Position := msg.LParamLo;
TrackBar2.Position := msg.LParamHi;

end;

end.



Страницы: 1 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.044 c
14-1079683433
Ozone
2004-03-19 11:03
2004.04.11
Новый монитор


1-1082556913
russko
2004-04-21 18:15
2004.04.11
Ошибка: Invalid floating point operation


14-1079626797
Mox Fulder
2004-03-18 19:19
2004.04.11
Опять сети (как они достали...)


1-1079950484
Aleksandr
2004-03-22 13:14
2004.04.11
Смешно, но не могу наладить показ итемов ListBox a в его хинте


14-1082213662
Soft
2004-04-17 18:54
2004.04.11
Москвичи, вас зомбируют!!?