Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   usar la ruedita del mouse en Builder 6 (https://www.clubdelphi.com/foros/showthread.php?t=84316)

lmpadron 04-10-2013 15:02:30

usar la ruedita del mouse en Builder 6
 
Saludos,
Recientemente encontré un código para implementar el uso de la rueda del mouse (wheel) en los Grid y otros componentes. El código estaba en Pascal y como trabajo con C++ lo traduje quedando algo asi
Código Pascal en el sitio web

Código Delphi [-]
procedure TForm1.ApplicationEvents1Message
   (var Msg: TMsg; var Handled: Boolean) ;
var
   i: SmallInt;
begin
   if Msg.message = WM_MOUSEWHEEL then
   begin
     Msg.message := WM_KEYDOWN;
     Msg.lParam := 0;
     i := HiWord(Msg.wParam) ;
     if i > 0 then
       Msg.wParam := VK_UP
     else
       Msg.wParam := VK_DOWN;

     Handled := False;
   end;
end;

Una ves traducido quedó algo asi.
Código C++
Código:

void __fastcall TForm3::ApplicationEvents1Message(tagMSG &Msg,
      bool &Handled)
{
        int i;
        if (Msg.message == WM_MOUSEWHEEL)
        {
                Msg.message = WM_KEYDOWN;
                Msg.lParam = 0;
                i = HIWORD(Msg.wParam);
                if (i == 120)
                {
                        Msg.wParam = VK_UP;
                }
                else
                {
                        Msg.wParam = VK_DOWN;
                }
                Handled = false;
      }
}

Como pueden ver en el código en Pascal no me funcionaba bien con el i > 0 porque i solo obtenía dos valores 65416 cuando se usaba el Wheel Down y 120 cuando se usaba el Wheel Up. Por lo que lo modifique en mi código en c++ poniendo i == 120
La pregunta concreta es, eso esta bien, I siempre obtiene esos valores en c++ o pueden variar, en caso de variar debería poner la condición i > algo, pues cual seria ese algo?
Gracias de antemano por su tiempo

ecfisa 04-10-2013 21:32:47

Hola Impadron.

En realidad no entendí bien cuál es el problema, pero yo lo tengo implementado de este modo y funciona correctamente.

Header:
Código:

...
private:       
  void __fastcall MouseWheel(tagMSG &Msg, bool &Handled)
...

cpp:
Código:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
 Application->OnMessage = MouseWheel;
}

void __fastcall TForm1::MouseWheel(tagMSG &Msg, bool &Handled)
{
  if (Msg.message == WM_MOUSEWHEEL) {
    Msg.message = WM_KEYDOWN;
    Msg.lParam = 0;
    if ((char)HIWORD(Msg.wParam) > 0)
      Msg.wParam = VK_UP;
    else
      Msg.wParam = VK_DOWN;
    Handled = false;
  }
}

Saludos :)

Edito: El cast a char permite el desborde que se evalua en el condicional.

j0seant 05-10-2013 16:34:15

En lugar de HIWORD, hay una macro pensada para esto:

GET_WHEEL_DELTA_WPARAM(Msg.wParam)


La franja horaria es GMT +2. Ahora son las 16:14:06.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi