Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Komponenten zur Laufzeit skalieren und verschieben

Empfohlene Antworten

Veröffentlicht

Hallo Community.

Ich möchte gerne in meinem Programm. Komponenten auf dem Formular zur Laufzeit durch den Benutzer verschieben und skalieren lassen.

zum verschieben habe ich schon eine Routine.

Man legt ein Hilfspanel an:


void __fastcall TForm1::FormShow(TObject *Sender)

{

  pHelpPanel = new TPanel(this);


  pHelpPanel->Parent = this;

  pHelpPanel->BorderStyle = bsNone;

  pHelpPanel->BevelInner = bvNone;

  pHelpPanel->BevelOuter = bvNone;

  pHelpPanel->Caption = "";

  pHelpPanel->FullRepaint = false;

  pHelpPanel->Visible = false;


  // eigene Botschaftsbehandlungsroutine der Application zuweisen

  Application->OnMessage = OnAppMessage;


}

Aufruf der Application Methode:

void __fastcall TForm1::OnAppMessage(tagMSG &Message, bool &Handled)

{

// nur falls die linke Maustaste gedrückt wurde:

  if(Message.message == WM_LBUTTONDOWN)

  {

	// Zeiger auf das Steuerelement unter dem Mauscursor besorgen:

	TControl * pControl = ControlAtPos(ScreenToClient(

	  Message.pt), false, true);




      // Falls das Steuerelement weitere untergeordnete Elemente

      // beinhaltet, prüfen ob nicht eines davon verschoben werden soll:

	  if(pControl)

      {

		TWinControl* pCmp = dynamic_cast<TWinControl*>(pControl);

		TControl*    pCtrl;

		while(pCmp)

		{

		  pCtrl = dynamic_cast<TControl*>(pCmp->ControlAtPos(pCmp->

			ScreenToClient(Message.pt), false, true));

		  pCmp = dynamic_cast<TWinControl*>(pCtrl);

		  if(pCmp) pControl = pCmp;

		  else if(pCtrl) pControl = pCtrl;

		}

	  }


	  // Control verschieben:

	  MoveControl(pControl);

	  Handled = true;



  }

}

und die Methode Move Control

// Funktion fürs Verschieben der Steuerelemente mit der Maus

//---------------------------------------------------------------------------

void __fastcall TForm1::MoveControl(TControl* pControl)

{

   // versuchen den Komponentenzeiger in TWinControl (Zeiger auf ein

  // fensterorientiertes Steuerelement) umzucasten:

  TWinControl* pWinControl = dynamic_cast<TWinControl*>(pControl);


  // falls Umwandlung erfolgreich (Steuerelement fensterorientiert)

  if(pWinControl)

  {

	// "Verschieben"-Modus für das Steuerlement aktivieren:

	ReleaseCapture();

    pWinControl->Perform(WM_SYSCOMMAND, SC_MOVE+HTCAPTION, 0);

  }

  // Falls ein NICHTfensterorientierte Komponente

  // verschoben werden soll:

  else if(pControl)

  {

    // Hilfspanel entsprechend der Position und

    // Grösse der Komponente ausrichten:

	pHelpPanel->Parent = pControl->Parent;

    pHelpPanel->Left   = pControl->Left;

    pHelpPanel->Top    = pControl->Top;

    pHelpPanel->Width  = pControl->Width;

    pHelpPanel->Height = pControl->Height;

    // Das zu verschiebende Steuerelement auf

    // dem Hilfspanel platzieren:

    TWinControl* pSaveParent = pControl->Parent;

    pControl->Parent   = pHelpPanel;

    pControl->Left     = 0;

    pControl->Top      = 0;

    pHelpPanel->Visible = true;

    Application->ProcessMessages();


    // "Verschieben"-Modus für das Hilfspanel aktivieren:

    ReleaseCapture();

    pHelpPanel->Perform(WM_SYSCOMMAND, SC_MOVE+HTCAPTION, 0);


    // Nach dem Verschieben das Steuerelement an der

    // Zielposition auf dem Formular platzieren:

    pControl->Parent = pSaveParent;  // this = Zeiger auf die frmMain

    pControl->Left = pHelpPanel->Left;

    pControl->Top = pHelpPanel->Top;

    pHelpPanel->Visible = false; // Hilfspanel ausblenden

 }

}


