0

Vista のスクロール バーのフェード アニメーションを抑制する方法を知っている人はいますか?

私はこれを一時的に行いたいだけで、スクロールバーは自動スクロール機能によって生成される「自動」のものであるため、サブクラス化はオプションではないと思います(これは.NETアプリですが、相互運用が必要であると想定しています)。

これを行う理由は、コントロールのコンテンツが変更される可能性があり (変更される可能性があり)、垂直スクロール バーが自動的に非表示になるためです。ただし、これが私を夢中にさせている部分です-ユーザーが最後の1〜2秒以内にスクロールバーにカーソルを合わせ、アニメーションがまだ進行中の場合、スクロールバーは非表示になりますが、アニメーションはとにかく続行し、そのため、SB は実際には存在しないのにまだ存在しているように見えます (クリックできず、フォームを最小化/復元すると完全に消えます)。

私は、Vista がこのアニメーションにある種のタイマーを使用していると考えており、タイマーを停止するための新しい API があることを期待しています (残念ながら、Google はこれについては役に立ちません)。または、他の誰かがこの問題に遭遇し、それを解決する別の方法を知っているなら、それも素晴らしいでしょう.

前もってありがとう、
アーロン

4

4 に答える 4

1

この投稿の回避策は私にとってはうまくいきます:

http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/88abdb31-651b-4b47-ae24-8b923344c349

投稿の例では C++ を使用していますが、pinvoke を介して .NET で使用する方法を示す C# コードを次に示します (Control サブクラス内で動作しています...)。

protected override void OnSizeChanged(EventArgs e)
{
    if (_vScrollVisible != VerticalScroll.Visible)
    {
        _vScrollVisible = VerticalScroll.Visible;

        if (!_vScrollVisible)
        {

            if (NativeMethods.IsThemeActive())
            {
                // Fix scrollbar fade issue                
                NativeMethods.SetWindowTheme(Handle, null, null);
            }
        }
    }
}

internal static class NativeMethods
{      
    [DllImport("uxtheme.dll", CharSet = CharSet.Unicode)]
    public static extern bool IsThemeActive();

    [DllImport("uxtheme.dll", ExactSpelling = true, CharSet = CharSet.Unicode)]
    public static extern int SetWindowTheme(IntPtr hWnd, String pszSubAppName, String pszSubIdList);
}
于 2011-08-30T06:34:34.897 に答える
0

スクロールバーを使用する理由はありますか?Win32 APIのトリックを使用せずにオフにすることができます。また、アニメーションを適切に処理する(またはアニメーションをスケーリングする)ようにウィンドウのサイズを設定することもできます。

私はあなたの他の唯一のオプションはあなた自身のウィンドウオブジェクトを転がすことであると思います、それは王室の苦痛でしょう。

于 2009-02-21T05:58:27.627 に答える
0

これも気になる効果です。

ユーザーの操作によって子コントロールが拡大または縮小する ContainerControl から派生したコントロールを作成しました。そこで、時間をかけて独自の LayoutEngine をセットアップし、子コントロールに必要なレイアウトを取得しました。しかし、このアニメーション化されたノンストップ SB でさえ汚いです。回避策があります-解決策と見なさないでください-レイアウトメソッドで、レイアウトを作成する前にコンテナーコントロールにフォーカスを設定しました。それは私のために働く...

rp

別の回避策...

is to inherit from the ScrollableControl (Panel, ...) and to

WndProc メソッドをオーバーライドし、PreventScrollAnimation メソッドを使用します。これにより、スクロール バーにヒット テストがあるすべての WM_NCMOUSEMOVE メッセージが消費されます。したがって、これにより、内部がスクロールバーのフェードを開始するのを防ぐことができます。ところで、フェーディングはタイマー コールバックを使用して VISTA-UI に実装されているため、フェードを停止することはできません。

const int WM_NCMOUSEMOVE = 160;
const int HTHSCROLL = 6;
const int HTVSCROLL = 7;

bool PreventScrollAnimation(ref Message m)
{
    if (m.Msg == WM_NCMOUSEMOVE)
    {
        if ((m.WParam.ToInt32() == HTHSCROLL) ||
            (m.WParam.ToInt32() == HTVSCROLL))
        {
            m.Result = IntPtr.Zero;
            return true;
        }
    }
    return false;
}

protected override void WndProc(ref Message m)
{
    if (PreventScrollAnimation(ref m))
        return;

    base.WndProc(ref m);
}
于 2009-02-25T10:03:06.947 に答える
0

アプリケーション内またはシステム全体のスクロールバーを参照している場合、この質問は完全には明確ではありません。システム全体について言及している場合、コンピューター全体のまったく新しいテーマ以外に何ができるかわかりません。ただし、独自のアプリケーションだけを変更する場合は、WPF コントロール テンプレートを使用してスクロール バーの動作を変更し、説明したことを行うことができます。

Expression Blend を使用している場合は、好みに合わせて変更できるデフォルトのスクロール バーのコピーを作成できるため、非常に簡単に実行できます (この場合、フェードのタイミングをゼロに変更するなど)。このリンクはまさに​​あなたが探しているものではありませんが、それが何を意味するのかを理解できるはずです。

Expression Blend を持っていない場合でも、すべてが XAML テキストであるため (Blend が生成する場合でも)、同じことを手作業でコーディングすることは可能ですが、その方法を習得するにはさらに努力が必要です。

Windows Presentation Foundation Unleashedの第 15 章(多くの理由で優れた書籍です) では、Win32 および Windows フォーム アプリ内で WPF をホストとして使用する方法について説明しています。一部の WPF 機能を選択的に使用します。

于 2009-03-18T07:39:49.447 に答える