请问,想在PictureBox中只画出照片的左上角(直角三角形)该怎么办?
由于照片是随机载入的,PictureBox中还要画其它的图形。
所以,不能用事先裁剪源照片的办法,只能用遮住一部分的办法,但又不能清除其它部分(因为还有其它图形)问题基本上就是:如何显示多边形的照片?还请大虾们指教,谢谢!

解决方案 »

  1.   

    你问了一个图像处理的最为典型的问题,即镂空操作。镂空操作有算法大致如下:
    一,把目标DC上欲画上新图部分涂黑,建议使用FillRgn来进行此操作;
    二,将源图中对应于目标DC中透空部分区域涂黑;
    三,把源图覆盖到目标DC上,运算方式为vbsrcPaint[即and方式]
    先吃饭去,容后再给解释!
      

  2.   

    用两个picturebox,一个(A)作为容器,另一个B放置在A上。A中放置背景图片,B中放置要成为多边形的图片。然后用以下函数产生一个多边形,比如直角三角形,
    Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
    然后用
    Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
    裁剪picturebox B。在此之前可先定位B在A中的位置。
      

  3.   

    [接第一楼]
    步骤三中可使用bitblt这个API。
    步骤二可这样来实现:将新图加载到一stdpicture对象中,将该对象中图像拷到一内存DC中,然后将左上三角区域以外部分(即透空部份)涂黑。
      

  4.   

    用SetWindowRgn就可以了,具体的说明你看看MSDN吧
      

  5.   

    进一步的具体目标是这样的,
    用户先选择一个照片文件名,再选择一个形状(圆形、多边形、环形!!!)
    然后随机的显示在背景PictureBox中,重复步骤,允许载入多张照片。不知道也许SetWindowRgn不行吧?为了简化过程,不必新建DC,总是有至少一个不显示的PictureBox作为缓冲DC用。To xinliangyu(yxl):
    我觉得最难的是第二步骤,因为有可能是多边型,甚至是复合型,如果进一步的话,以后还可能出现中间透空的形状,比较简单的想法就是:如何把某个区域(可能是非常复杂的形状,含交错)以外的部分涂成黑色?(内部交错部分是否要包含,要看用户的选择)
    不知道有没有对应于建立区域的反函数?(目前建立区域用的是CreateRectRgn、CreatePolygonRgn....)
      

  6.   

    使用combineRgn就能实现任意已存在区域的AND,OR,NOT、Xor运算,能产生任何形状的区域!
      

  7.   

    如界面变化不太大,使用picturebox并setwindowrgn当然也能很好的达到效果。
    当区域变化大,位置也在变化,甚至背景也不停的在变动,这时使用任何现成的控件作为显示载体的做法都有极大的缺陷,比如资源占用多等,一些效果则根本就难于实现,比如某些图片半透明等,不一而足。一切取决于你要做出的效果的复杂程度。
      

  8.   

    现在遇到一个奇怪的问题,无法将目标DC三角形涂黑。
    实际上,目标DC只有第一次能涂黑(三角形部分),然后在此位置,我把已变动的照片(三角形以外都是黑色)vbSrcPaint 过去,第一次是可以正常显示三角型图片的。但是以后,无论用什么方法,都不能再次把目标DC(三角形)涂黑。(目标DC因为有其它图形,所以不能先用Cls)两次用的语句是完全一样的,而且同样的语句用在其它的PictureBox中(先Cls过)是可以涂出黑三角的,真不知道为什么?
      

  9.   

    会不会是你目标Dc所在对象的autoredraw属性设置成了true?
    第一次能而后就不行了?这就怪了!
    如仍不能解决,方便的话话把代码发与本人瞅瞅,说不定会帮上忙:[email protected]
      

  10.   

    代码很简单的主要如下:hRgn=CreateRectRgn(0,0,100,100) 'hRgn 已设为全局 As Long上面是建立区域的代码,与下面画区域的代码不在同一过程中With picMap
      .AutoRedraw=True
      FillRgn .hdc, hRgn, GetStockObject(BLACK_BRUSH)
      .AutoRedraw=False
    End with奇怪的是:
    1、同样的语句(画区域)第一次能够执行,但以后却没有效果。
    2、同样的语句用在另一个PictureBox 中可以执行,唯一的区别在于,另一个PictureBox 先 Cls了一下。
    另外,我想问一下:区域的原点坐标是多少 (0,0)或 (1,1)?画图类的API用的原点坐标是否也同上?
      

  11.   

    With picMap
      .AutoRedraw=True
    ……
    改为
    With picMap
      .AutoRedraw=false
    看看?
    原点坐标是(0,0)
      

  12.   

    虽然不成功,但还是非常感谢老兄。为了表示感谢,本帖已经加分到顶了。(不好意思,俺只能加到100)最后才发现,原来定制多边形实在太麻烦了。
    俺决定使用蒙图的方式,这样就可实现更多的图形,呵呵能否麻烦老兄帮忙看一下:【问】如何把图形里的某种颜色围成一个“区域”? 
    http://community.csdn.net/Expert/topic/4356/4356706.xml?temp=.9203607谢谢 :)
      

  13.   

    最后才发现,原来定制多边形实在太麻烦了。
    俺决定使用蒙图的方式,这样就可实现更多的图形,呵呵
    ====================
    对,应该使用对应的mask模板简单方便,而且以后添加多边形都方便得多。
      

  14.   

    现在出现一个大问题,我要显示的照片里有黑色的部分,我可不想把它变透空哦。
    但是我能肯定,照片里的红色部分肯定要透空。也就是说,我预先用绘图软件做好了一个,三角形外是红色,内部是要显示的照片。
    我怎么把它叠加到现有的PictureBox中呢?现有PictureBox的内容是一直在动态变化的,
    而我又不想把每张照片都载入到一个新的PictureBox中,再裁剪边框的办法,
    那样太浪费了,我只是要在现有PictureBox中显示而已。诶,想不出,郁闷