2

ボーダレス フォームがあり、AnimateWindow() メソッドを使用して、フォームを開く、閉じるなどのアニメーションを作成します。私はこのコードを使用します:

[Flags]
enum AnimateWindowFlags
{
    AW_HOR_POSITIVE = 0x0000000
    AW_HOR_NEGATIVE = 0x00000002,
    AW_VER_POSITIVE = 0x00000004,
    AW_VER_NEGATIVE = 0x00000008,
    AW_CENTER = 0x00000010,
    AW_HIDE = 0x00010000,
    AW_ACTIVATE = 0x00020000,
    AW_SLIDE = 0x00040000,
    AW_BLEND = 0x00080000
}

[DllImport("user32.dll")]
static  extern bool AnimateWindow(IntPtr hWnd, int time, AnimateWindowFlags flags);

フォームを閉じると、次のコードが機能するようです。

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    AnimateWindow(this.Handle, 100, AnimateWindowFlags.AW_BLEND | AnimateWindowFlags.AW_HIDE);
}

ただし、このコードでフォームを開くと:

private void Form1_Load(object sender, EventArgs e)
{
    AnimateWindow(this.Handle, 100, AnimateWindowFlags.AW_BLEND);
}

何も起こらないようです。いくつかの推測とテストを行った後、AnimateWindow() メソッドを使用してフォームをフェードアウトさせることができましたが、それを使用してフォームをフェードインさtimeせても (パラメーターに関係なく) 何もしません。

何か案は?

4

1 に答える 1

4

これを正しく行うのは非常に困難です。膨大な量のコードが含まれているため、推論するのは非常に困難です。スタートアップ フォームの Application クラスと、独自のフォームを作成するときの Show() メソッドによって設定される Visible プロパティは、Winforms では非常に重要です。ネイティブ ウィンドウの作成は、典型的な .NET のやり方では怠惰です。

AnimateWindow() 呼び出しは、Show() メソッドが呼び出されてから Winforms が ShowWindow() を pinvoke する機会を得るまでの間に挿入する必要があります。OnLoad() で試したときにアニメーション効果を台無しにするのは後者の呼び出しです。イベントの起動が遅すぎます。

このコードを試すことができます。フォーム クラスに貼り付けます。

    protected override void SetVisibleCore(bool value) {
        if (!this.IsHandleCreated) {
            NativeMethods.AnimateWindow(this.Handle, 100, AnimateWindowFlags.AW_BLEND);
        }
        base.SetVisibleCore(value);
    }

    protected override void OnShown(EventArgs e) {
        this.BringToFront();
        base.OnShown(e);
    }

しかし、考えられるすべてのケースで機能することを約束することはできず、広範囲にテストしていません. BringToFront() を呼び出さなければならないことは、すでに不愉快なハックでした。MDI 子フォームで試してはいけません。良い結果が得られる可能性は低いです。

于 2015-07-22T17:56:45.243 に答える