Проблема с сохранением курсоров
От: WM_SASHA Узбекистан  
Дата: 09.08.08 07:28
Оценка:
Привет всем!
всюду пишут что курсоры не отличаются от иконок. я не спорю, но не могу понять почему же не работает код, который исправно сохраняет на диске иконки. в msdn указывается что нужно поменять поле на двойку и всё....что то вот не работает...
подскажите пожалуйста.
     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 )
Re: Проблема с сохранением курсоров
От: WM_SASHA Узбекистан  
Дата: 15.08.08 16:11
Оценка:
ребята вы меня удивляете!!! )
файл то сохраняется, но вот выходит не курсор а непонятно что. как пиктограмма не открывается.
...пробовал скомпоновать полученный курсор с другим проектом, компилятор говорит о старом формате DIB.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.