bmpfromico

User avatar
Silvio.Falconi
Posts: 7119
Joined: Thu Oct 18, 2012 7:17 pm

bmpfromico

Post by Silvio.Falconi »

CAn I load a temporary Bmp from an Ico and show it on Image Control ?
If Yesy, how ?
Since from 1991/1992 ( fw for clipper Rel. 14.4 - Momos)
I use : FiveWin for Harbour November 2023 - January 2024 - Harbour 3.2.0dev (harbour_bcc770_32_20240309) - Bcc7.70 - xMate ver. 1.15.3 - PellesC - mail: silvio[dot]falconi[at]gmail[dot]com
User avatar
Antonio Linares
Site Admin
Posts: 42430
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 17 times
Been thanked: 52 times
Contact:

Re: bmpfromico

Post by Antonio Linares »

I just sent an email to Manuel Alvarez as he is a master with GDI+ and surely it may help for what you want to do.

Lets wait for his answer
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Silvio.Falconi
Posts: 7119
Joined: Thu Oct 18, 2012 7:17 pm

Re: bmpfromico

Post by Silvio.Falconi »

Sorry Antonio,

I have on Listview many items

when I add a item I made

nImage := Icon_Read(cNewfile)
ILADDICON( oImageListSmall:hImageList, nImage )
nImage := max(0,ILADDICON( oImageListBig:hImageList, nImage ) )
DestroyIcon(nImage)
oItem = TListViewItem():New( oList )
oItem:cText = cNewfile
oItem:nImage = nImage
oItem:Create()



we have the icon ... of a file

then I saw there is a function Made from Daniel

HB_FUNC( BMPFROMICON )
{
HICON hIcon = ( HICON ) hb_parnl( 1 );
HDC HDCMem = GetDC( GetDesktopWindow() );
HDC hDC = CreateCompatibleDC( HDCMem );
HBITMAP hBitmap = CreateCompatibleBitmap(HDCMem, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON));
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hDC, hBitmap);
DrawIcon(hDC, 0, 0, hIcon);
SelectObject(hDC, hOldBitmap);
DeleteDC(hDC);

hb_retnl( ( LONG ) hBitmap );
}




then I thinked

ico := nImage
hBmp := BmpFromIcon( ico )


now How I can make to show hBmp into Image control ?
Since from 1991/1992 ( fw for clipper Rel. 14.4 - Momos)
I use : FiveWin for Harbour November 2023 - January 2024 - Harbour 3.2.0dev (harbour_bcc770_32_20240309) - Bcc7.70 - xMate ver. 1.15.3 - PellesC - mail: silvio[dot]falconi[at]gmail[dot]com
User avatar
Antonio Linares
Site Admin
Posts: 42430
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 17 times
Been thanked: 52 times
Contact:

Re: bmpfromico

Post by Antonio Linares »

DeleteObject( oImage:hBitmap )
oImage:hBitmap = hBmp
oImage:Refresh()
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Silvio.Falconi
Posts: 7119
Joined: Thu Oct 18, 2012 7:17 pm

Re: bmpfromico

Post by Silvio.Falconi »

it run BUT bad

look please ( I dropped a PPTX file )

Image

Any solution ?
perhpas we can create the bitmap trasparent no black background ...perhaps...
Since from 1991/1992 ( fw for clipper Rel. 14.4 - Momos)
I use : FiveWin for Harbour November 2023 - January 2024 - Harbour 3.2.0dev (harbour_bcc770_32_20240309) - Bcc7.70 - xMate ver. 1.15.3 - PellesC - mail: silvio[dot]falconi[at]gmail[dot]com
User avatar
mastintin
Posts: 1516
Joined: Thu May 27, 2010 2:06 pm

Re: bmpfromico

Post by mastintin »

Silvio ,
BmpfromIco function is include en fwh .

Code: Select all | Expand



