色々とIDEを作りこんでいる中、グラデーションビットマップを手軽に生成できる関数が欲しくなったので作りました。

最初はLineToなどを使ったら簡単にできるだろうと思っていたのですが、遅さが気がかりに。

悩みながらコーディングをしていたら、最終的に、DIBのビット部分を直接書き込むような処理にまとまりました(ホッ)。

下記のCreateGradationBitmap関数、定義さえしてしまえば使い方はとても簡単です。戻り値にビットマップハンドルがセットされるので、使い終わったらDeleteObjectしてください。

pSizeパラメータにはビットマップのサイズをピクセル単位で指定。color1〜color2に変化するようなグラデーションビットマップが生成されます。

HBITMAP CreateGradationBitmap(SIZE *pSize,COLORREF color1,COLORREF color2){
    //グラデーションビットマップを生成

    BITMAPINFO BitmapInfo;
    memset(&BitmapInfo.bmiHeader,0,sizeof(BITMAPINFOHEADER));
    BitmapInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
    BitmapInfo.bmiHeader.biWidth=pSize->cx;
    BitmapInfo.bmiHeader.biHeight=pSize->cy;
    BitmapInfo.bmiHeader.biPlanes=1;
    BitmapInfo.bmiHeader.biBitCount=24;

    HDC hdc;
    hdc=GetDC(GetDesktopWindow());

    HBITMAP hBitmap;
    BYTE *pByte;
    hBitmap=CreateDIBSection(hdc,&BitmapInfo,DIB_RGB_COLORS,(void **)&pByte,0,0);

    int i,i2,x,y;
    COLORREF rgb;
    i=BitmapInfo.bmiHeader.biWidth*3;
    if(i%sizeof(LONG)!=0) i+=sizeof(LONG)-(i%sizeof(LONG));
    for(y=0;y<BitmapInfo.bmiHeader.biHeight;y++){
        rgb=RGB(
            LOBYTE(LOWORD(color2))+(int)(double)(LOBYTE(LOWORD(color1))-LOBYTE(LOWORD(color2)))*((double)y/(double)BitmapInfo.bmiHeader.biHeight),    //赤要素
            HIBYTE(LOWORD(color2))+(int)(double)(HIBYTE(LOWORD(color1))-HIBYTE(LOWORD(color2)))*((double)y/(double)BitmapInfo.bmiHeader.biHeight),    //緑要素
            LOBYTE(HIWORD(color2))+(int)(double)(LOBYTE(HIWORD(color1))-LOBYTE(HIWORD(color2)))*((double)y/(double)BitmapInfo.bmiHeader.biHeight),    //青要素
            );
        for(x=0;x<BitmapInfo.bmiHeader.biWidth;x++){
            i2=y*i+x*3;
            pByte[i2+2]=LOBYTE(LOWORD(rgb));
            pByte[i2+1]=HIBYTE(LOWORD(rgb));
            pByte[i2]=LOBYTE(HIWORD(rgb));
        }
    }

    DeleteDC(hdc);

    return hBitmap;
}