How to convert HICON to HBITMAP in VC++?

后端 未结 4 1779
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-10 19:18

How to convert HICON to HBITMAP in VC++?

I know this is an FAQ but all the solutions I\'ve found on Google don\'t work. What I need is a function which takes a param

4条回答
  •  北海茫月
    2020-12-10 19:48

    I found this(similar code works for me - 32x32 icons with or without alpha data):
      used CopyImage (msdn link)

    HICON hICON = /*your code here*/
    HBITMAP hBITMAPcopy;
    ICONINFOEX IconInfo;
    BITMAP BM_32_bit_color;
    BITMAP BM_1_bit_mask;
    
    // 1. From HICON to HBITMAP for color and mask separately
    //.cbSize required
    //memset((void*)&IconInfo, 0, sizeof(ICONINFOEX));
    IconInfo.cbSize = sizeof(ICONINFOEX);
    GetIconInfoEx( hICON , &IconInfo);
    
    
    //HBITMAP IconInfo.hbmColor is 32bit per pxl, however alpha bytes can be zeroed or can be not.
    //HBITMAP IconInfo.hbmMask is 1bit per pxl
    
    // 2. From HBITMAP to BITMAP for color
    //    (HBITMAP without raw data -> HBITMAP with raw data)
    //         LR_CREATEDIBSECTION - DIB section will be created,
    //         so .bmBits pointer will not be null
    hBITMAPcopy = (HBITMAP)CopyImage(IconInfo.hbmColor, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
    //    (HBITMAP to BITMAP)
    GetObject(hBITMAPcopy, sizeof(BITMAP), &BM_32_bit_color);
    //Now: BM_32_bit_color.bmBits pointing to BGRA data.(.bmWidth * .bmHeight * (.bmBitsPixel/8))
    
    // 3. From HBITMAP to BITMAP for mask
    hBITMAPcopy = (HBITMAP)CopyImage(IconInfo.hbmMask, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
    GetObject(hBITMAPcopy, sizeof(BITMAP), &BM_1_bit_mask);
    //Now: BM_1_bit_mask.bmBits pointing to mask data (.bmWidth * .bmHeight Bits!)
    

    BM_32_bit_color bitmap may be have Alpha *channel*(each 4th byte) already set! So - check for it before u add mask bit to color data.

提交回复
热议问题