alphaBlendについて

[戻る]
TKO 2009/12/09(水) 04:50:29
bool Drawbmp(HWND hwnd,HBITMAP hBitmap ,int alpha, int size)
というビットマップをalpha値と拡大サイズ決めて表示させる関数を作ったのですが
ビットマップが半透明になって表示されません。拡大されてそのまま表示されます

プログラムは以下です
本文でalpha値をだんだん小さくして出てきたビットマップをだんだん消えていくように表示させるプログラムです

 for(int i=255;;i--){
                   Drawbmp(hWnd,hBitmap,i,3);
                   Sleep(1);
                   if(i==0)break;
                   }

以下が関数です

bool Drawbmp(HWND hwnd,HBITMAP hBitmap ,int alpha, int size)
{
    HDC hdc;
    HDC hmdc;
    
    BITMAP bmp;
    int BMP_W, BMP_H;
    BLENDFUNCTION blendFunction;

    hdc = GetDC(hwnd);
    GetObject(hBitmap, sizeof(BITMAP), &bmp);
    BMP_W = (int)bmp.bmWidth;
    BMP_H = (int)bmp.bmHeight;
    hmdc = CreateCompatibleDC(hdc);
    SelectObject(hmdc, hBitmap);

        SelectObject(hmdc, hBitmap);
        
        
        blendFunction.BlendOp             = AC_SRC_OVER;
        blendFunction.BlendFlags          = 0;
        blendFunction.AlphaFormat         = 0;
        blendFunction.SourceConstantAlpha = alpha;

    
        FillRgn( hdc, hrgn, hbr);//全面を消す
        
        AlphaBlend(hdc, MyPoint.NowPoint.x-300, MyPoint.NowPoint.y-300, 
BMP_W*size, BMP_H*size, hmdc, 0, 0, BMP_W, BMP_H, blendFunction);
    
    
    DeleteDC(hmdc);
    DeleteObject(hBitmap);
    ReleaseDC(hwnd, hdc);

    return true;
}

よろしくお願いします

ryo 2009/12/09(水) 10:03:26
使用しているBMPが32ビットカラーなら、

        blendFunction.AlphaFormat         = AC_SRC_ALPHA;

で、試してみてください

bun 2009/12/09(水) 11:46:37
足りない部分を補いつつ、以下のコードで動作しました。

元々、関数内で、
  DeleteObject(hBitmap);
していたのが原因ではないかと?

その場合、Drawbmp() 関数呼び出し前に毎回ビットマップをロードし直さねば
なりません。

bool Drawbmp(HWND hwnd,HBITMAP hBitmap ,int alpha, int size)
{
    HDC hdc;
    HDC hmdc;
    
    BITMAP bmp;
    int BMP_W, BMP_H;
    BLENDFUNCTION blendFunction;

    hdc = GetDC(hwnd);
    GetObject(hBitmap, sizeof(BITMAP), &bmp);
    BMP_W = (int)bmp.bmWidth;
    BMP_H = (int)bmp.bmHeight;
    hmdc = CreateCompatibleDC(hdc);
    SelectObject(hmdc, hBitmap);

    blendFunction.BlendOp             = AC_SRC_OVER;
    blendFunction.BlendFlags          = 0;
    blendFunction.AlphaFormat         = 0;
    blendFunction.SourceConstantAlpha = alpha;
    
    RECT Rect;
    GetClientRect(hwnd, &Rect);
    FillRect( hdc, &Rect, (HBRUSH)(COLOR_WINDOW+1));
        
    AlphaBlend(hdc, 20, 20, 
        BMP_W*size, BMP_H*size, hmdc, 0, 0, BMP_W, BMP_H, blendFunction);
   
    DeleteDC(hmdc);
//  DeleteObject(hBitmap);
    ReleaseDC(hwnd, hdc);

    return true;
}

TKO 2009/12/11(金) 16:08:14
[[解決]]
DeleteObject(hBitmap);
消したらできましたありがとうございます

古いスレッドには追加発言できません。