原来是想做光标编辑器,自己把绘图板的内容导出为光标格式
鼠标指针文件格式解析——Windows(一) (qq.com)
代码来源自
Icons | Microsoft Learn
鄙人又补充些变量可以运行微软的代码
简单代码如下
#include <stdio.h>
#include <windows.h>
//掩码图,其中有XOR是用一个bit 0表示黑,1表示白,即一个字节对应八个像素
typedef struct
{BITMAPINFOHEADER icHeader; // DIB headerRGBQUAD icColors[1]; // Color tableBYTE icXOR[1]; // DIB bits for XOR maskBYTE icAND[1]; // DIB bits for AND mask
} ICONIMAGE, *LPICONIMAGE;
// 一个ICON 文件有多个图片,是因为不同机器上识别不同格式图片,这里是紧随ICON文件头之后的图片信息结构体
typedef struct
{BYTE bWidth; // Width, in pixels, of the imageBYTE bHeight; // Height, in pixels, of the imageBYTE bColorCount; // Number of colors in image (0 if >=8bpp)BYTE bReserved; // Reserved ( must be 0)WORD wPlanes; // Color PlanesWORD wBitCount; // Bits per pixelDWORD dwBytesInRes; // How many bytes in this resource?DWORD dwImageOffset; // Where in the file is this image?
} ICONDIRENTRY, *LPICONDIRENTRY;// ICON 文件头
typedef struct
{WORD idReserved; // Reserved (must be 0)WORD idType; // Resource Type (1 for icons)WORD idCount; // How many images?ICONDIRENTRY idEntries[1]; // An entry for each image (idCount of 'em)
} ICONDIR, *LPICONDIR;void showIcon(LPICONDIR pIconDir,LPICONDIRENTRY pIconDirEntry,LPICONIMAGE lpIconImage){printf("%0x\n",pIconDir->idReserved);printf("%0x\n",pIconDir->idType);printf("%0x\n",pIconDir->idCount);printf("pIconDir\n");printf("%0x\n",pIconDirEntry->bHeight);printf("%0x\n",pIconDirEntry->bWidth);printf("%0x\n",pIconDirEntry->bColorCount);printf("%0x\n",pIconDirEntry->bReserved);printf("%0x\n",pIconDirEntry->wPlanes);printf("%0x\n",pIconDirEntry->wBitCount);printf("%ld\n",pIconDirEntry->dwBytesInRes);printf("%ld\n",pIconDirEntry->dwImageOffset);} int main()
{LPICONDIR pIconDir; // 用于记录一个完整的ICON 数据头
// https://blog.csdn.net/jeanphorn/article/details/44982273HANDLE hFile= CreateFile("1.ico",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING, //打开已存在的文件FILE_ATTRIBUTE_NORMAL,NULL);DWORD dwBytesRead; // 要读取的字节数,DROWD 就是 unsigned _long32 ctrl+鼠标左键可查// We need an ICONDIR to hold the datapIconDir = (LPICONDIR)malloc( sizeof( ICONDIR ) );
// Read the Reserved worddwBytesRead=1; ReadFile( hFile, &(pIconDir->idReserved), sizeof( WORD ), &dwBytesRead, NULL );
// Read the Type word - make sure it is 1 for iconsdwBytesRead=1;ReadFile( hFile, &(pIconDir->idType), sizeof( WORD ), &dwBytesRead, NULL );
// Read the count - how many images in this file?dwBytesRead=1; // deByteRead=1 是指读的 1个 WORD ,就是读取一个字,这里对应读取两个字节因为unsigned short是两个字节 ReadFile( hFile, &(pIconDir->idCount), sizeof( WORD ), &dwBytesRead, NULL );
// Reallocate IconDir so that idEntries has enough room for idCount elementspIconDir = (LPICONDIR)realloc( pIconDir, ( sizeof( WORD ) * 3 ) +( sizeof( ICONDIRENTRY ) * pIconDir->idCount ) );
// Read the ICONDIRENTRY elementsReadFile( hFile, pIconDir->idEntries, pIconDir->idCount * sizeof(ICONDIRENTRY),&dwBytesRead, NULL );
// Loop through and read in each imageint i;LPICONIMAGE pIconImage;for(i=0; i<pIconDir->idCount; i++){// Allocate memory to hold the imagepIconImage =(LPICONIMAGE) malloc( pIconDir->idEntries[i].dwBytesInRes );// Seek to the location in the file that has the imageSetFilePointer( hFile, pIconDir->idEntries[i].dwImageOffset,NULL, FILE_BEGIN );// Read the image dataReadFile( hFile, pIconImage, pIconDir->idEntries[i].dwBytesInRes,&dwBytesRead, NULL );// Here, pIconImage is an ICONIMAGE structure. Party on it :)//显示读取的数据信息 showIcon(pIconDir,&pIconDir->idEntries[i],pIconImage);// Then, free the associated memoryfree( pIconImage );}
// Clean up the ICONDIR memoryfree( pIconDir );
}