delphi - Creating a transparent custom bitmap brush -


problem definition

i trying create custom bitmap brush transparency doesn't seem working expected. if @ example. add code , hook paint, create , destroy events.

type   tform3 = class(tform)     procedure formdestroy(sender: tobject);     procedure formcreate(sender: tobject);     procedure formpaint(sender: tobject);   private     fbitmap: tbitmap;   end;  // implementation  function createblockbitmap(const apencolor: tcolor): tbitmap; begin   result := tbitmap.create;   result.transparent := true;    result.canvas.brush.color := clwhite;   result.canvas.brush.style := bsclear;   result.pixelformat := pf32bit;   result.setsize(20, 20);   result.canvas.brush.color := apencolor;   result.canvas.brush.style := bssolid;   result.canvas.fillrect(rect(0,0,10,10)); end;  procedure tform3.formdestroy(sender: tobject); begin   fbitmap.free; end;  procedure tform3.formcreate(sender: tobject); begin   fbitmap := createblockbitmap(clred); end;  procedure tform3.formpaint(sender: tobject); var   colnum: integer;   rownum: integer; begin   // paint rectangle using brush   canvas.pen.color := clgreen;   canvas.brush.bitmap := fbitmap; // using bitmap   canvas.rectangle(50, 50, 250, 250);   // draw block using canvas.draw   rownum := 0 9     colnum := 0 9       canvas.draw(350 + rownum * 20, 50 + colnum * 20, fbitmap); end; 

this code produces 2 painted blocks. left 1 painted using bitmap brush , right hand side 1 painted using number of canvas.draw calls.

brush transparency

i need brush painted transparency similar happen if used hatch brush. answer seems indicate it's possible:

how can draw patternbrush transparent backround (gdi)?

what have tried

1) tried using solid background color instead of using bsclear. makes background white.

  result.canvas.brush.color := clwhite;   result.canvas.brush.style := bssolid; 

if use clfuchsia color fuchsia. tried painting background clfuchsia , setting transparentcolor clfuchsia. canvas.draw option paints transparency , brush doesn't.

2) tried setting alpha channel directly following code:

procedure setalphabitmap(const dest: tbitmap;color : tcolor;alpha:byte); type   trgb32 = record     b, g, r, a: byte;   end;   prgbarray32 = ^trgbarray32;   trgbarray32 = array[0..0] of trgb32; var   x, y:    integer;   line, delta: integer;   colorrgb : tcolor; begin   if dest.pixelformat<>pf32bit  exit;    colorrgb := colortorgb(color);   line  := integer(dest.scanline[0]);   delta := integer(dest.scanline[1]) - line;   y := 0 dest.height - 1   begin     x := 0 dest.width - 1       if tcolor(rgb(prgbarray32(line)[x].r, prgbarray32(line)[x].g, prgbarray32(line)[x].b)) = colorrgb         prgbarray32(line)[x].a := alpha;     inc(line, delta);   end; end; 

and calling routine after rectangle has been painted using background color.

  result.canvas.brush.style := bssolid;   result.canvas.fillrect(rect(0,0,10,10));   setalphabitmap(result, clblack, 0); // set alpha channel end; 

i know alpha channel working because if pass in alpha value of 255 shows in black in canvas.draw too.

  setalphabitmap(result, clblack, 255); 

3) tried testing creating pattern brush , assigning instead of bitmap. produces same results. fbrush hbrush.

  fbrush := createpatternbrush(fbitmap.handle); 

and setting brush this:

  canvas.brush.handle := fbrush;  

4) tried calling setbkmode indicated in answer above. made no difference @ all.

  canvas.pen.color := clgreen;   canvas.brush.bitmap := fbitmap;    setbkmode(canvas.handle, transparent); // doesn't make difference   canvas.rectangle(50, 50, 250, 250); 

edit

5) tested monochrome bitmap , has same problem. image painted white background , black foreground brush , transparent canvas.draw.

function createmonochromebitmap: tbitmap; begin   result := tbitmap.create;   result.transparent := true;   result.canvas.brush.color := clwhite;   result.canvas.brush.style := bssolid;   result.pixelformat := pf1bit;   result.setsize(20, 20);   result.canvas.brush.color := clblack;   result.canvas.brush.style := bssolid;   result.canvas.fillrect(rect(0,0,10,10)); end; 

and in constructor:

fbitmap := createmonochromebitmap; fbrush := createpatternbrush(fbitmap.handle); 

in paint set handle rather bitmap property.

canvas.brush.handle := fbrush;  

try clear canvas null color before drawing loop.

canvas.clear(talphacolorrec.null);

greetings. pau.


Comments

Popular posts from this blog

c# - Better 64-bit byte array hash -

webrtc - Which ICE candidate am I using and why? -

php - Zend Framework / Skeleton-Application / Composer install issue -