うぉー新鮮ですね
私もWin32APIを熟知しているとは言えずATLに関しても全く知識が無いのであんまりお力になることは
できそうにありませんが、とりあえず蒼熊さんが挙げられた問題点を解消することはできましたので
その方法をお伝えします
・DestroyWindowやPostMessage等でFLASHのウインドウを閉じようとすると、メインのウインドウまで閉じてしまう
OnDestroy で 呼んでいる PostQuitMessage(0); をコメントアウトすると閉じなくなります
PostQuitMessage(0); はソフトを終了することに呼ぶAPIですのでここで呼ばなくても大丈夫です
・メインウインドウの動きに追従しない
Create(GetMainWindowHandle(), cRect, NULL, WS_POPUP | WS_VISIBLE);
上記部分の WS_POPUP を WS_CHILD にすると追従するようになります、でもそうするとFlashウインドウの原点が
メインウインドウのクライアント領域左上端になりますので、cRectの内容も GetWindowCRect を呼んだ後から
Create を呼ぶ間に以下の処理をして原点からウインドウの幅分だけの矩形情報にする必要があります
cRect.right -= cRect.left;
cRect.bottom -= cRect.top;
cRect.left = 0;
cRect.top = 0;
あと、メインウインドウの子ウインドウにした場合は ScreenFlip をすると Flash の映像と競合して画面が
チカチカしてしまうので、swfを再生中は ScreenFlip をしないようにする必要があります
・Win32APIやATLに関してほとんど分かっていないので、きちんとしたコードになっているかどうかが分からない
すいません、私にもわかりません(汗)
上記変更を加えさせていただいた main.cpp は以下の通りです
よろしければお試し下さい
#include "DxLib.h"
#include <atlbase.h>
#include <atlwin.h>
#import "c:\WINDOWS\system32\macromed\flash\Flash10e.ocx" rename_namespace("Flash") named_guids
CComModule _Module;
class c_FlashW : public CWindowImpl<c_FlashW,CAxWindow>
{
public:
DECLARE_WND_SUPERCLASS("c_FlashW", CAxWindow::GetWndClassName());
CComPtr<Flash::IShockwaveFlash> m_cFla;
c_FlashW() { };
virtual ~c_FlashW() { };
// ウインドウ生成
HWND Create()
{
AtlAxWinInit();
RECT cRect; GetWindowCRect(&cRect);
cRect.right -= cRect.left;
cRect.bottom -= cRect.top;
cRect.left = 0;
cRect.top = 0;
CWindowImpl<c_FlashW, CAxWindow>::
Create(GetMainWindowHandle(), cRect, NULL, WS_CHILD | WS_VISIBLE);
if (m_hWnd) {
// Flash OCX 読み出し
LPOLESTR clsid = NULL;
StringFromCLSID(Flash::CLSID_ShockwaveFlash, &clsid);
CreateControl(clsid);
CoTaskMemFree(clsid);
HRESULT hRes = QueryControl(&m_cFla);
m_cFla->Menu=false;
}
return m_hWnd;
}
// メッセージハンドラの列挙
BEGIN_MSG_MAP(c_FlashW)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
END_MSG_MAP()
LRESULT OnDestroy(UINT, WPARAM, LPARAM, BOOL&){
// PostQuitMessage(0);
return 0;
}
void Movie(LPCTSTR AddrBuf){
if(m_cFla){
char addr[256];
GetCurrentDirectory(256,addr);
sprintf_s(addr,256,"%s%s%s",addr,"\\",AddrBuf);
m_cFla->put_Movie(CComBSTR(addr));
}
}
void Play(){
if(m_cFla) m_cFla->Play();
}
void Stop(){
if(m_cFla) m_cFla->Stop();
}
int IsPlay() {
if(m_cFla) return m_cFla->IsPlaying();
else return 0;
}
};
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
// COMモジュール初期化
_Module.Init(NULL, hInstance);
ChangeWindowMode( TRUE );
SetAlwaysRunFlag( TRUE );
if(DxLib_Init()==-1||SetDrawScreen(DX_SCREEN_BACK)!=0) return -1; // 初期化
printfDx("Press Any Key to Load Flash Movie\n");
ScreenFlip(); WaitKey();
c_FlashW flash;
HWND FlashWnd = flash.Create();
SetActiveWindow(GetMainWindowHandle());
// ファイル指定(同時に再生がはじまる)
flash.Movie("testvc.swf");
flash.Play();
while(!ProcessMessage()&&!CheckHitKey(KEY_INPUT_ESCAPE)) {
if (!flash.IsPlay()) break;
}
printfDx("Movie End.");
ShowWindow(FlashWnd,SW_HIDE);
DestroyWindow(FlashWnd);
ScreenFlip();
WaitKey();
_Module.Term();
DxLib_End();
return 0;
}
因みに再生するだけでしたら一見する限りでは機能的には現状で十分だと思います
DXライブラリに組み込むとなると大作業過ぎますので、今のところ予定はありません
( というか、こんな風にFlashを再生できるということを今日知ったばかりなので予定は未定という感じです・・・ )