环境是win2k 
      vc++6.0 
目的显示半透明的位图。
我买了一本书《动感设计》是里面的例子。我看懂了就是做不出来。照书上的做就有错误。请大家帮帮我解决呀!我放在网上呢?不大。
http://www.sdj.cc/tm.zip解决了发到我的邮箱里或发到这里大家一起看吧 
[email protected]

解决方案 »

  1.   

    关键的部分程序。 
    canvasFrame::limpid(CDC *dc) 

    BITMAP bm; 
    int x,y,s,t,m,i=0; 
    GetClientRect(&rect); 
    mdc = new CDC;         
    bitmap = new CBitmap; 
    bgbmp = new CBitmap; 
    mdc->CreateCompatibleDC(dc); 
    bgbmp->m_hObject = (HBITMAP)::LoadImage(NULL,"bground.bmp",IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE); 
    bitmap->m_hObject = (HBITMAP)::LoadImage(NULL,"girl.bmp",IMAGE_BITMAP,298,329,LR_LOADFROMFILE); 
    bitmap->GetObject(sizeof(BITMAP),&bm); 
    unsigned char *px = new unsigned char[bm.bmHeight*bm.bmWidthBytes]; 
    bitmap->GetBitmapBits(bm.bmHeight*bm.bmWidthBytes,px); 
    s = bm.bmHeight; 
    t = bm.bmWidth; 
    m = bm.bmWidthBytes; 
    for(y=0;y<bm.bmHeight;y++) 
    for(x=0;x<bm.bmWidth;x++) 

    px[x*3+y*bm.bmWidthBytes] *= 0.5; 
    px[x*3+1+y*bm.bmWidthBytes] *= 0.5; 
    px[x*3+2+y*bm.bmWidthBytes] *= 0.5; } 
    bitmap->SetBitmapBits(bm.bmHeight*bm.bmWidthBytes,px);  
    bgbmp->GetObject(sizeof(BITMAP),&bm); 
    unsigned char *py = new unsigned char[bm.bmHeight*bm.bmWidthBytes]; 
    bgbmp->GetBitmapBits(bm.bmHeight*bm.bmWidthBytes,py); 
    for(y=100;y<100+s;y++) 

    i = (y-100)*m; 
    for(x=100;x<100+t;x++) 

    py[x*3+y*bm.bmWidthBytes] = py[x*3+y*bm.bmWidthBytes]*0.5 + px[i]; 
    py[x*3+1+y*bm.bmWidthBytes] = py[x*3+1+y*bm.bmWidthBytes]*0.5 + px[i+1]; 
    py[x*3+2+y*bm.bmWidthBytes] = py[x*3+2+y*bm.bmWidthBytes]*0.5 + px[i+2]; 
    i=i+3; 


    bgbmp->SetBitmapBits(bm.bmHeight*bm.bmWidthBytes,py); 
    mdc->SelectObject(bgbmp); 
    delete px; 
    delete py; 
    }
      

  2.   

    我认为是错的地方。BITMAP bm; 
    可能是这里有问题。我用到bm.bmHeight的时候。输入完bm.后面的就没有自动提示。
      

  3.   

    有什么问题吗?
    我运行了一下,没什么错误阿
    下次请写清楚错误情况还有
    “我认为是错的地方。BITMAP bm; 
    可能是这里有问题。我用到bm.bmHeight的时候。输入完bm.后面的就没有自动提示。
    ”没有提示就把.ncb文件删除,重新编译,就出来了
      

  4.   

    错误提示"0x77fcbb23"指令引用的"0xffffffff8"内存。该内存不能为"read".
    要终止程序,请单击“确定”
    要调试程序,请单击“取消”
      

  5.   

    foxmail(萧遥) 谢谢你!这个问题解决了。还有错误!提示我在上面说了。《我认为是错的地方。BITMAP bm; 
    可能是这里有问题。我用到bm.bmHeight的时候。输入完bm.后面的就没有自动提示。
    没有提示就把.ncb文件删除,重新编译,就出来了》
      

  6.   

    你看看这里
    ////////////////////////////////////////
    for(y=0;y<bm.bmHeight;y++)
    for(x=0;x<bm.bmWidth;x++)
    {
    px[x*3+y*bm.bmWidthBytes] = (unsigned char)px[x*3+y*bm.bmWidthBytes] * 0.5;   
       px[x*3+1+y*bm.bmWidthBytes] = (unsigned char)px[x*3+1+y*bm.bmWidthBytes] *  0.5; 
       px[x*3+2+y*bm.bmWidthBytes] = (unsigned char)px[x*3+2+y*bm.bmWidthBytes] *  0.5; 

    }
    /////////////////////////////////////////////////////////////
    在这里你越界访问内存我改了一下
    ///////////////////////
    for(y=0;y<bm.bmHeight-2;y++)
    for(x=0;x<bm.bmWidth;x++)
    {
    px[x*3+y*bm.bmWidthBytes] = (unsigned char)px[x*3+y*bm.bmWidthBytes] * 0.5;   
       px[x*3+1+y*bm.bmWidthBytes] = (unsigned char)px[x*3+1+y*bm.bmWidthBytes] *  0.5; 
       px[x*3+2+y*bm.bmWidthBytes] = (unsigned char)px[x*3+2+y*bm.bmWidthBytes] *  0.5; 

    }
    ////////////////////////////////////////////////
    但是没有你想要的效果
      

  7.   

    你好!为什么要"bm.bmHeight-2"呢?
      

  8.   

    可是我只要把下面这几行变成注释,程序就可以运行了。但是答不到半透明的效果。
    你说你可以运行。你可以把,你编译好了的程序,给我发过来吗?我想看看,是什么效果。
    [email protected]

    px[x*3+y*bm.bmWidthBytes] *= 0.5; 
    px[x*3+1+y*bm.bmWidthBytes] *= 0.5; 
    px[x*3+2+y*bm.bmWidthBytes] *= 0.5; 
    py[x*3+y*bm.bmWidthBytes] = py[x*3+y*bm.bmWidthBytes]*0.5 + px[i]; 
    py[x*3+1+y*bm.bmWidthBytes] = py[x*3+1+y*bm.bmWidthBytes]*0.5 + px[i+1]; 
    py[x*3+2+y*bm.bmWidthBytes] = py[x*3+2+y*bm.bmWidthBytes]*0.5 + px[i+2]; ”
      

  9.   

    nelark(浆糊) 谢谢你的帮助。
    你运行了,我看到了你给我发的邮件,那张图片怎么那么难看呀!