ico := nImage
hBmp := BmpFromIcon( ico )
DeleteObject( oImage:hBitmap )
oImage:hBitmap = hBmp
oImage:HasAlpha()
oImage:Refresh()
DestroyIcon( ico )

 
User avatar
Silvio.Falconi
Posts: 7119
Joined: Thu Oct 18, 2012 7:17 pm

Re: bmpfromico

Post by Silvio.Falconi »

thanks
can I make a big bmp ?

change this line ?
HBITMAP hBitmap = CreateCompatibleBitmap(HDCMem, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON));

Itried to make

HBITMAP hBitmap = CreateCompatibleBitmap(HDCMem, 128, 128);

the bitmap is large but the icon is small

Image
Since from 1991/1992 ( fw for clipper Rel. 14.4 - Momos)
I use : FiveWin for Harbour November 2023 - January 2024 - Harbour 3.2.0dev (harbour_bcc770_32_20240309) - Bcc7.70 - xMate ver. 1.15.3 - PellesC - mail: silvio[dot]falconi[at]gmail[dot]com
User avatar
mastintin
Posts: 1516
Joined: Thu May 27, 2010 2:06 pm

Re: bmpfromico

Post by mastintin »

for resize bmp , i use gdiplus....

Function GDIBmpFromIco( cFileIcon , oImage )
local ogbmp := GdiBmp():new( cFileIcon)
ogbmp:resize( nWidth,nHeight)
DeleteObject( oImage:hBitmap )
oImage:hBitmap := oGBmp:GetGDIHbitmap()
oImage:HasAlpha()
oImage:Refresh()
ogbmp:end()
Return nil
User avatar
Silvio.Falconi
Posts: 7119
Joined: Thu Oct 18, 2012 7:17 pm

Re: bmpfromico

Post by Silvio.Falconi »

Obj\urllink.c:
[1]:PORC.EXE C:\Work\Prg\Allegati\Resource\default.rc /I c:\work\pellesc\include /I win
[1]:iLink32.Exe -Gn -aa -Tpe -s @Allegati.bcl
Turbo Incremental Link 5.69 Copyright (c) 1997-2005 Borland
Error: Unresolved external '_HB_FUN_HB_NUMTOHEX' referenced from C:\WORK\FWH\LIB\FIVEHX.LIB|TGDIPLUS
Since from 1991/1992 ( fw for clipper Rel. 14.4 - Momos)
I use : FiveWin for Harbour November 2023 - January 2024 - Harbour 3.2.0dev (harbour_bcc770_32_20240309) - Bcc7.70 - xMate ver. 1.15.3 - PellesC - mail: silvio[dot]falconi[at]gmail[dot]com
User avatar
mastintin
Posts: 1516
Joined: Thu May 27, 2010 2:06 pm

Re: bmpfromico

Post by mastintin »

silvio add this function to prg ...

Code: Select all | Expand




Function lIsPng( cStr )
local cIsPng :=  left( cStr, 8 )
local lPng
local i, nChar, cChar
local cHex:= ""

 For i = 1 To 8
   nChar = Asc( SubStr( cIsPng , i, 1 ) )
    //cChar = hb_NumToHex( nChar )  // for harbour
    cChar = NumToHex( nChar )   // for xHarbour
    cChar:= If( Len( cChar ) == 1, "0", "" ) + cChar
    cHex:= cHex + Upper( cChar )
  Next

  lPng := ( cHex == "89504E470D0A1A0A" )
Return lPng

 
User avatar
Silvio.Falconi
Posts: 7119
Joined: Thu Oct 18, 2012 7:17 pm

Re: bmpfromico

Post by Silvio.Falconi »

Manuel,
I modify the tgdiplus class
now it is compiled

but perhaps there is something not run also
cFile cab be for a sample : test.pptx

ico := ICON_EXEREAD(cfile)
GDIBmpFromIco( ico, oImagePreview )

give me a message fichero no encontrado



