其余的控件button啊,comobox等等都可以正常显示,就是mediaplayer这个控件会被背景图片覆盖,不知道怎么解决,我逛帖子看到有哥们说刷完背景图片后invidate()控件,我试过,还是不能显示出来,我确定是背景图片把他覆盖了,我去掉背景图片之后就能显示出来onpaint代码如下,求各位大虾帮忙

解决方案 »

  1.   


    void CMediaPlayerDlg::OnPaint()
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作矩形中居中
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标
    dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
    //用bitmap做背景
    CPaintDC dc(this); 
    CRect rect;
    GetClientRect(&rect);   
    CDC dcMem;   
    dcMem.CreateCompatibleDC(&dc);   
    CBitmap bmpBackground;   
    bmpBackground.LoadBitmap(IDB_BITMAP1);     BITMAP bitmap;   
    bmpBackground.GetBitmap(&bitmap);   
    CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);   
    dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,   
    bitmap.bmWidth,bitmap.bmHeight,SRCCOPY); //CWnd *a;
    //CRect rect1;
    //a = GetDlgItem(IDC_OCX2);
    //a->GetWindowRect(&rect1);
    //InvalidateRect(&rect1,TRUE);
    }
    }这是我的onpaint函数,注释的部分是我尝试着invalidate控件, IDC_OCX2是mediaplayer的id,如果打开注释,程序会报错。
      

  2.   

    invalidate放在OnPaint里面会进入递归死循环的,不行的,需要放外面。不过你mediaplayer这么控件怎么建立的?
    有没有加WS_CHILD?
    父窗体要加WS_CLIPCHILDREN属性
      

  3.   

    嗯,父窗口设定ws_clipchildren属性之后整个对话框都是黑色,不能显示背景图片了,而且设置后也没显示mediaplayer,还有,我是直接的工具箱里把mediaplayer控件拖拽上去的
      

  4.   

    问题自己解决了,另一个帖子也有同样的问题,顺便回答了
    把添加背景图片的函数写在OnEraseBkgnd()函数里。
    之前纠结是因为写在OnEraseBkgnd()时前面添加了一句CPaintDC dc(this),死活出不来
    实际上是不需要加的,加了就出不来了
    添加完后 return true就行了,楼主请结帖
    OnEraseBkgnd(CDC *pdc)
    {
    CRect rect;
    GetClientRect(&rect);   
    CDC dcMem;   
    dcMem.CreateCompatibleDC(pdc);   
    CBitmap bmpBackground;   
    bmpBackground.LoadBitmap(IDB_BITMAP1);   BITMAP bitmap;   
    bmpBackground.GetBitmap(&bitmap);   
    CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);   
    pdc->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,   
    bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
    return true;
    }