/* Test.prg Exemple de base de conversion wmf ( Windows MetaFile ) to jpg. Ceci est une solution sale, je n'ai pas réussi d'utiliser l'api LoadFileA(). */ // Paramètres. #define _File_In_Test hb_dirbase() + "Test.wmf" #define _File_Out_Test "_Result.jpg" #define _Folder_Out_Test left( hb_dirbase(), len( hb_dirbase() ) - 1 ) #define wdAlertsNone 0 #define wdDoNotSaveChanges 0 procedure Main local oWord // Objet Word. local oDoc // Objet document. local oSele // Objet de la sélection du document Word. set date french // Date en français. set century on // Affichage de l'année sur 4 chiffres. set( _SET_EOF, .F. ) // Not have at the end of file in set alte. // Sélection du langage : ANSI ( Windows ) and french language. request HB_LANG_FR request HB_CODEPAGE_FRWIN hb_cdpSelect( 'FRWIN' ) hb_langSelect( 'FR' ) setmode( 43, 120 ) // Taille de la console. setcolor( "GR+/B" ) // Couleurs du fond de la console. @ 0, 0, maxrow(), maxcol() box space( 9 ) // Applique la couleur du fond de la console. setcolor( "W/B" ) // Couleur des caractères. oWord := win_OleCreateObject( "Word.Application" ) // Crée l'objet Word. oWord:Visible := .T. // Pour le test, .F. pour le client. oDoc := oWord:documents:add() oSele := oWord:Selection oSele:InlineShapes:AddPicture( _File_In_Test ) oDoc:InlineShapes( 1 ):Select() oWord:Selection:Copy() bh_ClipboardToJpg( _Folder_Out_Test, _File_Out_Test ) oWord:Application:DisplayAlerts := wdAlertsNone oWord:Quit( wdDoNotSaveChanges ) oSele := nil oDoc := nil oWord := nil return /* bh_ClipboardToJpg.ch Presse papier transformé en fihier.jpg https://msdn.microsoft.com/en-us/library/windows/desktop/dd145119(v=vs.85).aspx */ procedure bh_ClipboardToJpg( cFolder, cFileOut ) local Img1 // Objet WIA.ImageFile. local Img2 // Objet WIA.ImageProcess. ferase( cFolder + "\temp3572508.bmp" ) ferase( cFolder + "\" + cFileOut ) // Transformation du presse-papier en fichier.bmp. CClipboardToJpg( cFolder + "\temp3572508.bmp" ) if .not. file( cFolder + "\temp3572508.bmp" ) ? "Le fichier bmp provisoire n'a pas été créé." return endif // Transformation du fichier bmp en JPG. Img1 := win_OleCreateObject( "WIA.ImageFile" ) Img1:LoadFile ( cFolder + "\temp3572508.bmp" ) Img2 := win_OleCreateObject( "WIA.ImageProcess") Img2:Filters:Add( Img2:FilterInfos( "Convert" ):FilterID ) Img2:Filters( 1 ):Properties( "FormatID" ):Value := "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}" Img2:Filters( 1 ):Properties( "Quality" ):Value := 100 Img1 := Img2:Apply( Img1 ) Img1:SaveFile( cFolder + "\" + cFileOut ) ferase( cFolder + "\temp3572508.bmp" ) Img1 := nil Img2 := nil return #pragma BEGINDUMP #include #include HB_FUNC( CCLIPBOARDTOJPG ) { // Ouverture du press-papier ( Clipboard en anglais ). if ( ! OpenClipboard( NULL ) ) { // MessageBoxA( NULL // , "Le presse-papier n'a pas pu être ouvert" // , "Impression d'écran Bernard Mouille" // , MB_ICONERROR ); return; } // Récupération et transformation du presse-papier en BITMAP. HBITMAP hBmp; hBmp = ( HBITMAP ) ( GetClipboardData( CF_BITMAP ) ); if ( ! hBmp ) { EmptyClipboard(); CloseClipboard(); // Ferme le presse-papier. // MessageBoxA( NULL // , "Le presse-papier ne contient pas de bitmap" // , "Impression d'écran Bernard Mouille" // , MB_ICONERROR ); return; } HDC hdc = GetWindowDC( NULL ); // Structure pour le Bitmap. BITMAP bmp; PBITMAPINFO pbmi; WORD cClrBits; // Retrouver les format de couleur, largeur et hauteur du bitmap. if ( ! GetObject( hBmp, sizeof( BITMAP ), ( LPSTR ) &bmp ) ) { ReleaseDC( NULL, hdc ); // Efface de la mémoire. EmptyClipboard(); CloseClipboard(); // Ferme le presse-papier. // MessageBoxA( NULL // , "Impossible de retrouver les formats du bitmap" // , "Impression d'écran Bernard Mouille" // , MB_ICONERROR ); return; } // Convertir le format de couleur à un nombre de bits cClrBits = ( WORD )( bmp.bmPlanes * bmp.bmBitsPixel ); if ( cClrBits == 1 ) cClrBits = 1; else if ( cClrBits <= 4 ) cClrBits = 4; else if ( cClrBits <= 8 ) cClrBits = 8; else if ( cClrBits <= 16 ) cClrBits = 16; else if ( cClrBits <= 24 ) cClrBits = 24; else cClrBits = 32; // Allouer de la mémoire pour la structure BITMAPINFO ( Cette structure contient // une structure BITMAPINFOHEADER et un tableau de structures de données RGBQUAD ). if ( cClrBits < 24 ) pbmi = ( PBITMAPINFO ) LocalAlloc( LPTR, sizeof( BITMAPINFOHEADER ) + sizeof( RGBQUAD ) * ( 1 << cClrBits ) ); // Il n'y a pas de tableau RGBQUAD pour ces formats: 24-bit par pixel et 32-bit par pixel else pbmi = ( PBITMAPINFO ) LocalAlloc( LPTR, sizeof( BITMAPINFOHEADER ) ); // Initialiser les champs de la structure BITMAPINFO. pbmi->bmiHeader.biSize = sizeof( BITMAPINFOHEADER ); pbmi->bmiHeader.biWidth = bmp.bmWidth; pbmi->bmiHeader.biHeight = bmp.bmHeight; pbmi->bmiHeader.biPlanes = bmp.bmPlanes; pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel; if ( cClrBits < 24 ) { pbmi->bmiHeader.biClrUsed = ( 1 << cClrBits ); } // Si le bitmap n'est pas compressé, définition de l'indicateur BI_RGB. pbmi->bmiHeader.biCompression = BI_RGB; // Calculer le nombre d'octets dans le tableau des indices de couleur et stocker // le résultat dans biSizeImage. La largeur doit être aligné à moins que la // valeur DWORD soit un bitmap RLE compressé pbmi->bmiHeader.biSizeImage = ( ( pbmi->bmiHeader.biWidth * cClrBits + 31 ) & ~31 ) /8 * pbmi->bmiHeader.biHeight; // Mise de biClrImportant à 0, ce qui indique que toutes les couleurs sont importants. pbmi->bmiHeader.biClrImportant = 0; // Création du fichier BMP. HANDLE hf; // Handle du fichier. BITMAPFILEHEADER hdr; // File-header du bitmap PBITMAPINFOHEADER pbih; // Info-header du bitmap. LPBYTE lpBits; // Pointeur de la mémoire. DWORD cb; // Incrément du nombre total de bytes. BYTE *hp; // Pointeur de byte. DWORD dwTmp; pbih = ( PBITMAPINFOHEADER ) pbmi; // Allocation de la mémoire. lpBits = ( LPBYTE ) GlobalAlloc( GMEM_FIXED, pbih->biSizeImage ); if ( ! lpBits ) { ReleaseDC( NULL, hdc ); // Efface de la mémoire. EmptyClipboard(); CloseClipboard(); // Ferme le presse-papier. // MessageBoxA( NULL // , "Erreur d'allocation de ma mémoire" // , "Impression d'écran Bernard Mouille" // , MB_ICONERROR ); return; } // Récupérer la table des couleurs ( tableau RGBQUAD ) et les bits // ( tableau d'indices de la palette ) de la DIB. if ( ! GetDIBits( hdc, hBmp, 0, ( WORD ) pbih->biHeight, lpBits, pbmi, DIB_RGB_COLORS ) ) { ReleaseDC( NULL, hdc ); // Efface de la mémoire. EmptyClipboard(); CloseClipboard(); // Ferme le presse-papier GlobalFree( ( HGLOBAL ) lpBits ); // Efface de la mémoire. // MessageBoxA( NULL // , "Erreur de récupération des infos de couleur du bitmap" // , "Impression d'écran Bernard Mouille" // , MB_ICONERROR ); return; } // Création du fichier BMP ( pas encore écrit sur le disque ). hf = CreateFile( hb_parc( 1 ), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); if ( hf == INVALID_HANDLE_VALUE ) { ReleaseDC( NULL, hdc ); // Efface de la mémoire. EmptyClipboard(); CloseClipboard(); // Ferme le presse-papier GlobalFree( ( HGLOBAL ) lpBits ); // Efface de la mémoire. // MessageBoxA( NULL // , "Erreur de la création du fichier bitmap" // , "Impression d'écran Bernard Mouille" // , MB_ICONERROR ); return; } // 0x42 = "B" 0x4d = "M" hdr.bfType = 0x4d42; // Calcule la taille de l'ensemble du fichier. hdr.bfSize = ( DWORD ) ( sizeof( BITMAPFILEHEADER ) + pbih->biSize + pbih->biClrUsed * sizeof( RGBQUAD ) + pbih->biSizeImage ); hdr.bfReserved1 = 0; hdr.bfReserved2 = 0; // Calculer le décalage vers le tableau des indices de couleur. hdr.bfOffBits = ( DWORD ) sizeof( BITMAPFILEHEADER ) + pbih->biSize + pbih->biClrUsed * sizeof ( RGBQUAD ); // Copie le BITMAPFILEHEADER dans le fichier BMP. if ( ! WriteFile( hf, (LPVOID) &hdr, sizeof( BITMAPFILEHEADER ), ( LPDWORD ) &dwTmp, NULL ) ) { ReleaseDC( NULL, hdc ); // Efface de la mémoire. EmptyClipboard(); CloseClipboard(); // Ferme le presse-papier GlobalFree( (HGLOBAL) lpBits ); // Efface de la mémoire. CloseHandle( hf ); // Ferme Writefile. // MessageBoxA( NULL // , "Erreur d'écriture du BITMAPFILEHEADER dans le fichier BMP" // , "Impression d'écran Bernard Mouille" // , MB_ICONERROR ); return; } // Copie le BITMAPINFOHEADER et le tableau RGBQUAD dans le fichier BMP. if ( ! WriteFile( hf, (LPVOID) pbih, sizeof( BITMAPINFOHEADER ) + pbih->biClrUsed * sizeof ( RGBQUAD ), ( LPDWORD ) &dwTmp, ( NULL ) ) ) { ReleaseDC( NULL, hdc ); // Efface de la mémoire. EmptyClipboard(); CloseClipboard(); // Ferme le presse-papier GlobalFree( ( HGLOBAL ) lpBits ); // Efface de la mémoire. CloseHandle( hf ); // Ferme Writefile. // MessageBoxA( NULL // , "Erreur d'écriture du BITMAPINFOHEADER et du tableau RGBQUAD dans le fichier BMP" // , "Impression d'écran Bernard Mouille" // , MB_ICONERROR ); return; } // Copie du tableau des indices de couleur dans le fichier BMP. cb = pbih->biSizeImage; hp = lpBits; if ( ! WriteFile( hf, ( LPSTR ) hp, ( int ) cb, ( LPDWORD ) &dwTmp, NULL ) ) { ReleaseDC( NULL, hdc ); // Efface de la mémoire. EmptyClipboard(); CloseClipboard(); // Ferme le presse-papier GlobalFree( ( HGLOBAL ) lpBits ); // Efface de la mémoire. CloseHandle( hf ); // Ferme Writefile. // MessageBoxA( NULL // , "Erreur d'écriture du tableau des indices de couleur dans le fichier BMP" // , "Impression d'écran Bernard Mouille" // , MB_ICONERROR ); return; } // Ferme le fichier BMP. if ( ! CloseHandle( hf ) ) { ReleaseDC( NULL, hdc ); // Efface de la mémoire. EmptyClipboard(); CloseClipboard(); // Ferme le presse-papier GlobalFree( ( HGLOBAL ) lpBits ); // Efface de la mémoire. // MessageBoxA( NULL // , "Erreur de fermeture du fichier BMP" // , "Impression d'écran Bernard Mouille" // , MB_ICONERROR ); return; } // Efface de la mémoire. ReleaseDC( NULL, hdc ); EmptyClipboard(); CloseClipboard(); GlobalFree( ( HGLOBAL ) lpBits ); return; } #pragma ENDDUMP