Winapi CreateDIBSection+;16位系统颜色

Winapi CreateDIBSection+;16位系统颜色,winapi,Winapi,此代码在32位系统颜色(Windows 7)上运行非常完美, 但它不适用于16位彩色-菜单位图不透明!!!: ... HBITMAP rv = rgb(hsrc, 16); ... HBITMAP rgb(HBITMAP hsrc, WORD wBitsPixel) { HBITMAP hold = NULL; HDC hdcsrc = NULL, hdc = NULL; BITMAP bmp = {0}; HBITMAP dib = NULL; UC

此代码在32位系统颜色(Windows 7)上运行非常完美, 但它不适用于16位彩色-菜单位图不透明!!!:

...
HBITMAP rv = rgb(hsrc, 16);
...

HBITMAP rgb(HBITMAP hsrc, WORD wBitsPixel) {

    HBITMAP hold = NULL;
    HDC hdcsrc = NULL, hdc = NULL;
    BITMAP bmp = {0};
    HBITMAP dib = NULL;
    UCHAR *dst = NULL, *src = NULL, *tmp = NULL;
    UCHAR alpha;
    int bpl;
    ULONG x, y;
    DWORD bmp_size = 0;
    HANDLE hdib = NULL;
    char *lpbitmap = NULL;
    int rv = 0;


    hdc    = GetDC(m_hMainDlg);
    hdcsrc = CreateCompatibleDC(hdc);
    hold   = (HBITMAP)SelectObject(hdcsrc, hsrc);
    rv     = GetObject(hsrc, sizeof(BITMAP), &bmp);

    BITMAPINFOHEADER bi = {0};
    bi.biSize          = sizeof(BITMAPINFOHEADER);
    bi.biWidth         = bmp.bmWidth;;
    bi.biHeight        = bmp.bmHeight;
    bi.biPlanes        = 1;
    bi.biBitCount      = wBitsPixel;
    bi.biCompression   = BI_RGB;
    bi.biSizeImage     = 0;
    bi.biXPelsPerMeter = 0;
    bi.biYPelsPerMeter = 0;
    bi.biClrUsed       = 0;
    bi.biClrImportant  = 0;

    bmp_size = ((bmp.bmWidth * bi.biBitCount + 31) / 32) * 4 * bmp.bmHeight;
    hdib = GlobalAlloc(GHND, bmp_size);

    lpbitmap = (char *)GlobalLock(hdib);

    /* Get bits of source bitmap. */
    GetDIBits(hdcsrc, hsrc, 0, bmp.bmHeight, lpbitmap, (BITMAPINFO *)&bi, DIB_RGB_COLORS);

    /* For destination bitmap */
    BITMAPINFO bmi = {0};
    bmi.bmiHeader.biSize          = sizeof(BITMAPINFO);
    bmi.bmiHeader.biWidth         = bmp.bmWidth;
    bmi.bmiHeader.biHeight        = bmp.bmHeight;
    bmi.bmiHeader.biPlanes        = 1;
    bmi.bmiHeader.biBitCount      = wBitsPixel;
    bmi.bmiHeader.biCompression   = BI_RGB;
    bmi.bmiHeader.biSizeImage     = 0;
    bmi.bmiHeader.biXPelsPerMeter = 0;
    bmi.bmiHeader.biYPelsPerMeter = 0;
    bmi.bmiHeader.biClrUsed       = 0;
    bmi.bmiHeader.biClrImportant  = 0;

    dib = CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, (void **)&dst, NULL, 0);

    bpl = 4 * bmp.bmWidth; /* bytes per line */
    src = (UCHAR *)lpbitmap;
    for (y = 0; y < bmp.bmHeight; y++, src += bpl) {
        tmp = src;
        for (x = 0; x < bmp.bmWidth; x++) {
            alpha  = tmp[3];

            dst[0] = tmp[0] * alpha / 255;
            dst[1] = tmp[1] * alpha / 255;
            dst[2] = tmp[2] * alpha / 255;
            dst[3] = alpha;

            dst += 4;
            tmp += 4;
        }
    }

    // free resources
    ReleaseDC(m_hMainDlg, hdc);
    SelectObject(hdcsrc, hold);
    DeleteDC(hdcsrc);
    GlobalUnlock(hdib);
    GlobalFree(hdib);

    return dib;
}    
。。。
HBITMAP rv=rgb(hsrc,16);
...
HBITMAP rgb(HBITMAP hsrc,字wBitsPixel){
HBITMAP hold=NULL;
HDC HDC=NULL,HDC=NULL;
位图bmp={0};
HBITMAP dib=NULL;
UCHAR*dst=NULL,*src=NULL,*tmp=NULL;
乌查尔阿尔法;
int-bpl;
ULONG x,y;
DWORD bmp_大小=0;
句柄hdib=NULL;
char*lpbitmap=NULL;
int-rv=0;
hdc=GetDC(m_hMainDlg);
hdcsrc=CreateCompatibleDC(hdc);
按住=(HBITMAP)选择对象(HDCSC、hsrc);
rv=GetObject(hsrc、sizeof(位图)和bmp);
BitMapInfo标头bi={0};
bi.biSize=sizeof(BitMapInfo头);
bi.biWidth=bmp.bmWidth;;
bi.biHeight=bmp.bmHeight;
双平面=1;
bi.BIBITTCOUNT=WBITSPYLEX;
bi.biCompression=bi_RGB;
bi.biSizeImage=0;
bi.biXPelsPerMeter=0;
bi.biYPelsPerMeter=0;
bi.BICLRUSE=0;
bi.biclr=0;
bmp_大小=((bmp.bmWidth*bi.bibibitcount+31)/32)*4*bmp.bmHeight;
hdib=全局ALLOC(GHND,bmp_尺寸);
lpbitmap=(char*)GlobalLock(hdib);
/*获取源位图的位*/
GetDIBits(hdcsrc、hsrc、0、bmp.bmHeight、lpbitmap、(BITMAPINFO*)和bi、DIB_RGB_颜色);
/*用于目标位图*/
BITMAPINFO bmi={0};
bmi.bmiHeader.biSize=sizeof(BITMAPINFO);
bmi.bmiHeader.biWidth=bmp.bmWidth;
bmi.bmiHeader.biHeight=bmp.bmHeight;
bmi.bmiHeader.biPlanes=1;
bmi.bmiHeader.biBitCount=wBitsPixel;
bmi.bmiHeader.biCompression=BI_RGB;
bmi.bmiHeader.biSizeImage=0;
bmi.bmiHeader.biXPelsPerMeter=0;
bmi.bmiHeader.biYPelsPerMeter=0;
bmi.bmiHeader.biClrUsed=0;
bmi.bmiHeader.biClrImportant=0;
dib=CreateDIBSection(空,和bmi,dib_RGB_颜色,(空**)和dst,空,0);
bpl=4*bmp.bmWidth;/*字节/行*/
src=(UCHAR*)lpbitmap;
对于(y=0;y
嗯,16bpp位图没有alpha通道。您创建了一个16bpp位图,但将其视为一个32bpp位图,这不起作用(而且是缓冲区溢出)。我需要16位颜色的透明位图,我能做什么?使用32bpp位图。您可以在16位设备上显示32bpp位图。它们只是失去了一些颜色分辨率。能给我一些代码吗?或者一些例子?你已经写了上面的代码。只需使用wBitsPixel=32。