AnimateWindowについて – プログラミング – Home

通知
すべてクリア

[解決済] AnimateWindowについて


TERU
 TERU
(@TERU)
ゲスト
結合: 19年前
投稿: 28
Topic starter  

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);
}


引用未解決
トピックタグ
TERU
 TERU
(@TERU)
ゲスト
結合: 19年前
投稿: 28
Topic starter  

書いてる途中で送信してしまいました。
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); //ダイアログのアニメート

なにがいけないのでしょうか??
いろいろ探してみましたが見つからないので教えてください。


返信引用
gak
 gak
(@gak)
ゲスト
結合: 21年前
投稿: 132
 

> 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の怠慢ではなく孔明あたりが仕掛けた罠なんだろう


返信引用
gak
 gak
(@gak)
ゲスト
結合: 21年前
投稿: 132
 

> # MSDN日本語訳にこの項が無いのはMSの怠慢ではなく孔明あたりが仕掛けた罠なんだろう
と思ったら日本語訳にも載ってるね。

> 関数が失敗すると、0 が返ります。関数が失敗するのは、次のような場合です。
> ・すでに可視になっているウィンドウを表示しようとした。


返信引用
TERU
 TERU
(@TERU)
ゲスト
結合: 19年前
投稿: 28
Topic starter  

>gak さん
ありがとうございます。
そう思い、入れてやってみたりはしたのですが。。
下記のようにすると、まったく表示されません。

m_pProgramInfoWnd->ShowWindow(SW_HIDE);
::AnimateWindow(m_pProgramInfoWnd->m_hWnd, 500, AW_VER_NEGATIVE);

自動的にアニメートして表示されるものと思っていましたが
それも間違えているのでしょうか??


返信引用
gak
 gak
(@gak)
ゲスト
結合: 21年前
投稿: 132
 

> 下記のようにすると、まったく表示されません。
CTestAppDlgが表示されてから(== CTestAppDlg::OnInitDialog() を抜けてから)でない
とダメだね。
親が非表示の状態で子を表示する事はできないから。


返信引用
rin
 rin
(@rin)
ゲスト
結合: 18年前
投稿: 112
 

1:Createに設定してあるスタイルの情報が足りない。
外枠に関する情報がないから、クライアント領域だけの表示になる
ダイアログのクライアント領域と同じ色のままでは、表示されても
区別がつかない。
#派生したCWndで、何らかの表示・色付けしてるならわかる

2:WS_VISIBLEがついてるのでCreate時に表示される。

3:OnInitDialogでは、ダイアログはまだ表示前。
たとえ、子ウィンドウのアニメートが成功しても、
その表示先である親のダイアログが表示されてないので見えない。
#ダイアログ表示されたときには、子ウィンドウはアニメート効果は終了している。


返信引用
rin
 rin
(@rin)
ゲスト
結合: 18年前
投稿: 112
 

>自動的にアニメートして表示されるものと思っていましたが
自動的にされる。

ただ、
AnimateWindowは
「アニメート表示するようにウィンドウに予約する」
ではなく
「AnimateWindowが呼ばれたときに、アニメート表示する」
です。だから、タイミングを考えないといけない


返信引用
TERU
 TERU
(@TERU)
ゲスト
結合: 19年前
投稿: 28
Topic starter  

>rinさん
>gakさん
ありがとうございます。
スタイルにWS_BORDERを入れて試してみた所ちゃんと動作を確認できました。
ただ、ビットマップを表示したウィンドウで行うとビットマップが
再描画されないようで非表示のままに見えたようです。
ビットマップも同時に?アニメートするのは無理なのでしょうか??


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

WM_PRINTCLIENTを処理してみるとか。
http://www.kumei.ne.jp/c_lang/sdk4/sdk_348.htm


返信引用
TERU
 TERU
(@TERU)
ゲスト
結合: 19年前
投稿: 28
Topic starter  

シャノンさん
ありがとうございました!!
うまく表示できました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました