7


0

アニメーション化したい編集コントロール(テキストフィールド)があります。 私が欲しいアニメーションは、このテキストフィールドのために余分な行を作成して、スライドさせることです。 テキストフィールドをアニメートして大きくすることはできますが、最初に非表示にしなければならないスライドアニメーションを表示するには。 これは、単に新しい行を追加するのではなく、テキストフィールド全体が何もないところから初めて作成されたようにスライドアウトすることを意味します。

これは私が今持っているコードです:

SetWindowPos(hwnd、HWND_TOP、x、y、newWidth、newHeight、SWP_DRAWFRAME);

ShowWindow(hwnd、SW_HIDE);

AnimateWindow(hwnd、300、AW_SLIDE | AW_VER_NEGATIVE);

それを隠さずに見せることは可能ですか?

3 Answer


6


Nick Dの答えを拡張するために、ここにあなたが探しているものを達成するためのコードがあります…​

h
#define ANIMATION_TIMER 1234 #define ANIMATION_LIMIT 8 #define ANIMATION_OFFSET 4

int m_nAnimationCount;

'' '' '

cpp
void CExampleDlg :: OnTimer(UINT_PTR nIDEvent){if(nIDEvent == ANIMATION_TIMER){if(m_nAnimationCount> ANIMATION_LIMIT)KillTimer(EXPAND_TIMER); else {CRect rcExpand; m_edtExpand.GetWindowRect(rcExpand); ScreenToClient(rcExpand);

rcExpand.bottom = ANIMATION_OFFSET;

m_edtExpand.MoveWindow(rcExpand); }}

CDialog :: OnTimer(nIDEvent); }

void CExampleDlg :: OnStartAnimation(){m_nAnimationCount = 0; SetTimer(ANIMATION_TIMER、20、NULL)。 }

編集コントロールの_Multiline_プロパティを設定することを忘れないでください(m_edtExpand)


3


別の方法は SetTimer関数を使ってアニメーションをシミュレートすることです。


0


組み込みのAnimateWindow APIではできないと思います。 AnimateWindowへのMSDNのエントリhttp://msdn.microsoft.com/ja-jp/library/ms632669(VS.85).aspxによると、「ウィンドウの表示または非表示時に特殊効果を生成する」ために使用され、AW_HIDEフラグによって決定されるこの関数はウィンドウを表示または非表示にします。 そして、私はあなたが望むことをするための代替の組み込み関数を見ることができません。

したがって、Nick D. そしてAlanは自分でリサイズをコーディングする正しいアプローチを持っています。 これがよく解決策です。 AnimateWindowについては、これまでにない信頼性があると思いますが、AnimateWindowは内部的に非常によく似た動作をすると思います。

また、アニメーションが終了する前に、テキストボックスに別の行を追加または削除したり、その他の方法でサイズを変更した場合は、タイマーが正しいことを実行するようにする必要があります。

また、コーディングが不便な場合は、アニメーションの優先順位を低くすることを真剣に考えてください。