在VB环境下开发的一个GIS应用系统,其中地图浏览部分使用的是GPSCtrl的一个控件(北京灵图公司),但该控件不能实现将图形信息输出到位图的功能,而只支持直接的打印机打印。
现在要求实现将打印的信息保存到一个适当大小的图像文件中(BMP/JPG),不知道怎样来实现。问题非常着急,在线等待。(明天要拿去给客户“审判”:( )

解决方案 »

  1.   

    抓图:简单的抓图程序  抓图程序已经是用的非常广泛的一种程序了,下面我们就来用vb编一个简单的抓图程序。
      首先新建窗体,在上面放两个按钮,caption属性分别设为"抓图"和"清除",再放一个picture控件,注意,picture控件的autoredraw属性一定要设为true,调整好位置之后就可以编写代码了。
      首先,抓图时应使窗体隐藏,之后,用winapi函数获得屏幕的设备描述体,然后用bitblt函数画图,再释放设备描述体,就完成了画图。这里用到了三个api函数--getdc,bitblt,releasedc,所以,新建标准模块,调入函数,代码如下:
    Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
    Public Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
    Public Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
    下面,就可以在窗体中调用这些函数。
    在command1_click事件中编写代码:
    form1.hide
    doevents
    screendc=getdc(0)
    retval=bitblt(picture1.hdc,0,0, screen.width,screen.height,screendc,0,0,vbsrccopy)
    retval=releasedc(0,screendc)
    这样就完成了抓图,简单吧。下面是完整的代码,可以参考一下:
    'form1源代码
    Option Explicit
    Dim Screendc As Long
    Dim retval
    Private Sub command1_Click()
    Form1.Hide
    DoEvents
    Screendc = GetDC(0)
    retval = BitBlt(Form1.Picture2.hdc, 0, 0, Screen.Width, Screen.Height, Screendc, 0, _
    0, vbSrcCopy)
    retval = ReleaseDC(0, Screendc)
    End Sub
    Private Sub command2_click()
    Picture2.Cls
    End Sub
    'Module1源代码
    Option Explicit
    Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
    Public Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As_
    Long) As Long
    Public Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
       
       
      

  2.   

    控件有没有hdc属性,如果有的话,哪就好办一点了。用api函数
    1、BitBlt VB声明 
    Declare Function BitBlt Lib "gdi32" Alias "BitBlt" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long 
    说明 
    将一幅位图从一个设备场景复制到另一个。源和目标DC相互间必须兼容 
    返回值 
    Long,非零表示成功,零表示失败。会设置GetLastError 
    参数表 
    参数 类型及说明 
    hDestDC Long,目标设备场景 
    x,y Long,对目标DC中目标矩形左上角位置进行描述的那个点。用目标DC的逻辑坐标表示 
    nWidth,nHeight Long,欲传输图象的宽度和高度 
    hSrcDC Long,源设备场景。如光栅运算未指定源,则应设为0 
    xSrc,ySrc Long,对源DC中源矩形左上角位置进行描述的那个点。用源DC的逻辑坐标表示 
    dwRop Long,传输过程要执行的光栅运算 
    注解 
    在NT环境下,如在一次世界传输中要求在源设备场景中进行剪切或旋转处理,这个函数的执行会失败
    如目标和源DC的映射关系要求矩形中像素的大小必须在传输过程中改变,那么这个函数会根据需要自动伸缩、旋转、折叠、或切断,以便完成最终的传输过程 
     
    2、StretchBlt VB声明 
    Declare Function StretchBlt Lib "gdi32" Alias "StretchBlt" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long 
    说明 
    将一幅位图从一个设备场景复制到另一个。源和目标DC相互间必须兼容。这个函数会在设备场景中定义一个目标矩形,并在位图中定义一个源图象。源矩形会根据需要进行伸缩,以便与目标矩形的大小相符 
    返回值 
    Long,非零表示成功,零表示失败。会设置GetLastError 
    参数表 
    参数 类型及说明 
    hdc Long,目标设备场景 
    x,y Long,目标矩形左上角的x,y坐标,以逻辑坐标表示 
    nWidth,nHeight Long,目标矩形的宽度和高度,以逻辑坐标表示 
    hSrcDC Long,源设备场景。如光栅运算未指定一个源,则这个参数应为零 
    xSrc,ySrc Long,用源DC的逻辑坐标表示的源矩形左上角位置 
    nSrcWidth,nSrcHeight Long,分别指定用逻辑单位(以源DC为基础)传输的一幅图象的宽度和高度。如其中有一个参数的符号(指正负号)与对应的目标参数不符,位图就会在对应的轴上作镜像转换处理 
    dwRop Long,传输过程中进行的光栅运算。如刷子属于光栅运算的一部分,就使用选入目标DC的刷子 
    注解 
    可用GetDeviceCaps函数判断特定的设备场景是否支持此函数
    不可选择对源位图进行剪切或旋转处理,源位图也不能是一个图元文件设备场景 
      

  3.   

    很遗憾,该控件没有hdc属性。谢谢!
    后来我地处理方式提供了两种:
    1、控件自身有“打印”功能,可以输出,选择输出设备是一个picturebox,然后通过savepicture将图片存出来。不过,控件本身打印功能不强,输出地效果不好。
    2、通过抓屏方式实现。感谢各位支持!
    请多多指教!