Damit können alle Komponenten auf dem formular zur Laufzeit verschoben werden.

Meine Frage, wie kann ich dasselbe mit skalieren sicherstellen?

z.B , wenn der Benutzer in die rechte untere Ecke der Komponente geht, er es vergrößern oder verkleinern kann.

Anstelle von SC_Move --> SC_SiZE //EDIT

bringt schon den Unterschied das er die Größe anzeigt wie man skalieren will

aber er ändert es iwie nicht richtig ab. bzw. gar nicht.

Ich hab auch schon mit MouseDown und Up rumgespielt.

jedoch ist das alles sehr ungenau und der Benutzer sieht nicht wie groß oder klein er die Komponente zieht.

Hat jemand schon Erfahrungen damit gemacht?

Danke

Alex

Bearbeitet von aLeXanDer..

  • Autor

Bin nun soweit, das ich einfache Komponenten wie ein Button auch skalieren kann mit


void __fastcall TForm1::ScaleControl(TControl* pControl)

{

  // versuchen den Komponentenzeiger in TWinControl (Zeiger auf ein

  // fensterorientiertes Steuerelement) umzucasten:

  TWinControl* pWinControl = dynamic_cast<TWinControl*>(pControl);


  // falls Umwandlung erfolgreich (Steuerelement fensterorientiert)

  if(pWinControl)

  {

	// "Skalieren"-Modus für das Steuerlement aktivieren:

	ReleaseCapture();

	pWinControl->Perform(WM_SYSCOMMAND, SC_SIZE+HTMENU, 0);

  }

  // Falls ein NICHTfensterorientierte Komponente

  // verschoben werden soll:

  else if(pControl)

  {

	// Hilfspanel entsprechend der Position und

	// Grösse der Komponente ausrichten:

	pHelpPanel->Parent = pControl->Parent;

	pHelpPanel->Left   = pControl->Left;

	pHelpPanel->Top    = pControl->Top;

	pHelpPanel->Width  = pControl->Width;

	pHelpPanel->Height = pControl->Height;

	// Das zu verschiebende Steuerelement auf

	// dem Hilfspanel platzieren:

	TWinControl* pSaveParent = pControl->Parent;

	pControl->Parent   = pHelpPanel;

	pControl->Left     = 0;

	pControl->Top      = 0;

	pHelpPanel->Visible = true;

	Application->ProcessMessages();


	// "Verschieben"-Modus für das Hilfspanel aktivieren:

	ReleaseCapture();

	pHelpPanel->Perform(WM_SYSCOMMAND, SC_SIZE+HTMENU, 0);


	// Nach dem Verschieben das Steuerelement an der

	// Zielposition auf dem Formular platzieren:

	pControl->Parent = pSaveParent;  // this = Zeiger auf die frmMain

	//pControl->Left = pHelpPanel->Left;

	//pControl->Top = pHelpPanel->Top;


	pControl->Height = pHelpPanel->Height;

	pControl->Width = pHelpPanel->Width;

	pControl->ClientHeight = pControl->Height;

	pControl->ClientWidth = pControl->Width;


	//TBreite = pControl->Width;

	//THoehe = pControl->Height;

	//PosT = pHelpPanel->Top;


	pHelpPanel->Visible = false; // Hilfspanel ausblenden

 }

  Skalieren = false;

  Skalieren1->Checked = false;

  Verschieben1->Enabled = true;

}

also nur SC_Move in SIZE abgeändert und statt HTCAPTION, HTMENU Nur wenn sich jetzt auf einem Panel eine untergeordnete Komponente z.B. ein TImage befindet, gleicht er dessen größe nicht mit an. Wie kann man das Realisieren? Ich hab es schon mit
pWinControl->ClientHeight = ...

probiert, nur da ich ja ein Hilfspanel zeichne, wird damit dann die eigentliche Komponente angesprochen und nicht der Client, das Image, das drauf liegt.

Und das dann anzusprechen gelingt mir nicht.

alex

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.