C++ Builder Snippets  


Fenster ohne Titelleiste mit der Maus verschieben:
 
//---------------------------------------------------------------------------
// Fenster durch Ziehen am beliebigen Client-Bereich mit der Maus verschieben
//---------------------------------------------------------------------------
// Vorgehensweise #1 
// (Vorteil: Reine VCL-Umsetzung, Nachteil: Fenster flackert beim Verschieben)
//---------------------------------------------------------------------------

// Globale Variablen:
int igOldMouseX, igOldMouseY;

//---------------------------------------------------------------------------
// OnMouseDown-Eventhandler des Formulars:
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormMouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  if (Button == mbLeft)
  {
    igOldMouseX = X;
    igOldMouseY = Y;
  }
}

//---------------------------------------------------------------------------
// OnMouseMove-Eventhandler des Formulars:
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormMouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
  int iDeltaX, iDeltaY;
  if (Shift.Contains(ssLeft))
  {
    iDeltaX = X - igOldMouseX;
    iDeltaY = Y - igOldMouseY;
    Top = Top + iDeltaY;
    Left = Left + iDeltaX;
  }
}


//---------------------------------------------------------------------------
// Fenster durch Ziehen am beliebigen Client-Bereich mit der Maus verschieben
//---------------------------------------------------------------------------
// Vorgehensweise #2 
// (keine Nachteile, ausser der etwas komplekseren Umsetzung)
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// Message- und Messagehandlerdeklarationen für die WM_NCHITTEST - Botschaft
// in der Header-Datei des Formulars:
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
  ...

private:
  ...
  // Messagehandler fuer WM_NCHITTEST:
  void __fastcall WMNCHitTest(TMessage &Msg);
  ...

public:
  ...

  // Folgede Messagehandler-Deklaration ist notwendig um auf die
  // WM_NCHITTEST-Message zu reagieren:
  BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_NCHITTEST, TMessage, WMNCHitTest)
  END_MESSAGE_MAP(TForm)
  ...
};


//---------------------------------------------------------------------------
// Behandlung der WM_NCHITTEST Message in der CPP-Datei: gauckelt Windows vor, 
// die gesamte Formularflaeche waere Caption-Area und ermoeglicht somit 
// das Verschieben des Formulars unabhaengig von der Position des Mauszeigers
//---------------------------------------------------------------------------
void __fastcall TForm1::WMNCHitTest(TMessage &Msg)
{
  // falls linke Maustaste gedrueckt, so tun als ob 
  // der Mauszeiger sich innerhalb der Titelleiste befindet:

  if(GetAsyncKeyState(VK_LBUTTON)<0)
    Msg.Result = HTCAPTION;
  else Msg.Result = HTCLIENT;
}




© '99-2001 by S. Kreutzmann