从CPictureEx中生出类CLSGif(为了让Gif背景透明),CPictureEx是CStatic生出来的
添加了如下代码,将原来画矩形的代码改成画背景void CLSGif::DrawBackGround()
{
CClientDC clDC(GetParent());
CRect rect; GetWindowRect(rect);
GetParent()->ScreenToClient(rect);
CRect rc(0,0,rect.Width(),rect.Height());
CBrush br(0xff0000);
if (m_dcBack.m_hDC == NULL)
{
m_dcBack.CreateCompatibleDC(&clDC);
m_dcBack.BitBlt(0, 0, rect.Width(), rect.Height(), &clDC, 0, 0, SRCCOPY);
}
::BitBlt(m_hMemDC, 0, 0, rect.Width(), rect.Height(), clDC.m_hDC, 0, 0, SRCCOPY);
}void CLSGif::RefreshBackGround()
{
if(m_dcBack.m_hDC)
m_dcBack.Detach();
}如果只是显示不对也就罢了,关键是关系我现在弄不清楚了
::BitBlt(m_hMemDC, 0, 0, rect.Width(), rect.Height(), clDC.m_hDC, 0, 0, SRCCOPY);
可以画出背景上的图来,但是我明明BitBlt到 CDC m_dcBack 中去了的,如果换成
::BitBlt(m_hMemDC, 0, 0, rect.Width(), rect.Height(), clDC.m_hDC, 0, 0, SRCCOPY);
就不行了,根本就没有画背景而且即使用clDC.m_hDC的时候,如果在PrepareDC中画,那么最开始得到的居然是工具栏和客户区的位图,但只有一张图是这样的,Gif图形放到下一帧时,又是对话框的内容了,这样按理说应该就正常了,但是用GetParent()的客户区得到的图形居然包含了CStatic本身的内容
我应该如何修改啊,现在开始郁闷了!

解决方案 »

  1.   

    GetParent()
    -> GetParentOwner()
      

  2.   

    用了GetParentOwner()
    死得非常惨!!!
      

  3.   

    用GetParentOwner()之后,刚开始的时候还是工具栏和客户区的位图
    我在 PrepareDC 中用 DrawBackGround(); 初始化背景位图,也就是看到工具栏和客户区的位图,第二次就要出错,但是用GetParent()不会错误信息:
    File:wincore.cpp
    Line:879应用程序发生异常unknown software exception(0x800000003),位置为0x77f9f9df
    要终止程序,请单击“确定”
                 [确定]哈哈!
    另外,CButtonST 中的绘制背景的方法也是这个,只不过不是在 PrepareDC 中初始化。
      

  4.   

    http://www.codeguru.com/bitmap/TransparentImage.shtml
    有個bmp透明的例子.也許對你有幫助.
      

  5.   

    谢谢 YP2002CN(老婆我不敢了,老婆我愛你) (2 stars)
    BMP透明的例子我看过,但是和这个实现不一样
      

  6.   

    源代码和应用程序我放到我主页上
    http://www15.brinkster.com/qrao/aidb.rar
    哪位有空的话,帮忙研究研究,不甚感激
      

  7.   

    老兄,代码那么多,虽然我最终改的不多,但却好难找啊!花了我两个小时,
    话不多说了,相信你一看就明白。记得给分。刚弹出对话框那时有一下白色,你知道的,显示动画时父窗还没有背景图片。void CLSGif::DrawBackGround()
    {
    ShowWindow(0);
    CRect rect;
    GetWindowRect(rect);
    GetParent()->ScreenToClient(rect);
    GetParent()->InvalidateRect(rect);
    GetParent()->UpdateWindow();
    CClientDC clDC(GetParent());
    CBrush br(0xff0000);
    ::BitBlt(m_hMemDC, 0, 0, rect.Width(), rect.Height(), clDC.m_hDC, rect.left, rect.top, SRCCOPY);
        ShowWindow(1);
    }
      

  8.   

    强烈感谢hnyyy(前进)
    由于断网几天了,今天才来结贴,抱歉!!