[ DarkMan @ 07.07.2006. 08:53 ] @
Za opis problema cu koristiti sledeci primer:
- na praznu formu dodati dva panela
- obojiti te panele razlicitim bojama da bi se videli
- na click event oba panela raditi panel.Focus()
Code:

        private void panel1_Click(object sender, EventArgs e)
        {
            panel1.Focus();
        }

- formi ukljuciti property Autoscroll
- prvi panel staviti uz levu stranu forme a drugi na desnu stranu forme tako da izlazi iz forme pri cemu se automatski pojavljuje horizontalni scrollbar
- startujete program i probajte da kliknete na oba panela

Moje pitanje je: kako spreciti da se forma, pri postavljanju fokusa na panel, automatski skroluje da prikaze fokusiranu kontrolu? Znaci hocu da pozicija horizontalnog scrollbara ostane ista pri promeni fokusa. Kontrolu moram fokusirati i tu nema izmena.
[ DarkMan @ 29.08.2007. 00:08 ] @
Raniji problem mi je opet postao aktuelan. Ovog puta dajem example.

U novom projektu zameniti kod za Form1 sledecim:
Code:

    public partial class Form1: Form
    {
        private Panel panel1;
        private Panel panel2;

        public Form1()
        {
            panel1 = new Panel();
            panel1.Location = new Point(0, 0);
            panel1.Size = new Size(600, 100);
            panel1.BackColor = Color.LightGreen;
            panel1.Click += new EventHandler(panel_Click);

            panel2 = new Panel();
            panel2.Location = new Point(0, 100);
            panel2.Size = new Size(600, 100);
            panel2.BackColor = Color.LemonChiffon;
            panel2.Click += new EventHandler(panel_Click);

            this.SuspendLayout();
            this.Controls.Add(panel1);
            this.Controls.Add(panel2);
            this.AutoScroll = true;
            this.ClientSize = new Size(400, 250);
            this.ResumeLayout(false);
            this.Shown += new EventHandler(Form1_Shown);
        }

        void Form1_Shown(object sender, EventArgs e)
        {
            panel1.Focus();
            this.HorizontalScroll.Value = 100;
            this.HorizontalScroll.Value = 100; // Ne znam zasto ovo moram podesavati dva puta
        }

        void panel_Click(object sender, EventArgs e)
        {
            Panel panel = sender as Panel;
            if(panel != null) panel.Focus();
        }
    }


Kada se pokrene aplikacija kliknuti na drugi panel. Moje pitanje je da li neko zna kako da sprecim da se pri promeni fokusa horizontalni scroll bar vrati na pocetak?

Moje resenje je bilo da pre fokusiranja zapamtim vrednost horizontalnog scroll bara pre fokusiranja i posle fokusiranja vratim tu vrednost. Ovo dovodi do flickeringa pa bih zeleo da vidim ako postoji neko drugo resenje koje bih mogao da probam.
[ negyxo @ 29.08.2007. 00:37 ] @
Override-uj WndProc, tu bi trebalo da mozes to da uradis.
[ DarkMan @ 29.08.2007. 12:20 ] @
Probao sam override WndProc same forme ali ne vidim nikakvu poruku koja se tice samog skrolovanja.
Uglavnom, nasao sam resenje kojim sam uklonio flickering:

Code:

        void panel_Click(object sender, EventArgs e)
        {
            Panel panel = sender as Panel;
            this.HScroll = false;
            if(panel != null) panel.Focus();
            this.HScroll = true;
        }