0

デスクトップ ウィンドウの右下隅にあるタスクバー/システム トレイの少し上にフォームを配置しています。ポップアップ通知のようなものです。通知自体は見栄えがしますが、フォームのサイズを変更するボタンがあり、画面の右下隅に対する位置を維持しながら、5px 単位でサイズ変更をアニメーション化します。

これの問題は、あまり滑らかに見えないことです。Me.Widthを調整すると左からサイズが変更されるため、 Me.Leftでフォームを左に移動して補正する必要があります。とにかく Me.SetBounds は、これらのプロパティを設定するためのラッパーのようです。

フォームをフォームの左から外側にスムーズにサイズ変更する (または少なくともそのように見える) ためにできることはありますか?

4

3 に答える 3

4

ETA:実際には を使用してこれを行うことがSetBoundsできます。そのため、実際にはすべての境界が一度に内部的に設定され、ウィンドウ マネージャーはすべてのプロパティが設定された後にのみウィンドウを再描画します。SetBoundsSetBoundsCoreSetWindowPosSetBounds


MoveWindow別のオプションは、関数をインポートして代わりに使用することです。ウィンドウマネージャーにウィンドウの再描画を指示するに、サイズと位置を同時に設定できるため、ここではスムーズなアニメーションが生成されます。

テスト コードは次のようになります (C# から IL 経由で Reflector を使用して VB に変換)。

Private button1 As Button
Private components As IContainer = Nothing
Private tm As Timer = New Timer

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs)
    MyBase.Left = (Screen.PrimaryScreen.WorkingArea.Width - MyBase.Width)
    MyBase.Top = (Screen.PrimaryScreen.WorkingArea.Height - MyBase.Height)
    Me.tm.Enabled = False
    Me.tm.Interval = 20
    AddHandler Me.tm.Tick, Function 
        If (MyBase.Width < 500) Then
            Form1.MoveWindow(MyBase.Handle, (MyBase.Left - 5), (MyBase.Top - 5), (MyBase.Width + 5), (MyBase.Height + 5), True)
        Else
            Me.tm.Enabled = False
        End If
    End Function
End Sub

<DllImport("user32.dll", SetLastError:=True)> _
Friend Shared Function MoveWindow(ByVal hWnd As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal bRepaint As Boolean) As Boolean
End Function
于 2009-08-06T13:43:36.457 に答える
0

これを試したことはありませんが、フォームのDoubleBufferプロパティをTrueに設定してみましたか?これにより、描画がスムーズになります。

于 2009-08-06T13:19:22.743 に答える
0

インクリメントするピクセルステップを1〜2に減らしてみてください。5pxはサイズを調整するのに大変なようですが、これが途切れ途切れに見えることがわかりました。

于 2009-08-06T13:21:24.347 に答える