Add icons with subset of images to CodeJock CommandBars

From DataFlex Wiki
Jump to navigationJump to search

How to add icons with subset of images to CodeJock CommandBars.

If you add an icon with a subset of images to the CodeJock Commandbars, it will use the first icon in the set and in most cases it will look awful.

This function will use a different approach and use CodeJock's imagelist to load the icon. The result is that the appropriate icon in the set will be used instead of the first. The drawback is that the icon files must be in the path, embedding the images in the exe-file is not enough.

Just add the function below to your project (below "Use cCJCommandBarSystem.pkg" or such).

    Function AddImageType for cCJCommandBarSystem Boolean bIsIcon String sImage Integer iId Integer eImageType Returns Integer
        Handle hBitmap
        Variant vImageManager
        Handle hoImageIcons
        Integer iVoid eType 
        Boolean bOk
        String sImageName
        
        Move sImage to sImageName
        
        If (iId=0) Begin
            Get piLastImageId to iId
            Increment iId
            Set piLastImageId to iId
        End
        
        Move (If(bIsIcon,IMAGE_ICON,IMAGE_BITMAP)) to eType
        
        Move (LoadImage(GetModuleHandle(0), sImage, eType, 0, 0, 0)) to hBitmap
        If (hBitmap =0) Begin // the bitmap was not in the EXE resource
            Get_File_Path sImage to sImage // find path in DFPATH, if appropriate
            If (sImage <>"") Begin // The image was found!
                Move (LoadImage(0, sImage, eType, 0, 0, LR_LOADFROMFILE)) to hBitmap
            End
        End
    
        If hBitmap Begin
            // if a bitmap it appears we must add this via an image manager
            If (not(bIsIcon)) Begin
                Get Create U_cCJImageManagerIcons to hoImageIcons
                Get ComIcons to vImageManager
                Set pvComObject of hoImageIcons to vImageManager
                Send ComAddBitmap of hoImageIcons hBitmap iId eImageType False
                Send destroy of hoImageIcons
            End
            Else Begin
                // First check if we can find the icon file.
                // Loading from file works much better with subset of icons
                Get_File_Path sImageName to sImageName // find path in DFPATH, if appropriate
                If (sImageName <>"") Begin // The image was found!
                    Get Create U_cCJImageManagerIcons to hoImageIcons
                    Get ComIcons to vImageManager
                    Set pvComObject of hoImageIcons to vImageManager
                    Send ComLoadIcon of hoImageIcons sImageName iId eImageType 
                    Send destroy of hoImageIcons
                End
                // We where not able to find the file, use original code.
                Else Begin
                    // this works with alpha blends - even when passed false
                    Send ComAddIconHandle hBitmap iId eImageType False
                End
            End
            Move (DeleteObject(hBitmap)) to iVoid
        End
        Function_Return (If(hBitmap<>0,iId,0))
    End_Function