Dynamiczna zmiana rozmiaru komponentu za pomocą myszki

0

Chciałbym aby przy jakimś komponencie, np txtbox po najechaniu na jego krawędź, pokazywała się ikonka z 2 strzałkami i istniała możliwość zmiany jego rozmiaru - np: dokładnie tak jak to jest w VS przy dodawaniu komponentów na formatkę.
Da radę to jakiś zrobić? :)

Inna sprawa - dla mnie teraz nie istotna ale skoro jesteśmy przy tym temacie... Jak zrobić żeby ładnie przesuwać kontrolkę z pomocą myszy. Myślałem, że to będzie proste bo wystarczy dodać w _MouseMove np coś takiego

     
if (e.Button == MouseButtons.Left)
            {
                textBox1.Left = e.X;
                textBox1.Top = e.Y; 
            }

ale niedziała to poprawnie - miga i ucieka.

0
Kmot napisał(a)

Chciałbym aby przy jakimś komponencie, np txtbox po najechaniu na jego krawędź, pokazywała się ikonka z 2 strzałkami i istniała możliwość zmiany jego rozmiaru - np: dokładnie tak jak to jest w VS przy dodawaniu komponentów na formatkę.
Da radę to jakiś zrobić? :)

Inna sprawa - dla mnie teraz nie istotna ale skoro jesteśmy przy tym temacie... Jak zrobić żeby ładnie przesuwać kontrolkę z pomocą myszy. Myślałem, że to będzie proste bo wystarczy dodać w _MouseMove np coś takiego

     
if (e.Button == MouseButtons.Left)
            {
                textBox1.Left = e.X;
                textBox1.Top = e.Y; 
            }

ale niedziała to poprawnie - miga i ucieka.

Wszystko ogranicza się do dodania zdarzenia ruchu myszka w zdarzeniu naciśnięcia klawiszy:

public Form1()
        {
            InitializeComponent();
            this.textBox1.MouseDown += new MouseEventHandler(textBox1_MouseDown);
        }
        int[] pozycje = new int[2];
        void textBox1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                //zmiana rozmiarow
                if (e.X > this.textBox1.Width-10 || e.Y > this.textBox1.Height -10)
                {
                    pozycje = new int[] { e.X, e.Y };
                    this.textBox1.MouseMove += new MouseEventHandler(textBox1_MouseMove1);
                    this.textBox1.MouseUp += new MouseEventHandler(textBox1_MouseUp1);
                }
                
                //przesuniecie
                else
                {
                    pozycje = new int[] { e.X, e.Y };
                    this.textBox1.MouseMove += new MouseEventHandler(textBox1_MouseMove2);
                    this.textBox1.MouseUp += new MouseEventHandler(textBox1_MouseUp2);
                }
                
            }
        }

        void textBox1_MouseMove1(object sender, MouseEventArgs e)
        {            
            this.textBox1.Width += (e.X-pozycje[0]);
            this.textBox1.Height += (e.Y - pozycje[1]);
            
            pozycje = new int[] { e.X, e.Y };
        }
        void textBox1_MouseMove2(object sender, MouseEventArgs e)
        {
            this.textBox1.Top += (e.X - pozycje[0]);
            this.textBox1.Left += (e.Y - pozycje[1]);
            pozycje = new int[] { e.X, e.Y };
        }

        void textBox1_MouseUp1(object sender, MouseEventArgs e)
        {
            this.textBox1.MouseMove -= new MouseEventHandler(textBox1_MouseMove1);
        }
        void textBox1_MouseUp2(object sender, MouseEventArgs e)
        {
            this.textBox1.MouseMove -= new MouseEventHandler(textBox1_MouseMove2);
        }

Albo jakoś tak a co do migania to:
this.DoubleBuffered = true;

0

Miałem podobny problem i zauważyłem że kod nie do końca działa jak należy.
Na pierwszy rzut oka ok, ale przy większej ilości kodu przesuwana kontrolka pozostawia po sobie "ślad" wyglądający jak błąd przy odświeżaniu.
w googlu nie ma zbyt wiele o tym.