HB_FUNC( ICON_EXEREAD )
{
SHFILEINFO sfi;

ZeroMemory(&sfi, sizeof(SHFILEINFO));

SHGetFileInfo(hb_parc(1), 0, &sfi, sizeof(SHFILEINFO), SHGFI_ICON );

hb_retnl( ( LONG ) sfi.hIcon );

}
Since from 1991/1992 ( fw for clipper Rel. 14.4 - Momos)
I use : FiveWin for Harbour November 2023 - January 2024 - Harbour 3.2.0dev (harbour_bcc770_32_20240309) - Bcc7.70 - xMate ver. 1.15.3 - PellesC - mail: silvio[dot]falconi[at]gmail[dot]com
User avatar
mastintin
Posts: 1516
Joined: Thu May 27, 2010 2:06 pm

Re: bmpfromico

Post by mastintin »

ok Silvio , back to top :-)
This code is ok for me :

Code: Select all | Expand


Function Main ()
local ownd
local oimage

 DEFINE WINDOW oWnd TITLE "Testing hicon to bmp " FROM 5,5 TO 400, 600 PIXEL ;
 COLOR CLR_GRAY, CLR_GRAY
   
    @ 20,2 button "crear" size 40,20 pixel Action imagenfromico( oimage )
    @ 20 ,130 Button "salir" Action ownd:end() size 40,20 pixel
     
   @ 3, 38 BITMAP oimage FILE "" size 148,148 of oWnd

   ACTIVATE WINDOW oWnd

Return (nil)


Function imagenfromico( oImage )
local cFile:= cGetfile("coge","*.*")
local ico := ICON_EXEREAD( cFile  )
        BmpFromHIcon( ico, oImage , oImage:Super:nWidth(), oImage:Super:nHeight() )
        DestroyIcon( ico )
Return nil


Function BmpFromHIcon( hIcon , oImage , nWidth, nHeight )
local hBmp := BmpFromIcon( hIcon )
       DeleteObject( oImage:hBitmap )
       oImage:hBitmap = resizebmp( hBmp, nWidth, nHeight )
       DeleteObject( hBmp )
      oImage:HasAlpha()
      oImage:Refresh() 
Return nil

 
User avatar
nageswaragunupudi
Posts: 10714
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 8 times
Contact:

Re: bmpfromico

Post by nageswaragunupudi »

Just for information.
We need not have a separate new function ICON_EXEREAD. There is already FWH function ICON_READ( <cfile> ) for the same purpose. The functions already in FWH are adequate for this purpose.
Regards

G. N. Rao.
Hyderabad, India
User avatar
Silvio.Falconi
Posts: 7119
Joined: Thu Oct 18, 2012 7:17 pm

Re: bmpfromico

Post by Silvio.Falconi »

Mr Nages I found that function on this forum from Daniel Garcia Gill

Manuel ( Mastintin) I saw the best resolution is 64X64 because if I make the image with the size of Image control is too Big
Please see here :

version with Image file and contexmenu of file
Image

Version with a pdf file dropped into

Image

I wish send thanks to all my friends
thanks to Antonio Linares and AntoninoP for modifies to Listview class
thanks to AntoninoP for file contexmenu and other functions (I hope he found a solution to show the lPreviewHeader also on Bcc585)
thanks to Manuel Mastintn for support Tgdiplus class
thanks to Emg for the tech support
thanks to Paco for the c5Tstatusbar and TpanelEx classes
Since from 1991/1992 ( fw for clipper Rel. 14.4 - Momos)
I use : FiveWin for Harbour November 2023 - January 2024 - Harbour 3.2.0dev (harbour_bcc770_32_20240309) - Bcc7.70 - xMate ver. 1.15.3 - PellesC - mail: silvio[dot]falconi[at]gmail[dot]com
User avatar
mastintin
Posts: 1516
Joined: Thu May 27, 2010 2:06 pm

Re: bmpfromico

Post by mastintin »

Silvio , Good news :-)
New code for Icons ...
Change this function in gdiplus.cpp ...

Code: Select all | Expand




