
void __fastcall TMainForm::FormMouseWheelDown(TObject *Sender, TShiftState Shift,
          TPoint &MousePos, bool &Handled)
{
 if(GetFocus() == ScrollBox1->Handle || GetFocus() == Panel1->Handle)
 {
  ScrollBox1->Perform(WM_VSCROLL, 1, 0);
 }
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormMouseWheelUp(TObject *Sender, TShiftState Shift,
          TPoint &MousePos, bool &Handled)
{
 if(GetFocus() == ScrollBox1->Handle || GetFocus() == Panel1->Handle)
 {
   ScrollBox1->Perform(WM_VSCROLL, 0, 0);
 }
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::Panel1MouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
{
 if(GetFocus() != ScrollBox1->Handle)
  ScrollBox1->SetFocus();
}
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Application->OnMessage = AppMessage;
}
void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
{
Handled = true;
switch(Msg.message)
{
case WM_VSCROLL:
ScrollBox1->Perform(WM_VSCROLL, Msg.wParam, Msg.lParam);
break;
default:
Handled = false;
break;
}
}


Kółko myszy
Niektóre myszy są wyposażone w kółko (rolkę) które umożliwia w większości programów np. wygodne przesuwanie pasków przewijania.
Po obróceniu rolką zostaje wysłany do procedury okna specjalny komunikat WM_MOUSEWHEEL. W młodszym słowie lParam zawarta jest współrzędna x kursora natomiast w starszym współrzędna y. Parametr wParam zawiera w młodszym słowie stan przycisków myszy i klawiszy ALT, SHIFT, CTRL. Starsze słowo zawiera natomiast dystans o jaki zostało przesunięte kółko, jest on wielokrotnością wartości WHEEL_DELTA która wynosi 120. Jeśli wartość jest dodatnia znaczy to że kółko jest przesuwane do przodu, natomiast wartość ujemna oznacza przesuwanie w tył. To jest moja własna sugestia: Microsoft zdefiniował WHEEL_DELTA, by udostępnić na przyszłość sobie czy innym producentom myszek możliwość zmiany, ponieważ przewidział że będą produkowane lepsze myszki (z większą czułością kółka). Aby móc używać kółka trzeba na początku programu zdefiniować tą linijkę:
#define _WIN32_WINNT 0x0500
//---------------------------------------------------------------------------
#define _WIN32_WINNT 0x0500
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Application->OnMessage = AppMessage;
}
void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
{
Handled = 0;
if(Msg.message==WM_MOUSEWHEEL)
{
ScrollBox1->Perform(WM_VSCROLL, 1, 0);
Handled = 1;
}
}ScrollBox1->Perform(WM_VSCROLL, 0, 0)
// przesuwa również w dół

przewija na dół lub Perform(WM_VSCROLL, 0, 0)
przewija do góry. Zmiana stanu zmiennej Handled jest zbędna.
void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
{
 if(Msg.message == WM_MOUSEWHEEL)
 {
  int zDelta = GET_WHEEL_DELTA_WPARAM(Msg.wParam);
  if(zDelta < 0) ScrollBox1->Perform(WM_VSCROLL, 1, 0);
  else ScrollBox1->Perform(WM_VSCROLL, 0, 0);
 }
}
Â
void __fastcall TForm1::Panel1MouseMove(TObject *Sender, TShiftState Shift, int X,
          int Y)
{
 if(GetFocus() != ScrollBox1->Handle)
  ScrollBox1->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg, bool &Handled) // komponent TApplicationEvents zdarzenie OnMessage
{
 if(Msg.message == WM_MOUSEWHEEL)
 {
  int zDelta = GET_WHEEL_DELTA_WPARAM(Msg.wParam);
  if(zDelta < 0) SendMessage(GetFocus(), WM_VSCROLL, 1, 0);
  else SendMessage(GetFocus(), WM_VSCROLL, 0, 0);
 }
}
 
Cyfrowy Baron napisał(a):Ten wpis: #define _WIN32_WINNT 0x0500 wywołuje błąd w bibliotece windows.hpp, ale kod działa i bez tego, tylko trzeba wysłać komunikat
Cyfrowy Baron napisał(a):Zmiana stanu zmiennej Handled jest zbędna.

Powrót do Ogólne problemy z programowaniem
Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości