Newsgroup: it.comp.lang.visual-basic
Titolo: Come utilizzare codice C in un'applicazione Visual Basic?

Gentili iscritti,
- Dispongo del seguente codice preso dal programma Winfract (per la
generazione di frattali). Questa procedura dovrebbe consentire di
salvare un'immagine BMP da un "oggetto" hWnd? Non so esattamente cosa
sia hWnd. In realtà io dispongo di una semplice Picture-Box. Il seguente
codice è più potente della corrispondente "Savepicture" che consente di
salvare una bmp da una picture-box, perchè questo codice dovrebbe
permettere di salvare l'immagine anche dopo speciali modifiche (come la
rotazione della palette).
- Il mio problema è sapere come posso usare questo codice nel mio
progetto Visual Basic 6. Creare una dll? Un OCX? Io non me ne intendo.
E' necessario anche il Visual C++? La conversione in OCX o dll E'
un'operazione difficile o automatizzata da qualche Wizard?
void SaveBitmapFile(HWND hWnd, char *FullPathName)
{
   long TotalSize, Saved = 0, ImageSize, n;
   BITMAPFILEHEADER FileHeader;
   unsigned PalSize, BitCount;
   unsigned BlockSize = 10240;
   int hFile;
   char Temp[128];
   OFSTRUCT OfStruct;
   HANDLE hPal;
   RGBQUAD FAR *Pal;
   hFile = OpenFile(FullPathName, &OfStruct, OF_CREATE);
   if(hFile == NULL)
   {
FileError:
      wsprintf(Temp, "File I/O error while saving %s.",
(LPSTR)FullPathName);
      MessageBox(hWnd, Temp, "File Error . . .", MB_OK |
MB_ICONEXCLAMATION);
GeneralError:
      _lclose(hFile);
      OpenFile(FullPathName, &OfStruct, OF_DELETE);
      CloseStatusBox();
      return;
   }
   BitCount = pDibInfo->bmiHeader.biBitCount;
   if(BitCount != 24)
      PalSize = (1 << BitCount) * sizeof(RGBQUAD);
   else
      PalSize = 0;
   ImageSize = pDibInfo->bmiHeader.biSizeImage;
   FileHeader.bfType = 0x4d42; /* 'BM'; */
   FileHeader.bfSize = sizeof(FileHeader) +
                       pDibInfo->bmiHeader.biSize +
                       PalSize + ImageSize;
   TotalSize = FileHeader.bfSize;
   FileHeader.bfReserved1 = FileHeader.bfReserved2 = 0;
   FileHeader.bfOffBits = FileHeader.bfSize - ImageSize;
   Saved += _lwrite(hFile, (LPSTR)&FileHeader, sizeof(FileHeader));
   Saved += _lwrite(hFile, (LPSTR)pDibInfo,
(int)pDibInfo->bmiHeader.biSize);
   if(PalSize)
   {
      hPal = GlobalAlloc(GMEM_FIXED, PalSize);
      Pal = (RGBQUAD FAR *)GlobalLock(hPal);
      if(Pal == NULL)
      {
         MessageBox(hWnd, "Insufficient Memory", "Memory Error . . .",
                          MB_ICONEXCLAMATION | MB_OK);
         goto GeneralError;
      }
      for(n = 0; n < (1 << BitCount); n++)
      {
         Pal[n].rgbRed   = pLogPal->palPalEntry[n].peRed;
         Pal[n].rgbGreen = pLogPal->palPalEntry[n].peGreen;
         Pal[n].rgbBlue  = pLogPal->palPalEntry[n].peBlue;
         Pal[n].rgbReserved = 0;
      }
      Saved += _lwrite(hFile, (LPSTR)Pal, PalSize);
      GlobalUnlock(hPal);
      GlobalFree(hPal);
   }
   UpdateStatusBox(Saved, TotalSize);
   keypressed();
   /* We should have saved enough bytes to reach the image offset.  If
not,
      then there was an error. */
   if(Saved != FileHeader.bfOffBits)
      goto FileError;
   for(n = 0; n < (ImageSize - BlockSize); n += BlockSize)
   {
      if(_lwrite(hFile, (LPSTR)&pixels[n], BlockSize) != BlockSize)
         goto FileError;
      Saved += BlockSize;
      UpdateStatusBox(Saved, TotalSize);
      keypressed();
      if(OperCancelled)
      {
         MessageBox(hWnd, "File save cancelled.", "Save Cancelled",
MB_OK);
         goto GeneralError;
      }
   }
   Saved += _lwrite(hFile, (LPSTR)&pixels[n], (int)(ImageSize - n));
   if(Saved != TotalSize)
      goto FileError;
   UpdateStatusBox(Saved, TotalSize);
   _lclose(hFile);
   CloseStatusBox();
}
Ringraziandovi, saluto tutti.
-- 
Paolo Guagliumi
_______________________________________
Casale Monferrato - Alessandria - Italy
mailto:
pguag...@dada.it
http://members.tripod.com/softwork/map

Io ti consiglio di realizzare una DLL in C che comporta meno problemi di un
OCX scritto in C ed è anche più veloce. Naturalmente per compilare la DLL ti
serve un compilatore C per Windows che supporti i 32 bit (ad esempio VC++,
Borland Builder, Borland C, ecc...)
Naturalmente devi inserire le linee di codice per l'esportazione delle tue
funzioni.
L' hWnd è l'handle della finestra picturebox. E' un identificativo univoco
di tipo Long.
L'oggetto Picrturebox ha la propietà hWnd perchè è una finestra.Non
confoderlo con l'hDc di un'immagine pero'.
Ciao.