HB_FUNC( GDIPLUSIMAGEFROMICO )
{
  HICON hIcon = ( HICON ) hb_parnl( 1 ) ;

 ICONINFO ii ;
 GetIconInfo(hIcon, &ii);
 BITMAP bmp;
 GetObject(ii.hbmColor, sizeof(bmp), &bmp);
 
 Bitmap * temp = new Bitmap(ii.hbmColor, NULL);

 BitmapData bmpData;
 
 int nWidth  = temp->GetWidth()  ;
 int nHeight = temp->GetHeight() ;
 
 Rect rect(0, 0, nWidth, nHeight);
 
 temp->LockBits(&rect, ImageLockModeRead, temp->GetPixelFormat(), &bmpData );
 
 byte* imgPtr = (byte*)(bmpData.Scan0) ;
 int bheight = bmpData.Height;
 int bwidth = bmpData.Width;
 int bstride = bmpData.Stride;

 Bitmap *original = new Bitmap( bwidth, bheight, bstride, PixelFormat32bppARGB, imgPtr );
 temp->UnlockBits( &bmpData ) ;

 Bitmap* newImage  = new Bitmap( nWidth, nHeight, PixelFormat32bppARGB ) ; // original->GetPixelFormat() );

 Graphics * graphics = new Graphics( newImage );
 graphics->DrawImage( original ,0, 0, nWidth, nHeight);

 delete temp ;
 delete original ;
 
 hb_retnl( ( HB_LONG ) newImage ) ;
           
}

 


Add this code ad end of gdiplius.cpp ... ( is c++ code )
ICON_EXEREAD function has 2 parameters name file , and Size ..
0->LARGE 32x32
1->SMALL 16x16
2->48x48
3-> These images are the size specified by GetSystemMetrics called with SM_CXSMICON and GetSystemMetrics called with SM_CYSMICON.
4-> Windows Vista and later. The image is normally 256x256 pixels.

Code: Select all | Expand



#include <commctrl.h>
#include <commoncontrols.h>

HB_FUNC( ICON_EXEREAD )
{
   
HICON hico ;  
SHFILEINFO sfi = { 0 };

 LPCTSTR pName = ( LPCTSTR ) hb_parc( 1 ) ;
 
 SHGetFileInfo(  pName , -1, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX  );
 
 HIMAGELIST* imageList;
 
 HRESULT hResult = SHGetImageList( hb_parni( 2 ) , IID_IImageList2, (void**)&imageList );

 if(hResult == S_OK) {
   
   ((IImageList*)imageList)->GetIcon(sfi.iIcon,ILD_NORMAL|ILD_TRANSPARENT , &hico);
  }
 
   #ifndef _WIN64
      hb_retnl( ( LONG )  hico );
   #else  
      hb_retnll( ( LONGLONG ) hico );
   #endif
 
}

 


And test ...

Code: Select all | Expand




#include "FiveWin.ch"

Function Main ()
local ownd
local oimage

 DEFINE WINDOW oWnd TITLE "Testing GDI+ Class" FROM 5,5 TO 400, 600 PIXEL
   
    @ 20,2 button "crear" size 40,20 pixel Action imagenfromico(oimage )
   
    @ 20 ,130 Button "salir" Action ownd:end() size 40,20 pixel
     
   @ 3, 38 BITMAP oimage FILE "" size 220,220 of oWnd

   ACTIVATE WINDOW oWnd


Return (nil)


Function imagenfromico(oImage )
local cFile:= cGetfile("coge","*.*")
local ico := ICON_EXEREAD( cFile, 4  ) // for ico, dll and exe files
GDIBmpFromHIcon( ico, oImage , oImage:Super:nWidth(), oImage:Super:nHeight() )

Return nil


Function GDIBmpFromHIcon( hIcon , oImage , nWidth, nHeight )
local ogbmp := GdiBmp():new()
ogbmp:hBmp:= GDIPLUSIMAGEFROMICO( hicon )
ogbmp:resize( nWidth,nHeight)
DeleteObject( oImage:hBitmap )
oImage:hBitmap := oGBmp:GetGDIHbitmap()
oImage:HasAlpha()
oImage:Refresh()
ogbmp:end()

Return nil

 
Post Reply