【解決方法】メモリからアイコンをロードする方法は?


アイコン リソースをメモリからロードする必要があるプログラムを作成していますが、この作業を実行できる直接的な Windows API はないようです。 アイコンファイルはネットワーク経由で送信され、プログラムはファイルのデータを受信し、このデータをプログラムバッファに保存します。このデータを使用してウィンドウのアイコンを設定したいと考えています。 コード構造は次のようになります。

C++
char* buffer;
recvicon_data_by_network(&buffer,...);
HICON icon=(HICON)how_to_load_icondata_from_memory(buffer,...);
SendMessage(my_hwnd,WM_SETICON,(WPARAM)ICON_SMALL,(LPARAM)icon);

MSDN で言及されているように、ICONIFO という構造があります。

C++
typedef struct _ICONINFO {
  BOOL    fIcon;
  DWORD   xHotspot;
  DWORD   yHotspot;
  HBITMAP hbmMask;
  HBITMAP hbmColor;
} ICONINFO;

そして、.ICOファイルの構造は少し複雑ですが、圧縮アルゴリズムについてはいろいろあるようです。 私はまだそれに対処するスキルを持っていません。

私が試したこと:

.ico 形式のファイル データを ICONINFO 構造体に変換する方法に関する記事もいくつかあります。

C++
//size:16×16 icon
int cx = 16, cy = 16;
int offset=LookupIconIdFromDirectoryEx((PBYTE)&buffer[0], TRUE, cx, cy, LR_DEFAULTCOLOR);
unsigned short i=1, count = *((unsigned short*)&buffer[4]);
while (i < count) {
	memcpy(((PBYTE)&buffer[6]) + (i * 0xe),((PBYTE)&buffer[6]) + (i * 0x10), 0xe);
}

HICON ico_fav = CreateIconFromResourceEx((PBYTE)&buffer[offset], 0, TRUE, 0x00030000,cx,cy, LR_DEFAULTCOLOR);

アイコン データをローカル ファイルに保存したくありません。私のプログラム構造は gdiplus::Image::FromStream(…) の方法をサポートしていません。 HICONハンドルが必要で、アイコンのデータのメモリがあります。

解決策 1

簡単な仕事ではないのではないかと心配しています。 あなたはこの記事を見ているかもしれません: アイコン | マイクロソフト ラーン[^].

コメント

タイトルとURLをコピーしました