2017-12-05 15 views
1

イメージの幅を縮小し、イメージソースを変更して元のサイズに戻そうとしています。それは縮小しますが、それは成長しません。どのようなアイデアが間違っている?画像のサイズは縮小しますが、元に戻りませんか?

while (pictureBox2.Size.Width > 0) 
{ 
    int width = pictureBox2.Size.Width; 
    width -= 2; 
    pictureBox2.Size = new Size(width, pictureBox2.Size.Height); 
    pictureBox2.Location = new Point(pictureBox2.Location.X + 1, pictureBox2.Location.Y); 
    System.Threading.Thread.Sleep(1); 
} 
pictureBox1.Image = currentImage; 
while (pictureBox2.Size.Width < 191) 
{ 
    int width = pictureBox2.Size.Width; 
    width += 2; 
    pictureBox2.Size = new Size(width, pictureBox2.Size.Height); 
    pictureBox2.Location = new Point(pictureBox2.Location.X - 1, pictureBox2.Location.Y); 
    System.Threading.Thread.Sleep(1); 
} 
+0

pictureBox1.Image = currentImage 'のための何らかの理由;' –

+0

EmrahSüngü@ _異なる_ 'PictureBox'です – MickyD

答えて

0

あなたの描画の問題は、Windowsがコントロールを適切にペイントすることを許可していないことが原因であると思われます。通常、Windowsのコントロールは、メッセージポンプを処理するときにWM_PAINTまたは同等のものを受け取ります。アプリがこのポンプを処理しないと(whileループスリープ中にビジー状態であると言われているため)、一般的に更新は発生しません。

whileループで実行する場合は、おそらくThread.Sleep()を呼び出す代わりにpictureBox2.Refresh()を使用する必要があります。前者は現在のスレッド(UIスレッド)をブロックし、ピクチャボックスを再描画します。後者は現在のスレッドをブロックする役割しか果たしていないため、おそらく更新が見られないのでしょう。

MSDN

強制コントロールがクライアント領域を無効化し、直後にそのコントロール自体とその子コントロールを再描画します。実際にTell me more...

、あなたの代わりにタイトなループと睡眠のタイマーを使用してに調査することをお勧めします。

0

asyncで方法をマークし、次にSleep()の代わりにawait Task.Delay(1);を使用します。これは、応答性のアプリを維持し、UIは実際にあなたのPictureBox変化の大きさとしての地位を再描画することができます:

private async void button1_Click(object sender, EventArgs e) 
{ 
    while (pictureBox2.Size.Width > 0) 
    { 
     int width = pictureBox2.Size.Width; 
     width -= 2; 
     pictureBox2.Size = new Size(width, pictureBox2.Size.Height); 
     pictureBox2.Location = new Point(pictureBox2.Location.X + 1, pictureBox2.Location.Y); 
     await Task.Delay(1); 
    } 
    pictureBox1.Image = currentImage; 
    while (pictureBox2.Size.Width < 191) 
    { 
     int width = pictureBox2.Size.Width; 
     width += 2; 
     pictureBox2.Size = new Size(width, pictureBox2.Size.Height); 
     pictureBox2.Location = new Point(pictureBox2.Location.X - 1, pictureBox2.Location.Y); 
     await Task.Delay(1); 
    } 
} 
関連する問題