• 10103阅读
  • 11回复

刷新窗体时,APlayer控件区为窗体背景,为什么? [复制链接]

上一主题 下一主题
离线awithing
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2016-02-22
我是第一次用这个控件,平台是VS2008 MFC,播放音乐时候如果将窗体最小化,然后再还原窗体时,APlayer控件区域为窗体背景,这是为什么?放电影或带歌词显示时不会出现此情况。
我强行刷新控件区域也不行。
有人遇到过这样的问题吗?求解决办法。
离线aplayer

只看该作者 沙发  发表于: 2016-02-23
是否你的 APlayer 窗口设置成了视频大小,而这时为音频,视频大小为 0x0 所以看不到了?
如果还有问题,把你能重现问题的框架代码发给我(不要全部),我这边来试试看。
离线awithing

只看该作者 板凳  发表于: 2016-02-23
回 aplayer 的帖子
aplayer:
是否你的 APlayer 窗口设置成了视频大小,而这时为音频,视频大小为 0x0 所以看不到了?
如果还有问题,把你能重现问题的框架代码发给我(不要全部),我这边来试试看。

BOOL CDemoDlg::OnInitDialog()
{
...

CWnd *pWnd;
    pWnd=GetDlgItem(IDC_PLAYER1);
    if(pWnd)
    {
        pWnd->SetWindowPos( NULL,0,30,675,355,SWP_NOZORDER); //把按钮移到窗口的
    }
}


void CDemoDlg::OnSize(UINT nType, int cx, int cy)
{
    CDialog::OnSize(nType, cx, cy);

// TODO: 在此处添加消息处理程序代码  
    CWnd *pWnd;
    pWnd=GetDlgItem(IDC_BUTTON8);  //全屏/退出全屏 按钮
    if(pWnd)
    {
        pWnd->SetWindowPos( NULL,cx-25,cy-25,0,0,SWP_NOZORDER | SWP_NOSIZE ); //把按钮移到窗口的
    }
    pWnd=GetDlgItem(IDC_PLAYER1);
    if(pWnd)
    {
        if(FullScreen)
        {
            pWnd->SetWindowPos( NULL,0,0,cx,cy-50,SWP_NOZORDER);
        }else
        {
            pWnd->SetWindowPos( NULL,0,30,cx,cy-80,SWP_NOZORDER);
        }
    }
    pWnd=GetDlgItem(IDC_BUTTON1);
    if(pWnd)
    {
        pWnd->SetWindowPos( NULL,cx/2-13,cy-28,0,0,SWP_NOZORDER | SWP_NOSIZE); //把按钮移到窗口的
    }
    pWnd=GetDlgItem(IDC_BUTTON2);
    if(pWnd)
    {
        pWnd->SetWindowPos( NULL,cx/2-41,cy-28,0,0,SWP_NOZORDER | SWP_NOSIZE); //把按钮移到窗口的
    }
    pWnd=GetDlgItem(IDC_BUTTON3);
    if(pWnd)
    {
        pWnd->SetWindowPos( NULL,cx/2+15,cy-28,0,0,SWP_NOZORDER | SWP_NOSIZE); //把按钮移到窗口的
    }
    pWnd=GetDlgItem(IDC_BUTTON7);
    if(pWnd)
    {
        pWnd->SetWindowPos( NULL,cx-36,0,0,0,SWP_NOZORDER | SWP_NOSIZE); //把按钮移到窗口的
    }
    pWnd=GetDlgItem(IDC_BUTTON6);
    if(pWnd)
    {
        pWnd->SetWindowPos( NULL,cx-65,0,0,0,SWP_NOZORDER | SWP_NOSIZE); //把按钮移到窗口的
    }
    pWnd=GetDlgItem(IDC_PlayTime);  //静态文件本(播放时间进度)
    if(pWnd)
    {
        pWnd->SetWindowPos( NULL,60,cy-19,0,0,SWP_NOZORDER | SWP_NOSIZE); //把按钮移到窗口的
    }
    pWnd=GetDlgItem(IDC_PlayTotalTime); //静态文件本(总播放时间)
    if(pWnd)
    {
        pWnd->SetWindowPos( NULL,138,cy-19,0,0,SWP_NOZORDER | SWP_NOSIZE); //把按钮移到窗口的
    }
    pWnd=GetDlgItem(IDC_PlayState); //静态文件本(总播放时间)
    if(pWnd)
    {
        pWnd->SetWindowPos( NULL,6,cy-19,0,0,SWP_NOZORDER | SWP_NOSIZE); //把按钮移到窗口的
    }
}


BOOL CDemoDlg::OnEraseBkgnd(CDC* pDC)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    
    CBitmap m_bitmap;
    BITMAP m_bmInfo;
    m_bitmap.LoadBitmap(IDB_BK);
    m_bitmap.GetObject(sizeof(m_bmInfo),&m_bmInfo);

    //    CDC* pDC=GetDC();
    CDC dc;
    dc.CreateCompatibleDC(pDC);
    dc.SelectObject(&m_bitmap);
    //pDC->SelectObject(&m_bitmap);
    CRect m_rect;
    GetClientRect(&m_rect);
    pDC->StretchBlt(0,0,m_rect.Width(),m_rect.Height(),&dc,0,0,m_bmInfo.bmWidth,m_bmInfo.bmHeight,SRCCOPY);
    dc.DeleteDC();
/*    static int a=0;
    a++;
    CString str;
    str.Format("%d",a);
    TRACE("OnEraseBkgnd(CDC* pDC) "+str+"\r\n");
*/    return true;//返回真

//    return CDialog::OnEraseBkgnd(pDC);
}

以上是部分代码
离线awithing

只看该作者 地板  发表于: 2016-02-23
顺便说下,在原来控件区域再点下鼠标右键,能恢复正常显示。
离线aplayer

只看该作者 4楼 发表于: 2016-02-23
对 APlayer 的父窗口增加 WS_CLIPCHILDREN 的风格试试看。
离线awithing

只看该作者 5楼 发表于: 2016-02-24
回 aplayer 的帖子
aplayer:对 APlayer 的父窗口增加 WS_CLIPCHILDREN 的风格试试看。 (2016-02-23 23:58) 

不行的。其化控件背景就不刷新了。
离线awithing

只看该作者 6楼 发表于: 2016-02-24
哈哈,我终于找到原因了。程序很小的改动就好了。
离线aplayer

只看该作者 7楼 发表于: 2016-02-24
回 awithing 的帖子
awithing:哈哈,我终于找到原因了。程序很小的改动就好了。 (2016-02-24 15:04) 

如果可以,请分享给大家,多谢。
离线awithing

只看该作者 8楼 发表于: 2016-02-25
回 aplayer 的帖子
aplayer:如果可以,请分享给大家,多谢。 (2016-02-24 22:40) 

我也是在无意中才发现的。
其实很简单,就是在OnSize函中关于调整APlayer控件的代码放在函数尾部。问题就解决了。
不知道控件本身在这方面能否改进一下。
离线awithing

只看该作者 9楼 发表于: 2016-02-25
顺便问下,在C#中,如何使用APlayerUI,不知道能否给份实例学习一下。
快速回复
限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
上一个 下一个