以上是一个背景透明的COM容器控件,实现拖拽单个文件,进行循环播放歌曲的效果
FLASH透明窗体就是一种透明容器控件,网络上找不到相关的示例和代码,我这里是通过获取主窗口DC,然后传递给控件,在控件的OnDraw里,实现透明叠加的结果,所以没啥技术含量,但是可以达到实际效果就行了。
主程序关键代码
IUnknown* pUnKnwn=0;
pUnKnwn = m_AxWindow.GetControlUnknown();
hr = pUnKnwn->QueryInterface(IID_Ixplay,(void **)&m_pIxplay);
if (!m_pIxplay)
{
::MessageBox(NULL,_T("m_pIxplay==NULL @CMainDlg::OnInitDialog"),_T("Faild"),MB_OK);
return true;
}
if (!m_pMemDC)
{
CPaintDC dc(this);
m_pMemDC = new CDC();
m_pMemDC->CreateCompatibleDC(&dc);
m_memBitmap.DeleteObject();
m_memBitmap.CreateCompatibleBitmap(&dc,m_AxRct.Width(), m_AxRct.Height() );//rt.Width(), rt.Height()
m_OldBitmap = m_pMemDC->SelectObject(&m_memBitmap);
VARIANT varHDC;
varHDC.vt = VT_I4 ;///指明数据类型
varHDC.lVal = (LONG)m_pMemDC->m_hDC;
m_pIxplay->SetAxMemDC(varHDC);
}
m_pIxplay->LoadFile(_T("J:/mp3/励志歌曲/春天里.mp3"));
m_pIxplay->ChangePlayState(0);
控件中OnDraw关键代码
if (m_plyState == Cxplay::PLAYING)
{
::BitBlt(hdc,0,0, nWidth, nHeight, m_hAxDC, 0, 0, SRCCOPY);
CUtil::CreateMaskDC(hdc, 0, 0, nImgWidth, nImgHeight, m_hPauseBg, nImgWidth, nImgHeight);
}else if (m_plyState == Cxplay::PAUSE || m_plyState == Cxplay::STOP)
{
::BitBlt(hdc,0,0, nWidth, nHeight, m_hAxDC, 0, 0, SRCCOPY);
CUtil::CreateMaskDC(hdc, 0, 0, nImgWidth, nImgHeight, m_hPlayBg, nImgWidth, nImgHeight);
}
DEMO下载:xPlayer.rar