近日朋友問在VC中如何控制Flash文件,俺也沒有做過以前,俺是新手再次聲明,很菜的,嘿嘿,但俺也期望成為大俠,能夠叱詫風雲,仗劍行走江湖,路遇不平排憂解難,英雄美女,朝陽晚霞,青山綠水。。。哈,不好意思,寫著寫著就歪了。但恐怕所有Man都有過這個理想吧。
轉入正題,嗯。。。對了,朋友有難不能不幫,況且還是位MM,哈。。。俺只好上網找資料了,在baidu搜了一下資料不是很多啊,後來看到有一個用vb做的DIY flash播放器的,就看了一下(就是下面貼的這個)。實現步驟挺簡單的,使用ShockwaveFlash控件實現,轉化成vc實現。
嚯嚯。。。可以向MM邀功了。。。
實現步驟如下:
1。新建一個基於對話框的程序,添加變量:
int m_nTimer; //Timer時間控制
bool timerflag; //Timer啟用的標志
bool screenflag; //全屏的標志
bool playflag; //有無文件打開的標志
CRect flashrect; //記錄ShockwaveFlash組件的矩形區域
WINDOWPLACEMENT m_FlashPos; //記錄ShockwaveFlash組件的狀態
WINDOWPLACEMENT m_WndPos; //記錄對話框窗口的狀態
在對話框的構造函數中將所有bool變量賦值為FALSE。
2。在窗體上添加按鈕(為了實現簡單,俺的功能調用都是通過按鈕實現的),設置Capture分別為:“打開” 、“播放”、“暫停”、“停止”、“重播”、“後退”、“前進”、“末幀”、“快退”、“快進”、“放大”、“縮小”、“還原”、“關閉”、“全屏”。
3。添加一個Shockwaveflash控件,為Shockwaveflash控件添加變量Flash;添加一個CSliderCtrl控件,ID為IDC_SLIDER1。
4。為各個按鈕添加處理代碼:
“打開”按鈕代碼:
char szFilters[]="MyType Files (*.swf)|*.swf||";
CFileDialog fileDlg (TRUE, "swf", "*.swf",OFN_FILEMUSTEXIST| OFN_HIDEREADONLY,szFilters, this);
if( fileDlg.DoModal ()==IDOK )
{
CString pathName = fileDlg.GetPathName();
Flash.put_MovIE(pathName);
playflag=TRUE;
if(!timerflag)
{
m_nTimer=SetTimer(1,100,0); //開啟計時器
timerflag=!timerflag;
}
}
“播放”按鈕代碼:
Flash.Play();
“暫停”按鈕代碼:
Flash.Stop();
“停止”按鈕代碼:
Flash.Rewind();
Flash.Stop();
“重播”按鈕代碼:
Flash.Rewind();
Flash.Play();
“後退”按鈕代碼:
Flash.Back();
“前進”按鈕代碼:
Flash.Forward();
“末幀”按鈕代碼:
flash.GotoFrame(Flash.get_TotalFrames()-1);
“快退”按鈕代碼:
int current=Flash.CurrentFrame();
if(current>4)
{
current-=5;
Flash.GotoFrame(current);
}
else
{
Flash.put_FrameNum(0);
}
“快進”按鈕代碼:
int current=Flash.CurrentFrame();
int i=Flash.get_FrameNum();
if(current<Flash.get_TotalFrames()-5)
{
current+=5;
Flash.GotoFrame(current);
}
else
{
flash.put_FrameNum(Flash.get_TotalFrames()-1);
}
“放大”按鈕代碼:
Flash.Zoom(50);
“縮小”按鈕代碼:
Flash.Zoom(200);
“還原”按鈕代碼:
Flash.Zoom(0);
“關閉”按鈕代碼:
Flash.put_MovIE("http://");
KillTimer(m_nTimer); //停止計時器
CSliderCtrl *m_pSlider=(CSliderCtrl*)GetDlgItem(IDC_SLIDER1);
m_pSlider->SetPos(0); //滑塊置零
timerflag=FALSE;////////////////////////////////
playflag=FALSE;////////////////////////////////
5。添加Slider 控件的消息處理函數PreTranslateMessage()響應的消息NM_RELEASEDCAPTURE
CSliderCtrl *m_pSlider=(CSliderCtrl*)GetDlgItem(IDC_SLIDER1);
int num=m_pSlider->GetPos();
num=num*Flash.get_TotalFrames()/100;
Flash.GotoFrame(num);
////////////////////////////////////////////////////////////////////////////////////
將下面代碼添加到,Dialog類的OnInitDialog()函數中
CSliderCtrl *m_pSlider=(CSliderCtrl*)GetDlgItem(IDC_SLIDER1);
m_pSlider->SetRange(0,100); //設定Slider的活動范圍是0~100
6。添加Dialog類的OnTimer()函數響應消息WM_TIMER
在OnTimer()函數中添加代碼:
CSliderCtrl *m_pSlider=(CSliderCtrl*)GetDlgItem(IDC_SLIDER1);
m_pSlider->SetPos(flash.CurrentFrame()*100/Flash.get_TotalFrames());
7。在Dialog類的DestroyWindow()函數中添加代碼:
if(timerflag)
KillTimer(m_nTimer);
8。“全屏”按鈕代碼:
if(!screenflag && playflag)
{
GetWindowPlacement(&m_WndPos);
flash.GetWindowPlacement(&m_FlashPos);
flash.GetWindowRect(Flashrect);
CSliderCtrl *m_pSlider=(CSliderCtrl*)GetDlgItem(IDC_SLIDER1);
m_pSlider->ShowWindow(SW_HIDE );
HWND hwnd=this->GetSafeHwnd();
LONG style=GetWindowLongPtr(hwnd,GWL_STYLE);
SetWindowLongPtr(hwnd,GWL_STYLE,style-WS_CAPTION );
CClIEntDC dc(this);
this->MoveWindow(0,0,dc.GetDeviceCaps(HORZRES),dc.GetDeviceCaps(VERTRES));
Flash.SetWindowPos(&CWnd::wndTop ,0,0,dc.GetDeviceCaps(HORZRES),dc.GetDeviceCaps(VERTRES),SWP_SHOWWINDOW);
screenflag=TRUE;////////////////////
}
9。響應按鍵ESC消息,取消全屏。
重載對話框的PreTranslateMessage()函數,在函數中添加如下代碼:
if(pMsg->message == WM_KEYDOWN)
{
if(pMsg->wParam==VK_ESCAPE)
{
if(screenflag)
{
HWND hwnd=this->GetSafeHwnd();
LONG style=GetWindowLongPtr(hwnd,GWL_STYLE);
SetWindowLongPtr(hwnd,GWL_STYLE,style+WS_CAPTION );
ShowWindow(SW_HIDE);
SetWindowPlacement(&m_WndPos);
flash.MoveWindow(flashrect.left,flashrect.top,flashrect.Width(),Flashrect.Height(),1);
flash.SetWindowPlacement(&m_FlashPos);
screenflag=FALSE;
CSliderCtrl *m_pSlider=(CSliderCtrl*)GetDlgItem(IDC_SLIDER1);
m_pSlider->ShowWindow(SW_SHOW );
}
}
}
全屏和取消全屏的代碼,是俺自己拼湊所得,充其量只是個模擬效果,而且還是個模擬的不好的效果,如果有高手見到,希望能夠博您一笑。另外,在笑過之後還請您不吝賜教。俺一定以十二億萬分的熱情接受。