tkWinRegion.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:4k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * tkWinRegion.c --
  3.  *
  4.  * Tk Region emulation code.
  5.  *
  6.  * Copyright (c) 1995 Sun Microsystems, Inc.
  7.  *
  8.  * See the file "license.terms" for information on usage and redistribution
  9.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  10.  *
  11.  * RCS: @(#) $Id: tkWinRegion.c,v 1.3 2002/06/14 13:35:49 dkf Exp $
  12.  */
  13. #include "tkWinInt.h"
  14. /*
  15.  *----------------------------------------------------------------------
  16.  *
  17.  * TkCreateRegion --
  18.  *
  19.  * Construct an empty region.
  20.  *
  21.  * Results:
  22.  * Returns a new region handle.
  23.  *
  24.  * Side effects:
  25.  * None.
  26.  *
  27.  *----------------------------------------------------------------------
  28.  */
  29. TkRegion
  30. TkCreateRegion()
  31. {
  32.     RECT rect;
  33.     memset(&rect, 0, sizeof(RECT));
  34.     return (TkRegion) CreateRectRgnIndirect(&rect);
  35. }
  36. /*
  37.  *----------------------------------------------------------------------
  38.  *
  39.  * TkDestroyRegion --
  40.  *
  41.  * Destroy the specified region.
  42.  *
  43.  * Results:
  44.  * None.
  45.  *
  46.  * Side effects:
  47.  * Frees the storage associated with the specified region.
  48.  *
  49.  *----------------------------------------------------------------------
  50.  */
  51. void
  52. TkDestroyRegion(r)
  53.     TkRegion r;
  54. {
  55.     DeleteObject((HRGN) r);
  56. }
  57. /*
  58.  *----------------------------------------------------------------------
  59.  *
  60.  * TkClipBox --
  61.  *
  62.  * Computes the bounding box of a region.
  63.  *
  64.  * Results:
  65.  * Sets rect_return to the bounding box of the region.
  66.  *
  67.  * Side effects:
  68.  * None.
  69.  *
  70.  *----------------------------------------------------------------------
  71.  */
  72. void
  73. TkClipBox(r, rect_return)
  74.     TkRegion r;
  75.     XRectangle* rect_return;
  76. {
  77.     RECT rect;
  78.     GetRgnBox((HRGN)r, &rect);
  79.     rect_return->x = (short) rect.left;
  80.     rect_return->y = (short) rect.top;
  81.     rect_return->width = (short) (rect.right - rect.left);
  82.     rect_return->height = (short) (rect.bottom - rect.top);
  83. }
  84. /*
  85.  *----------------------------------------------------------------------
  86.  *
  87.  * TkIntersectRegion --
  88.  *
  89.  * Compute the intersection of two regions.
  90.  *
  91.  * Results:
  92.  * Returns the result in the dr_return region.
  93.  *
  94.  * Side effects:
  95.  * None.
  96.  *
  97.  *----------------------------------------------------------------------
  98.  */
  99. void
  100. TkIntersectRegion(sra, srb, dr_return)
  101.     TkRegion sra;
  102.     TkRegion srb;
  103.     TkRegion dr_return;
  104. {
  105.     CombineRgn((HRGN) dr_return, (HRGN) sra, (HRGN) srb, RGN_AND);
  106. }
  107. /*
  108.  *----------------------------------------------------------------------
  109.  *
  110.  * TkUnionRectWithRegion --
  111.  *
  112.  * Create the union of a source region and a rectangle.
  113.  *
  114.  * Results:
  115.  * Returns the result in the dr_return region.
  116.  *
  117.  * Side effects:
  118.  * None.
  119.  *
  120.  *----------------------------------------------------------------------
  121.  */
  122. void
  123. TkUnionRectWithRegion(rectangle, src_region, dest_region_return)
  124.     XRectangle* rectangle;
  125.     TkRegion src_region;
  126.     TkRegion dest_region_return;
  127. {
  128.     HRGN rectRgn = CreateRectRgn(rectangle->x, rectangle->y,
  129.     rectangle->x + rectangle->width, rectangle->y + rectangle->height);
  130.     CombineRgn((HRGN) dest_region_return, (HRGN) src_region,
  131.     (HRGN) rectRgn, RGN_OR);
  132.     DeleteObject(rectRgn);
  133. }
  134. /*
  135.  *----------------------------------------------------------------------
  136.  *
  137.  * TkRectInRegion --
  138.  *
  139.  * Test whether a given rectangle overlaps with a region.
  140.  *
  141.  * Results:
  142.  * Returns RectanglePart or RectangleOut.  Note that this is
  143.  * not a complete implementation since it doesn't test for
  144.  * RectangleIn.
  145.  *
  146.  * Side effects:
  147.  * None.
  148.  *
  149.  *----------------------------------------------------------------------
  150.  */
  151. int
  152. TkRectInRegion(r, x, y, width, height)
  153.     TkRegion r;
  154.     int x;
  155.     int y;
  156.     unsigned int width;
  157.     unsigned int height;
  158. {
  159.     RECT rect;
  160.     rect.top = y;
  161.     rect.left = x;
  162.     rect.bottom = y+height;
  163.     rect.right = x+width;
  164.     return RectInRegion((HRGN)r, &rect) ? RectanglePart : RectangleOut;
  165. }
  166. /*
  167.  *----------------------------------------------------------------------
  168.  *
  169.  * TkSubtractRegion --
  170.  *
  171.  * Compute the set-difference of two regions.
  172.  *
  173.  * Results:
  174.  * Returns the result in the dr_return region.
  175.  *
  176.  * Side effects:
  177.  * None.
  178.  *
  179.  *----------------------------------------------------------------------
  180.  */
  181. void
  182. TkSubtractRegion(sra, srb, dr_return)
  183.     TkRegion sra;
  184.     TkRegion srb;
  185.     TkRegion dr_return;
  186. {
  187.     CombineRgn((HRGN) dr_return, (HRGN) sra, (HRGN) srb, RGN_DIFF);
  188. }