2011-09-10 40 views
4

VC++でHICONをHBITMAPに変換するにはどうすればよいですか?VC++でHICONをHBITMAPに変換するにはどうすればよいですか?

私はこれがFAQだと知っていますが、Googleで見つけたすべての解決策は機能しません。私が必要とするのは、パラメータHICONをとり、HBITMAPを返す関数です。

できるだけアイコンが24ビット、16ビットまたは8ビットであっても、できるだけ32ビットのビットマップに変換することができます。

これはコードです、それは間違ってどこに行くか、私は知りません。

HBITMAP icon_to_bitmap(HICON Icon_Handle) { 
    HDC Screen_Handle = GetDC(NULL); 
    HDC Device_Handle = CreateCompatibleDC(Screen_Handle); 

    HBITMAP Bitmap_Handle = 
    CreateCompatibleBitmap(Device_Handle,GetSystemMetrics(SM_CXICON), 
    GetSystemMetrics(SM_CYICON)); 

    HBITMAP Old_Bitmap = (HBITMAP)SelectObject(Device_Handle,Bitmap_Handle); 
    DrawIcon(Device_Handle, 0,0, Icon_Handle); 
    SelectObject(Device_Handle,Old_Bitmap); 

    DeleteDC(Device_Handle); 
    ReleaseDC(NULL,Screen_Handle); 
    return Bitmap_Handle; 
} 

答えて

4

を私が共有するコードが容易に入手できていないが、私はこれはかなり簡単だと思います。 HBITMAPを作成し、デバイスコンテキストを作成し、ビットマップをDCに選択する必要があります(これにより、このDCの描画領域がビットマップになります)。最後に、このDC上にアイコンを描画するDrawIcon()関数を呼び出します。その後、ビットマップをDCから切り離し、DCを破棄します。あなたのビットマップは今すぐに準備ができているはずです。あなたのコードを見た後に

更新:

私はこの問題はcreateCompatibleBitmap呼び出しであると考えています。メモリDCと互換性のあるビットマップを要求していますが、メモリDCは1ビット/ピクセルビットマップから選択して開始します。代わりに画面のDCと互換性のあるビットマップを要求してみてください。

更新2:this questionは、問題に関連しているように見えます。

HICON hIcon = (HICON)LoadImage(instance, MAKEINTRESOURCEW(IDI_ICON), IMAGE_ICON, width, height, 0); 
ICONINFO iconinfo; 
GetIconInfo(hIcon, &iconinfo); 
HBITMAP hBitmap = iconinfo.hbmColor; 

、これは* .rcファイル内のコードです:

+0

私は同じことをしていますが、結果のビットマップは常に1ビット/ピクセルです。とても奇妙な....... – jondinham

+1

サンプルコードで質問を展開してください。あなたのビットマップのようなサウンドは、適切なビット/ピクセルでは作成されませんでしたが、コードを見ることなく確実に言うことはできません。 – Miguel

+0

は、コードを追加しましたので、32ビット/ピクセルになるはずですので、plsは見ています。 – jondinham

6
HDC hDC = GetDC(NULL); 
HDC hMemDC = CreateCompatibleDC(hDC); 
HBITMAP hMemBmp = CreateCompatibleBitmap(hDC, x, y); 
HBITMAP hResultBmp = NULL; 
HGDIOBJ hOrgBMP = SelectObject(hMemDC, hMemBmp); 

DrawIconEx(hMemDC, 0, 0, hIcon, x, y, 0, NULL, DI_NORMAL); 

hResultBmp = hMemBmp; 
hMemBmp = NULL; 

SelectObject(hMemDC, hOrgBMP); 
DeleteDC(hMemDC); 
ReleaseDC(NULL, hDC); 
DestroyIcon(hIcon); 
return hResultBmp; 
4

このコードはそれを行う

IDI_ICON ICON "example.ico" 

と、これは* .hファイル内のコードです:

#define IDI_ICON 4000 
+0

この解決策について詳しく説明できますか? 'hbmColor'はHBITMAPのアイコンを表現するのに十分ですか? 'hbmMask'はどうでしょうか? – hackjutsu

2

私はこれを見つけました(同様のコードは私のために動作します - 32x32アイコンまたはwi thoutアルファデータは):
   が使用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ビットマップが既に設定されているアルファチャンネル* *(各4バイト)を持っていることがあります!それで、マスクビットをカラーデータに追加する前にチェックしてください。

関連する問題