Próbowałem DoubleBufer bez rezultatu, po wpisaniu this.Update() przy zdarzeniu mousemove błąd częściowo znikł, ale nie do końca.

1

ustaw ResizeRedraw = true. CHYBA to było tak: this.SetStyle(ControlStyles.ResizeRedraw, true);

0

Próbowałem wszystkich stylów, ale to nie działa, problem raczej tkwi w odświeżaniu formy,
przesuwana kontrolka pozostawia ślady które znikają dopiero po zatrzymaniu lub kiedy przesuwana jest wolniej.
Z kolei Update o tyle poprawiło jakość tej akcji, że kiedy przesuwam kontrolkę, nie widać śladów, tylko jeden nieodświeżony ślad, jakby druga kontrolka chodząca za tą którą przesuwam, której powinno nie być.
Szkoda że nie można ustawić prędkości odświeżania, wtedy nie było by tego problemu.

0

Może pokaż kod to będziemy wspólnie siedzieć i myśleć :)

0

Zauważyłem jedno, kiedy przesuwam kontrolkę nad obiektami typu listbox,
kontrolka gładko śmiga, a gdy przesuwana jest nad formą znowu pojawia się ślad.
Zauważyłem też, że błąd się nasila gdy kontrolka ma większe rozmiary.

wygląda to mniej więcej tak:

             public Form1()
        {  
     InitializeComponent();
        }
        private int offsetX, offsetY, LaW, LaH, ex, ey;
        private void kontrolka_MouseMove(object sender, MouseEventArgs e)
        {
       ex =  e.X;
       ey = e.Y;
               if (e.Button == MouseButtons.Left)
               {
                  int xxx = ex + kontrolka.Left - offsetX;
                  int yyy = ey + kontrolka.Top - offsetY;
                  kontrolka.Location = new Point(xxx,yyy);
               }
               if (e.Button == MouseButtons.Right)
               {
                   int xxx = LaW + ex - offsetX;
                   int yyy = LaH + ey - offsetY;
                   kontrolka.Size = new Size(xxx,yyy);
               } 
           }
           Update();
        }
 private void kontrolka_MouseDown(object sender, MouseEventArgs e)
        {
                offsetX = e.X;
                offsetY = e.Y;
                LaW = kontrolka.Width;
                LaH = kontrolka.Height;
        }
1

No to oprócz this.SetStyle(ControlStyles.ResizeRedraw, true); pokombinuj z Opaque , DoubleBuffer, ewentualnie UserPaint. Jeśli nie, problem być może leży w nieodświeżaniu potomnych kontrolek.

Edit: jeśli nie pomoże dodaj te style do kontrolki!

0

Próbowałem wszystkich stylów this.SetStyle( ControlStyles.AllPaintingInWmPaint | ControlStyles... i tak do końca , ale to nie działa, co prawda każdy raczej coś zmienia, ale to nie od tego [???]

0

Zagadka, dlaczego mi działa ten kod bez zarzutów? Czy mała czy duża, jest OK.
PS. co masz na myśli "przy większej ilości kodu"

1

A jaki masz procesor? :>

0

wole nie mówić [wstyd]
:-D
swoją drogą dobrze wiedzieć że o to chodzi.
Dzięki za informację

1

Hmm, sam do niedawna miałem komputer pewnie gorszy niż ty masz (995 mhz :D, 256 MB ram), więc chcąc, nie chcąc musiałem trochę optymalizować ;) Inna sprawa że obecnie przy machaniu myszą jak opętaną zużywa max 15% CPU (a i tak z tego 7% inne aplikacje - np firefox).
Tak czy inaczej jestem pewien że DA się to jakoś zrobić - w końcu takie bajery były już wtedy, gdy nikomu się nie śniło o gigahercowych procesorach...

1 użytkowników online, w tym zalogowanych: 0, gości: 1