C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: スクロールバーの描画が消えずに残る


(過去ログ 126 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■74857 / inTopicNo.1)  スクロールバーの描画が消えずに残る
  
□投稿者/ pod (29回)-(2015/02/03(Tue) 10:16:50)

分類:[C#] 

2015/02/03(Tue) 12:08:00 編集(投稿者)
VS 2013 C# でAutoScrollを有効にしたパネルを使ったプログラムを作っています。
パネル内のpictureBoxを自由に動かせるようにしているのですが、
pictureBoxをスクロールバーの出ないはずの位置に戻してもスクロールバーの残像が残ってしまいます。
そのスクロールバーはクリックできず再描画がうまく行っていないようです。

再現率は2回に一回ほどで、Update() や Invalidate() などでは効き目がないようです。
手順は次のとおりです。

1. ボタンでpictureBoxを移動させてスクロールバーを表示
2. 手動でスクロールバーを左端に戻す
3. サイドボタンを押して pictureBox を0, 0 に移動させる

    public partial class Form1 : Form
    {
        PictureBox pictureBox1 = new PictureBox();
        Panel panel1 = new Panel();
        Button button1 = new Button();

        bool toggleFlag = false;

        public Form1()
        {
            //InitializeComponent();

            pictureBox1.BackColor = Color.Red;
            pictureBox1.Size = new Size(30, 30);

            panel1.Size = new Size(300, 100);
            panel1.AutoScroll = true;
            panel1.Controls.Add(pictureBox1);

            button1.Location = new Point(10, panel1.Bottom + 10);
            button1.Click +=button1_Click;

            this.Controls.Add(panel1);
            this.Controls.Add(button1);

        }


        private void button1_Click(object sender, EventArgs e)
        {
            if (!toggleFlag)
            {
                pictureBox1.Left = 1000;
                panel1.ScrollControlIntoView(pictureBox1);
                toggleFlag = !toggleFlag;
            }
            else
            {
                pictureBox1.Left = 0;
                toggleFlag = !toggleFlag;
                panel1.Invalidate();
            }
        }
    }

実際のプログラムではドラッグアンドドロップで移動させていますが症状は同じです。
OS は Windows7(64bit) .Net Framework は4.0と4.5で試しました。
何か解決策はないでしょうか?よろしくお願いします。

引用返信 編集キー/
■74860 / inTopicNo.2)  Re[1]: スクロールバーの描画が消えずに残る
□投稿者/ shu (685回)-(2015/02/03(Tue) 13:01:10)
No74857 (pod さん) に返信

AutoScrollPositionが変わっているので
そのままLeftに0を代入しても元の位置には戻りません。

panel1.AutoScrollPosition = new Point(0, 0);
pictureBox1.Left = 0;

引用返信 編集キー/
■74862 / inTopicNo.3)  Re[2]: スクロールバーの描画が消えずに残る
□投稿者/ pod (30回)-(2015/02/03(Tue) 15:17:23)
No74860 (shu さん) に返信

> AutoScrollPositionが変わっているので
> そのままLeftに0を代入しても元の位置には戻りません。

手順2でスクロールバーを手動で左端に戻した時点で
AutoScrollPosition は 0 になっていると認識していますが間違っていますか?
最初のコードのままで pictureBox.Left は正しく 0 に戻っています。
スクロール位置が 10 のとき pictureBox.Left が 10 になること自体は問題無いです。
引用返信 編集キー/
■74869 / inTopicNo.4)  Re[3]: スクロールバーの描画が消えずに残る
□投稿者/ shu (687回)-(2015/02/04(Wed) 09:27:01)
No74862 (pod さん) に返信
> ■No74860 (shu さん) に返信
>
>>AutoScrollPositionが変わっているので
>>そのままLeftに0を代入しても元の位置には戻りません。
>
> 手順2でスクロールバーを手動で左端に戻した時点で
> AutoScrollPosition は 0 になっていると認識していますが間違っていますか?
> 最初のコードのままで pictureBox.Left は正しく 0 に戻っています。
> スクロール位置が 10 のとき pictureBox.Left が 10 になること自体は問題無いです。
こちらでは提示コードで解決しているように思われたのですが駄目でしょうか?
引用返信 編集キー/
■74870 / inTopicNo.5)  Re[4]: スクロールバーの描画が消えずに残る
□投稿者/ pod (31回)-(2015/02/04(Wed) 12:21:11)
No74869 (shu さん) に返信

回答ありがとうございます。ご提示いただいたソースでスクロールバーは正しく消えます。

スクロールバーを左端に動かした段階でAutoScrollPositionを調べると(0, 0)になっていたので
改めて(0, 0)を代入しなおす必要はないと思っていましたが、
同じ値を再度セットすることで再計算や再描画のような処理が行われているようです。

現在のスクロール位置での左端とするために最終的なソースは次のようになりました。

panel1.AutoScrollPosition = new Point( -panel1.AutoScrollPosition.X, -panel1.AutoScrollPosition.Y);
pictureBox1.Left = 0;
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -