0

重複の可能性:
ユーザー コントロールのちらつきを修正する方法

現在、フォームの背景画像の画像を動的にロードするプログラムに取り組んでいます。画像が背景に完全に適用されるとすぐにフォームが表示されるようにします。

フォームイベントを試しましたが、うまくいきませBackgroundImageChangedんでした。

画像が高解像度の場合、フォームが表示され、画像がまだ構築されていることがわかります。

コード スニペット:

this.backgroundImage = loadedImage;
// Thread.Sleep(5000);
this.Show();

ご覧のとおりThread.Sleep()、フォームを表示する前に画像を完全にロードするのに時間を費やしています。しかし、このような方法はありますか:

this.backgroundImage = loadedImage;
while( imageIsNotFullyLoaded() ) { }
this.Show();

または、まだ見ていない他の方法やイベントはありますか?

編集:

私のコード:

forn1.cs :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace GameClient {
    public partial class FormMain:Form {
        getImage _getImage;
        public FormMain() {
            InitializeComponent();
        }

        private void FormMain_Load( object sender, EventArgs e ) {
            _getImage = new getImage();
            Image  splashLogo = _getImage.fromURL( "http://ace-acid.no-ip.org/GameClient/splash.png" );
            this.BackgroundImage = splashLogo;
            Thread.Sleep(3000);
            this.Show();
        }

        private void btnLogin_Click( object sender, EventArgs e ) {

            this.Hide();
        }
    }
}

getImage.cs :

using System;
using System.Drawing;
using System.IO;
using System.Net;

namespace GameClient {
    class getImage {
        public Image fromURL( string URL ) {
            Image tmpImg = null;
            try {
                HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create( URL );
                request.AllowWriteStreamBuffering = true;
                request.Timeout = 20000;
                WebResponse response = request.GetResponse();
                Stream stream = response.GetResponseStream();
                tmpImg = Image.FromStream( stream );
                response.Close();
            } catch( Exception ex) {
                return null;
            }
            return tmpImg;
        }
    }
}
4

2 に答える 2

0

そのようにする方法はありません。フォームの実際の無効化/描画は、アンマネージ コードへの相互運用呼び出しによって実行され、完了時のコールバックやフックはありません。現在の手順に沿って生活する必要があります。

少なくとも非ブロッキングにしたい場合は、.NET ターゲットに応じてawait Task.Delay(5000)(または同等のものを) 使用できます。

于 2012-10-29T21:45:57.027 に答える
0

デリゲートによって呼び出されたメソッドに戻り値がある場合、スレッドはそれが終了するまで待機するため、デリゲートを呼び出すなどの簡単なことを実行できます。次のコードを試すことができます。

        delegate Image getImageDelegate(string url);
        private void Form1_Load(object sender, EventArgs e)
        {
            _getImage = new getImage();
Image splashLogo = (Image)this.Invoke(new getImageDelegate(_getImage.fromURL), new object[] { "http://ace-acid.no-ip.org/GameClient/splash.png" });
            this.BackgroundImage = splashLogo;
            this.Show();

        }
于 2012-10-29T21:55:24.617 に答える