aLeXanDer.. Geschrieben 9. Juni 2008 Geschrieben 9. Juni 2008 (bearbeitet) 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 9. Juni 2008 von aLeXanDer.. Zitieren
aLeXanDer.. Geschrieben 9. Juni 2008 Autor Geschrieben 9. Juni 2008 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 Zitieren
Empfohlene Beiträge
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.