MFCダイアログベースで作成したアプリで
CWndの派生クラスを作成し
BOOL CTestAppDlg::OnInitDialog()
{
m_pProgramInfoWnd = new CProgramInfo;
if(m_pProgramWnd == NULL)
return -1;
if(!m_pProgramInfoWnd->Create(NULL, _T("),
WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
RECT_PROGRAM_INFO,
this,
IDC_PROGRAM_INFO_WND))
{
delete m_pProgramInfoWnd;
m_pProgramInfoWnd = NULL;
}
bool a = ::AnimateWindow(m_pProgramInfoWnd->m_hWnd, 500, AW_ACTIVATE |
AW_BLEND); ::AnimateWindow(m_BitmapWnd->m_hWnd, 300, AW_VER_NEGATIVE);
}
書いてる途中で送信してしまいました。
CWndを派生したクラスを作成し、ダイアログのOnInitDialogで
下記のように書いても全くアニメートしません。
BOOL CTestAppDlg::OnInitDialog()
{
m_pProgramInfoWnd = new CProgramInfo;
if(m_pProgramWnd == NULL)
return -1;
if(!m_pProgramInfoWnd->Create(NULL, _T("),
WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS |
WS_CLIPCHILDREN,
RECT_PROGRAM_INFO,
this,
IDC_PROGRAM_INFO_WND))
{
delete m_pProgramInfoWnd;
m_pProgramInfoWnd = NULL;
}
// サブウィンドウのアニメート
::AnimateWindow(m_pProgramInfoWnd->m_hWnd, 500, AW_VER_NEGATIVE);
}
ですが、試しに下記のように書いてみたらアニメートしました。
::AnimateWindow(m_hWnd, 500, AW_VER_NEGATIVE); //ダイアログのアニメート
なにがいけないのでしょうか??
いろいろ探してみましたが見つからないので教えてください。
> If the function fails, ... . The function will fail in the following situations:
> ・If the window is already visible and you are trying to show the window.
これと思われ。
# MSDN日本語訳にこの項が無いのはMSの怠慢ではなく孔明あたりが仕掛けた罠なんだろう
> # MSDN日本語訳にこの項が無いのはMSの怠慢ではなく孔明あたりが仕掛けた罠なんだろう
と思ったら日本語訳にも載ってるね。
> 関数が失敗すると、0 が返ります。関数が失敗するのは、次のような場合です。
> ・すでに可視になっているウィンドウを表示しようとした。
>gak さん
ありがとうございます。
そう思い、入れてやってみたりはしたのですが。。
下記のようにすると、まったく表示されません。
m_pProgramInfoWnd->ShowWindow(SW_HIDE);
::AnimateWindow(m_pProgramInfoWnd->m_hWnd, 500, AW_VER_NEGATIVE);
自動的にアニメートして表示されるものと思っていましたが
それも間違えているのでしょうか??
> 下記のようにすると、まったく表示されません。
CTestAppDlgが表示されてから(== CTestAppDlg::OnInitDialog() を抜けてから)でない
とダメだね。
親が非表示の状態で子を表示する事はできないから。
1:Createに設定してあるスタイルの情報が足りない。
外枠に関する情報がないから、クライアント領域だけの表示になる
ダイアログのクライアント領域と同じ色のままでは、表示されても
区別がつかない。
#派生したCWndで、何らかの表示・色付けしてるならわかる
2:WS_VISIBLEがついてるのでCreate時に表示される。
3:OnInitDialogでは、ダイアログはまだ表示前。
たとえ、子ウィンドウのアニメートが成功しても、
その表示先である親のダイアログが表示されてないので見えない。
#ダイアログ表示されたときには、子ウィンドウはアニメート効果は終了している。
>自動的にアニメートして表示されるものと思っていましたが
自動的にされる。
ただ、
AnimateWindowは
「アニメート表示するようにウィンドウに予約する」
ではなく
「AnimateWindowが呼ばれたときに、アニメート表示する」
です。だから、タイミングを考えないといけない
>rinさん
>gakさん
ありがとうございます。
スタイルにWS_BORDERを入れて試してみた所ちゃんと動作を確認できました。
ただ、ビットマップを表示したウィンドウで行うとビットマップが
再描画されないようで非表示のままに見えたようです。
ビットマップも同時に?アニメートするのは無理なのでしょうか??
シャノンさん
ありがとうございました!!
うまく表示できました。