各位大侠,我想在点击后插入一张bmp的透明图像(能够看背景的)该怎么做?以下是代码,但是不能显示,请帮忙改改。谢谢了。
case WM_LBUTTONDOWN:
  {
hStaBitmap = LoadBitmap(m_hInstance, MAKEINTRESOURCE(IDB_STATICBK));
HDC hdc = GetDC(NULL);
           g_hStaticDC = CreateCompatibleDC(hdc);
           g_hOldBmp = SelectObject(g_hStaticDC, hStaBitmap);
    HDC hdc2 = GetDC(hWnd);
hBackDC = CreateCompatibleDC(hdc);
    BLENDFUNCTION bf;
bf.AlphaFormat=0;
bf.BlendFlags=0;
bf.BlendOp=AC_SRC_OVER;
bf.SourceConstantAlpha=100;//透明度0-255
AlphaBlend(hBackDC,0,44,320,80,g_hStaticDC,0,0,320,80,bf);
           ReleaseDC(NULL, hdc);
    ReleaseDC(NULL, hdc2);
  }
 break;

解决方案 »

  1.   

    AlphaBlend(hdc2,0,44,320,80,g_hStaticDC,0,0,320,80,bf);
      

  2.   

    hBackDC = CreateCompatibleDC(hdc);
    AlphaBlend(hBackDC,0,44,320,80,g_hStaticDC,0,0,320,80,bf);
    =========
    看不明白你的代码啊,你在AlphaBlend中设的目标DC是hBackDc,这个是一个内存DC,当然显示不出来了。
      

  3.   

    改成这样吧:
    case WM_LBUTTONDOWN:
    {
    hStaBitmap = LoadBitmap(m_hInstance, MAKEINTRESOURCE(IDB_STATICBK));
    HDC hdc = GetDC(NULL); 
      g_hStaticDC = CreateCompatibleDC(hdc);
      g_hOldBmp = SelectObject(g_hStaticDC, hStaBitmap);
    HDC hdc2 = GetDC(hWnd);
    //hBackDC = CreateCompatibleDC(hdc);//这个没用
    BLENDFUNCTION bf;
    bf.AlphaFormat=0;
    bf.BlendFlags=0;
    bf.BlendOp=AC_SRC_OVER;
    bf.SourceConstantAlpha=100;//透明度0-255
    AlphaBlend(hdc2,0,44,320,80,g_hStaticDC,0,0,320,80,bf);
      ReleaseDC(NULL, hdc);
    ReleaseDC(NULL, hdc2);
    }
    break;
      

  4.   

    不用内存建立兼容DC,直接画到目的DC上即可.
    //hBackDC = CreateCompatibleDC(hdc);
    然后
    AlphaBlend(hdc2,0,44,320,80,g_hStaticDC,0,0,320,80,bf);
      

  5.   

    也可以用双缓冲方式实现:
    HBITMAP hStaBitmap,g_hOldBmp,hABC;
    HDC hdc,hdc2,g_hStaticDC,hBackDC;
    BLENDFUNCTION bf;hStaBitmap = LoadBitmap(g_Ins, MAKEINTRESOURCE(IDB_STATICBK));hdc = GetDC(NULL); 
    g_hStaticDC = CreateCompatibleDC(hdc);
    g_hOldBmp = SelectObject(g_hStaticDC, hStaBitmap);
    hdc2 = GetDC(hWnd);
    hBackDC = CreateCompatibleDC(hdc2);
    //增加1 为内容DC建立画布
    hABC = CreateCompatibleBitmap(hdc2,320,80);
    SelectObject(hBackDC, hABC);
    bf.AlphaFormat=0;
    bf.BlendFlags=0;
    bf.BlendOp=AC_SRC_OVER;
    bf.SourceConstantAlpha=100;//透明度0-255
    AlphaBlend(hBackDC,0,0,320,80,g_hStaticDC,0,0,320,80,bf);
    //增加2 把内存DC画到目的DC
    BitBlt(hdc2,0,0,200,200,hBackDC,0,0,SRCCOPY);
    ReleaseDC(NULL, hdc);
    ReleaseDC(hwnd, hdc2);
    DeleteObject(hABC);
    DeleteDC(hBackDC);
    DeleteDC(g_hStaticDC);
      

  6.   

    多谢上面的各位,问题已解决了,现在我想在这个透明图像上添加控件,要得到该透明图像的hdc,从而设置控件的背景,该怎么做?
    不好意思,我是新手,拜托大家了。
      

  7.   

    在要给控件加背景的事件脚本里面:
      把上面的代码修改一下即可
       hdc2 = GetDC(hWnd);//hWnd->改为控件句柄.
    其他不变.
      

  8.   

     还原原来的背景,让系统重画下窗口:
      InvalidateRect(hwnd,NULL,TRUE);