MFC将图片转换成ico文件

#include "atlimage.h"
HICON ToIcon(int cx,int cy)
{
	CImage img;
	img.Load("cap.bmp");//可以是jpg,png,gif格式图片
	int w = img.GetWidth();
	int h = img.GetHeight();

	CDC * dc = CDC::FromHandle(GetWindowDC(GetDesktopWindow()));
	CDC mdc;
	mdc.CreateCompatibleDC(dc);
	CBitmap bmp;
	bmp.CreateCompatibleBitmap(dc,cx,cy);
	HBITMAP hOldBmp = (HBITMAP)mdc.SelectObject(bmp);
	img.StretchBlt(mdc.m_hDC,0,0,cx,cy,0,0,w,h,SRCCOPY);

	HBITMAP hBmp = (HBITMAP)bmp.m_hObject;

	ICONINFO iconinfo;
	memset(&iconinfo,0,sizeof(iconinfo));
	iconinfo.fIcon = 1;
	iconinfo.hbmColor = hBmp;
	iconinfo.hbmMask = hBmp;
	iconinfo.xHotspot = 0;
	iconinfo.yHotspot = 0;

	HICON hIcon = CreateIconIndirect(&iconinfo);//获取HICON
	/*if(hIcon)
	{
		dc->DrawIcon(0,0,hIcon);
	}*/
	img.Detach();

	PICTDESC pictdesc;
	memset(&pictdesc,0,sizeof(pictdesc));
	pictdesc.cbSizeofstruct = sizeof(pictdesc);
	pictdesc.picType = PICTYPE_ICON;
	pictdesc.icon.hicon = hIcon;

	IPicture * pPic = NULL;
	int ret = OleCreatePictureIndirect(&pictdesc,IID_IPicture,1,(LPVOID*)&pPic);
	
	LPSTREAM pStream = 0;
	CreateStreamOnHGlobal(0,TRUE,&pStream);

	LONG size = 0;
	pPic->SaveAsFile(pStream,TRUE,&size);

	//这步非常重要
	///////////////////////////////////////////////
	LARGE_INTEGER li;  
	li.HighPart =0;  
	li.LowPart =0;  
	ULARGE_INTEGER ulnewpos;  
	pStream->Seek( li,STREAM_SEEK_SET,&ulnewpos);
	///////////////////////////////////////////////

	HANDLE hFile = CreateFile("1.ico",GENERIC_ALL,0,0,CREATE_ALWAYS,0,0);//生成ico文件
	if(hFile)
	{
		char * buf = new char[size];
		memset(buf,0,size);
		ULONG nRead = 0;
		pStream->Read(buf,size,&nRead);
		ULONG nWrited = 0;
		WriteFile(hFile,buf,nRead,&nWrited,0);
		CloseHandle(hFile);
	}
	return hIcon;
}

  

posted on 2016-06-04 14:03  consuvi  阅读(2137)  评论(0编辑  收藏  举报

导航