我按照自定义坐标系    Picture1.Scale (-180, 90)-(180, -90)
画出了世界地图的轮廓,然后利用API填充
        hBrushOld = SelectObject(Picture1.hdc, hBrush) '保存当前画刷
        hBrush = CreateSolidBrush(QBColor(Rnd * 15))        hRgn = CreatePolygonRgn(cpoint(0), countarr(i) + 1, ALTERNATE)
        If hRgn Then FillRgn Picture1.hdc, hRgn, hBrush
        SelectObject Picture1.hdc, hBrushOld '恢复原刷子
        DeleteObject hRgn
        DeleteObject hBrush
可是填充后发现API填充时用的点的坐标好像是屏幕坐标(以Picturebox的左上角为坐标原点),
而实际上我的坐标值都是基于上面自定义的坐标系的,这样图像显示就错了
哪位大侠指点迷津?谢谢!

解决方案 »

  1.   

    在我看来,楼主的以下3行代码可以不要:
            hBrushOld = SelectObject(Picture1.hdc, hBrush) '保存当前画刷
            SelectObject Picture1.hdc, hBrushOld '恢复原刷子
            DeleteObject hBrush
      

  2.   

    哈,scale只对对象的绘图方法有效,对于API绘图,仍使用屏幕座标系统(左上角为原点,Y轴正方向为向下),具刻度单位使用Pixel[像素]。
      

  3.   

    因为你用的CreatePolygonRgn
    和Picture1的DC无关,而自定义坐标是在Picture1上用Polygon函数
    画多边形的同时,就会直接用当前Brush填充
    Public Declare Function Polygon Lib "gdi32" Alias "Polygon" (ByVal hdc As Long, lpPoint As POINTAPI, ByVal nCount As Long) As Long
      

  4.   

    关于polygon的说明:
    描绘一个多边形,由两点或三点的任意系列构成。windows会将最后一个点与第一个点连接起来,从而封闭多边形。多边形的边框用当前选定的画笔描绘,多边形用当前选定的刷子填充我也试了,只有填充三角形才成功啊
    可我的多边形由好多点组成
      

  5.   

    可以定义好所需的各种颜色的brush,用哪种颜色填充,就把那种brush选择进Picture1的DC,调用Polygon画并且填充多边形,全部画完以后再DeleteObject 所有brush
      

  6.   

    /*
    我也试了,只有填充三角形才成功啊
    可我的多边形由好多点组成
    */那不是polygon的问题,可能是你的点的序列有问题吧,我用polygon填充过八边形,没有问题
      

  7.   

    polygon如果只能画三角形的话,就不会叫polygon(英文多边形的意思)了,那不是闹笑话了吗
      

  8.   

    我按照楼上所说
            hBrush = CreateSolidBrush(QBColor(Rnd * 15))
            SelectObject Picture1.hdc, hBrush
            Polygon Picture1.hdc, cpoint(0), countarr(i) + 1
            DeleteObject hBrush可按照这个填充的效果也是以Picturebox左上角为坐标原点冽