Whookie

Forum Replies Created

Viewing 4 posts - 1 through 4 (of 4 total)
  • Author
    Posts
  • in reply to: Access violation using TsAlphaImageList #56917
    Whookie
    Participant
      'Support' wrote:

      I will try to do it in the v12.03

      Hi, I went to the current version (12.12) and found that you have

      * Added support of the BkColor property in the TsAlphaImageList component

      in 12.03 but it seems as it isn't what I was after.

      So I thought a show you a screenshot of what I'm struggling with:

      [attachment=8388:imagelist_win.jpg]

      The mouse hovers over image 5 (cursor not shown) so this is the only way to see what image is stored there.

      What I meant was something like this:

      [attachment=8392:imglst_bk.JPG]

      I hacked that into your dialog and attached that project too (you need to remove “.pas” though and unpack it).

      in reply to: Access violation using TsAlphaImageList #56328
      Whookie
      Participant
        'Support' wrote:

        What you think about the “PAnsiChar” in this case?

        This will work since you are using a pointer type now.

        I think you have some backward compatibility issues to take into account (D2007 and lower?) so it's sort of a good compromise (otherwise I would use

        Code:
        Data := PContributorList(PByte(Data) + CSize);

        instead).

        BTW it would be really great to have a selectable background color in the Imagelist window (as I'm working with styles I always have lists with pure white icons and they are invisible)!

        in reply to: Access violation using TsAlphaImageList #56319
        Whookie
        Participant
          'Support' wrote:

          Thank you for the message. I will check and I will try to improve it.

          If you have a test-application with error and you can share it, this would be great.

          It is a rather big project and I'm on a tight schedule so maybe next month.

          To fix my problem do at least the following:

          Code:

          Contrib[A].Data := Data;
          Data := PContributorList(NativeUInt(Data) + DWord(CSize));
          ==========
          in reply to: Using part of an .png for an AlphaImageList #47823
          Whookie
          Participant

            Hi again! I've found a way to do what I wanted. The following code might help someone else and is based on MakeIcon32Rect() from acPng.pas

            Code:
            unit SkinImgLstLoader;

            interface

            Uses
            Windows, SysUtils, acPng, acAlphaImageList, Graphics, sConst, sAlphaGraph;

            Type
            TAlphaImageListLoader = Class
            private
            fGraphic: TPNGGraphic;
            fW: Integer;
            fH: Integer;
            fMaskBitmap: TBitmap;
            fFast32Src: TacFast32;
            fDstBmp: TBitmap;
            fFast32Dst: TacFast32;
            fError: Boolean;
            function MakeIcon32Rect(SrcX, SrcY: Integer): HICON;
            public
            constructor Create(const AGraphic: TPNGGraphic; AImgWidth, AImgHeight: Integer); Virtual;
            procedure LoadFrom(AX, AY, ACount: Integer; AImgList: TsAlphaImageList; ReplaceImages: Boolean=TRUE);
            property Error: Boolean read fError;
            End;

            implementation

            Uses
            CommCtrl;

            { TAlphaImageListLoader }

            constructor TAlphaImageListLoader.Create(const AGraphic: TPNGGraphic; AImgWidth, AImgHeight: Integer);
            begin
            fGraphic := AGraphic;
            fW := AImgWidth;
            fH := AImgHeight;
            end;

            procedure TAlphaImageListLoader.LoadFrom(AX, AY, ACount: Integer; AImgList: TsAlphaImageList; ReplaceImages: Boolean);
            var
            iCnt: Integer;
            ico: HICON;
            begin
            fMaskBitmap := TBitmap.Create;
            fMaskBitmap.PixelFormat := pf1bit; // doesnt matter, when bmDDB is used (otherwise pf8bit need)
            fMaskBitmap.HandleType := bmDDB; // doesnt work when bmDIB (works but needs MaskBitmap.Canvas.Pixels[x,y]:=C.A)?
            fMaskBitmap.Width := fW;
            fMaskBitmap.Height := fH;
            //
            fDstBmp := TBitmap.Create;
            fDstBmp.PixelFormat := pf32Bit;
            fDstBmp.Width := fW;
            fDstBmp.Height := fH;
            //
            fFast32Src := TacFast32.Create;
            fFast32Dst := TacFast32.Create;
            //
            if fFast32Src.Attach(fGraphic) And fFast32Dst.Attach(fDstBmp) then
            begin
            AImgList.AcBeginUpdate;
            if ReplaceImages then //else add images to this list(!)
            AImgList.Clear;
            AImgList.Width := fW;
            AImgList.Height := fH;
            fError := FALSE;
            //
            for iCnt := 0 to ACount – 1 do
            begin
            ico := MakeIcon32Rect(AX, AY);
            if ico 0 then
            begin
            fError := fError Or (ImageList_AddIcon(AImgList.Handle, Ico) < 0);
            DestroyIcon(Ico);
            end;
            Inc(AX, fW); // LoadFromRow (LoadFromCol = Inc(AY, fH))
            end;
            AImgList.AcEndUpdate;

            end;
            fFast32Src.Free;
            fFast32Dst.Free;
            fMaskBitmap.Free;
            fDstBmp.Free;
            end;

            function TAlphaImageListLoader.MakeIcon32Rect(SrcX,SrcY: Integer): HICON;
            var
            IconInfo: TIconInfo;
            X, Y : integer;
            begin
            for y := 0 to fH – 1 do
            begin
            for x := 0 to fW – 1 do
            begin
            fFast32Dst[x,y] := fFast32Src[SrcX+x,SrcY+y];
            end;
            end;

            IconInfo.fIcon := True;
            IconInfo.hbmColor := fDstBmp.Handle;
            IconInfo.hbmMask := fMaskBitmap.Handle;

            Result := CreateIconIndirect(IconInfo);
            end;

            end.

            Now one can use that class to load some images from a greater png like:

            Code:
            fImgList := TsAlphaImageList.Create(nil); // create an image list

            // AGraphic … is a png image loaded from somewhere
            // iW, iH … the width/height of one image in the image list
            iLoader := TAlphaImageListLoader.Create(AGraphic, iW, iH);
            //
            // now load some image into the list
            // iX, iY … position (upper left corner) of the first image inside the png
            // iCn … number of images to load (images have to be horizontally side by side)
            // fImgList … img list to add the images to (you could call LoadFrom more than once to have more than one row of images
            // using iLoader.LoadFrom(iX, iY, iCn, fImgList, FALSE);)
            iLoader.LoadFrom(iX, iY, iCn, fImgList);
            iLoader.Free;
            //

          Viewing 4 posts - 1 through 4 (of 4 total)