Привет всем! всюду пишут что курсоры не отличаются от иконок. я не спорю, но не могу понять почему же не работает код, который исправно сохраняет на диске иконки. в msdn указывается что нужно поменять поле на двойку и всё....что то вот не работает...файлы с расширением .cur сохраняются на диске, но только они не распознаются как пиктограммы(как рисунок не открывается). пытался скомпоновать полученный "курсор" со своей тестовой программой. компилятор говорит о старом DIB формате. кстати сколько в shell32.dll курсоров? у меня выводится всего 5, иконов 76(по идендификаторам). подскажите пожалуйста.
| Код | HANDLE hFile; HRSRC hRsrc; HGLOBAL hGlobal; ICONDIR iconDir; ICONDIRENTRY iconDirEntry; LPGRPICONDIR lpGrpIconDir; LPGRPICONDIRENTRY lpGrpIconDirEntry; LPICONIMAGE lpIconImage; int nId, iCountChar, iTemp; DWORD dwWrittenBytes, dwCountResource, dwTemp=0; wchar_t wcDirTemp[256]; wchar_t wcFileName[50];
//resourceId глобальная структура, в ней храню описатели и идендификаторы пиктограмм nId=resourceId[dwIndexResource].iResourceID; //hLib это описатель модуля shell32.dll, пробовал другие экзешники - таже фигня hRsrc = FindResource( hLib, MAKEINTRESOURCE( nId ), iResourceType ); hGlobal = LoadResource( hLib, hRsrc ); lpGrpIconDir = (LPGRPICONDIR) LockResource( hGlobal ); lpGrpIconDirEntry=(LPGRPICONDIRENTRY)(lpGrpIconDir+1);//&lpGrpIconDir->idEntries;
//задание структуры ICONDIR iconDir.idReserved=0; iconDir.idType=2; //это то что написано в мсдн iconDir.idCount=1;
dwCountResource=lpGrpIconDir->idCount; iCountChar=wsprintf(wcDirTemp, L"C:\\Documents and Settings\\******(уть ещё чего:)))\\Рабочий стол\\OutputFiles\\int_%d.cur", resourceId[dwIndexResource].iResourceID);
nId=lpGrpIconDirEntry->nID; hRsrc = FindResource( hLib, MAKEINTRESOURCE(nId), RT_CURSOR);//iResourceType-11 ); hGlobal = LoadResource( hLib, hRsrc); lpIconImage =(LPICONIMAGE)LockResource(hGlobal); hFile=CreateFile(wcDirTemp, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(INVALID_HANDLE_VALUE==hFile) return FALSE; //подготовка данных и задание структуры ICONDIRENTRY iconDirEntry.bHeight=lpGrpIconDirEntry->bHeight; iconDirEntry.bWidth=lpGrpIconDirEntry->bWidth; iconDirEntry.bColorCount=lpGrpIconDirEntry->bColorCount; iconDirEntry.bReserved=0; iconDirEntry.wPlanes=lpGrpIconDirEntry->wPlanes; iconDirEntry.wBitCount=lpGrpIconDirEntry->wBitCount; iconDirEntry.dwBytesInRes=lpGrpIconDirEntry->dwBytesInRes; iconDirEntry.dwImageOffset=sizeof(ICONDIR)+sizeof(ICONDIRENTRY); //запись данных в файл WriteFile(hFile, &iconDir, sizeof(ICONDIR), &dwWrittenBytes, FALSE); WriteFile(hFile, &iconDirEntry, sizeof(ICONDIRENTRY), &dwWrittenBytes, FALSE); WriteFile(hFile, lpIconImage, iconDirEntry.dwBytesInRes, &dwWrittenBytes, FALSE); CloseHandle(hFile);
/////////////////////////////////////////////////////////////////////// //другой листинг, где собраны объявления структур 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;
typedef struct { BYTE bWidth; // Width, in pixels, of the image BYTE bHeight; // Height, in pixels, of the image BYTE bColorCount; // Number of colors in image (0 if >=8bpp) BYTE bReserved; // Reserved ( must be 0) WORD wPlanes; // Color Planes WORD wBitCount; // Bits per pixel DWORD dwBytesInRes; // How many bytes in this resource? DWORD dwImageOffset; // Where in the file is this image? } ICONDIRENTRY, *LPICONDIRENTRY;
typedef struct { BITMAPINFOHEADER icHeader; // DIB header RGBQUAD icColors[1]; // Color table BYTE icXOR[1]; // DIB bits for XOR mask BYTE icAND[1]; // DIB bits for AND mask } ICONIMAGE, *LPICONIMAGE;
#pragma pack( push ) #pragma pack( 2 ) typedef struct { BYTE bWidth; // Width, in pixels, of the image BYTE bHeight; // Height, in pixels, of the image BYTE bColorCount; // Number of colors in image (0 if >=8bpp) BYTE bReserved; // Reserved WORD wPlanes; // Color Planes WORD wBitCount; // Bits per pixel DWORD dwBytesInRes; // how many bytes in this resource? WORD nID; // the ID } GRPICONDIRENTRY, *LPGRPICONDIRENTRY; #pragma pack( pop )
#pragma pack( push ) #pragma pack( 2 ) typedef struct { WORD idReserved; // Reserved (must be 0) WORD idType; // Resource type (1 for icons) WORD idCount; // How many images? //GRPICONDIRENTRY idEntries[1]; // The entries for each image } GRPICONDIR, *LPGRPICONDIR; #pragma pack( pop )
|
|