From: "Colin Sarsfield" Subject: Re: polygonal regions Date: 28 May 1999 00:00:00 GMT Message-ID: <7im1nc$6cu7@forums.borland.com> References: <7ilios$5ng11@forums.borland.com> X-Priority: 3 X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2314.1300 Organization: Another Netscape Collabra Server User X-MSMail-Priority: Normal Newsgroups: borland.public.delphi.winapi Michael Tapal wrote in message news:7ilios$5ng11@forums.borland.com... > can someone give me a peace of code showing the creation/usage of polygonal > regions. > (API functions CreatePolygonRgn and CreatePolyPolygonRgn) > Tested code below. I haven't used CreatePolyPolygonRgn. Colin Sarsfield var i, j: Integer; BalloonRect: TRect; OldObject: THandle; ArrowPoints: array[0..2] of TPoint; ArrowRgn, RoundRgn, BalloonRgn, ShadowRgn: HRgn; DBrush: TBitmap; CHint: array[0..255] of Char; begin BalloonRect := Rect(0, 0, Width - 1, Height - 1); { adjust to leave room for pointer } if FHintDirection in [hdUpRight, hdUpLeft] then Dec(BalloonRect.Bottom, ArrowMargin) else Inc(BalloonRect.Top, ArrowMargin); if FHintDirection in [hdDownLeft, hdUpLeft] then Dec(BalloonRect.Right, ArrowMargin) else Inc(BalloonRect.Left, ArrowMargin); { adjust to leave room for shadow } Dec(BalloonRect.Bottom, ShadowWidth); Dec(BalloonRect.Right, ShadowWidth); { set up drawing regions } if FHintDirection in [hdDownLeft, hdUpLeft] then begin ArrowPoints[0].x := BalloonRect.Right + ArrowMargin; ArrowPoints[1].x := BalloonRect.Right - EllipseWidth div 2; ArrowPoints[2].x := BalloonRect.Right - 1; end else begin ArrowPoints[0].x := BalloonRect.Left - ArrowMargin; ArrowPoints[1].x := BalloonRect.Left + EllipseWidth div 2; ArrowPoints[2].x := BalloonRect.Left + 1; end; if FHintDirection in [hdUpRight, hdUpLeft] then begin ArrowPoints[0].y := BalloonRect.Bottom + ArrowMargin; ArrowPoints[1].y := BalloonRect.Bottom - 1; ArrowPoints[2].y := BalloonRect.Bottom - EllipseHeight div 2; end else begin ArrowPoints[0].y := BalloonRect.Top - ArrowMargin; ArrowPoints[1].y := BalloonRect.Top + 1; ArrowPoints[2].y := BalloonRect.Top + EllipseHeight div 2; end; ArrowRgn := CreatePolygonRgn(ArrowPoints, 3, ALTERNATE); RoundRgn := CreateRoundRectRgn(BalloonRect.Left, BalloonRect.Top, BalloonRect.Right, BalloonRect.Bottom, EllipseWidth, EllipseHeight); BalloonRgn := CreateRectRgn(0, 0, 1, 1); ShadowRgn := CreateRectRgn(0, 0, 1, 1); CombineRgn(BalloonRgn, RoundRgn, ArrowRgn, RGN_OR); DeleteObject(RoundRgn); DeleteObject(ArrowRgn); CombineRgn(ShadowRgn, BalloonRgn, 0, RGN_COPY); OffsetRgn(ShadowRgn, ShadowWidth, ShadowWidth); DBrush := TBitmap.Create; try DBrush.Monochrome := True; DBrush.Height := 8; DBrush.Width := 8; for i := 0 to 7 do for j := 0 to 7 do begin if (i + j) mod 2 = 0 then DBrush.Canvas.Pixels[i, j] := clBlack else DBrush.Canvas.Pixels[i, j] := clWhite; end; with Canvas do begin Brush.Style := bsSolid; Brush.Color := clWhite; Brush.Bitmap := DBrush; Pen.Color := clBlack; Pen.Style := psSolid; Pen.Mode := pmMask; Pen.Width := 1; { draw shadow } OldObject := SelectObject(Canvas.Handle, Brush.Handle); PaintRgn(Canvas.Handle, ShadowRgn); SelectObject(Canvas.Handle, OldObject); { draw balloon } Brush.Bitmap := nil; Brush.Color := clInfoBk; Pen.Mode := pmCopy; OldObject := SelectObject(Canvas.Handle, Brush.Handle); PaintRgn(Canvas.Handle, BalloonRgn); SelectObject(Canvas.Handle, OldObject); { draw border } Brush.Color := clWindowFrame; FrameRgn(Canvas.Handle, BalloonRgn, Brush.Handle, 1, 1); { draw text } SetBKMode(Canvas.Handle, TRANSPARENT); OldObject := SelectObject(Canvas.Handle, Self.Font.Handle); SetTextColor(Canvas.Handle, ColorToRGB(clInfoText)); InflateRect(BalloonRect, 1 - EllipseWidth div 2, 1 - EllipseHeight div 2); DrawText(Canvas.Handle, StrPCopy(CHint, FHint), -1, BalloonRect, DT_LEFT or DT_NOPREFIX or DT_WORDBREAK); SelectObject(Canvas.Handle, OldObject); end; finally DeleteObject(BalloonRgn); DeleteObject(ShadowRgn); DBrush.Free; end;