Zum Inhalt springen

Komponenten zur Laufzeit skalieren und verschieben


Empfohlene Beiträge

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..
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...