'平铺图片
Public Sub FillMap(hDCOut As Long, _
        x As Long, y As Long, _
        Width As Long, Height As Long, _
        hSrcDC As Long, _
        SrcX As Long, SrcY As Long, _
        SrcWidth As Long, SrcHeight As Long, _
        Optional dwRop As RasterOpConstants = vbSrcCopy, _
        Optional ByVal StepX As Long = &H80000000, _
        Optional ByVal StepY As Long = &H80000000)
    Dim I As Long, J As Long
    Dim StartX As Long, StartY As Long
    Dim PutX As Long, PutY As Long
    Dim PutWi As Long, PutHe As Long
    Dim TempNum As Long
    
    If StepX = &H80000000 Then StepX = x
    If StepY = &H80000000 Then StepY = y
    'Debug.Print "Step "; StepX; StepY;
    
    Do While StepX > 0
        StepX = StepX - SrcWidth
    Loop
    Do While StepX <= 0
        StepX = StepX + SrcWidth
    Loop
    StepX = StepX - SrcWidth
    
    Do While StepY > 0
        StepY = StepY - SrcHeight
    Loop
    Do While StepY <= 0
        StepY = StepY + SrcHeight
    Loop
    StepY = StepY - SrcHeight
    
    'Debug.Print StepX; StepY
    'Debug.Print SrcWidth
    
    StartX = StepX
    Do While StartX < x
        StartX = StartX + SrcWidth
    Loop
    StartX = StartX - SrcWidth
    
    StartY = StepY
    Do While StartY < y
        StartY = StartY + SrcHeight
    Loop
    StartY = StartY - SrcHeight
    
    For I = StartY To y + Height - 1 Step SrcHeight
        For J = StartX To x + Width - 1 Step SrcWidth
            PutWi = SrcWidth
            PutHe = SrcHeight
            
            PutX = 0
            PutY = 0
            
            If I < y Then
                PutY = y - I
                PutHe = PutHe - PutY
            End If
            If I + SrcHeight - 1 > y + Height - 1 Then
                PutHe = PutHe + ((y + Height - 1) - (I + SrcHeight - 1))
            End If
            
            If J < x Then
                PutX = x - J
                PutWi = PutWi - PutX
            End If
            If J + SrcWidth - 1 > x + Width - 1 Then
                PutWi = PutWi + ((x + Width - 1) - (J + SrcWidth - 1))
            End If
            
            Call BitBlt(hDCOut, _
                    J + PutX, I + PutY, _
                    PutWi, PutHe, _
                    hSrcDC, _
                    SrcX + PutX, SrcY + PutY, _
                    dwRop)
            
            'Debug.Print J; I; SrcWidth; SrcHeight; PutX; PutY; PutWi; PutHe
            
        Next J
    Next I
    'Call BitBlt(hDCOut, 0, 0, SrcWidth, SrcHeight, hSrcDC, 0, 0, vbSrcCopy)
    
End Sub
API函数自己加

解决方案 »

  1.   

    非常感谢!不过BitBlt()函数用来做什么?
      

  2.   

    【函数】
    BitBlt【操作系统】
    Win9X:Yes
    WinNT:Yes【声明】
    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 【其它】  在NT环境下,如在一次世界传输中要求在源设备场景中进行剪切或旋转处理,这个函数的执行会失败
      如目标和源DC的映射关系要求矩形中像素的大小必须在传输过程中改变,那么这个函数会根据需要自动伸缩、旋转、折叠、或切断,以便完成最终的传输过程【参数表】
      hDestDC --------  Long,目标设备场景  x,y ------------  Long,对目标DC中目标矩形左上角位置进行描述的那个点。用目标DC的逻辑坐标表示  nWidth,nHeight -  Long,欲传输图象的宽度和高度  hSrcDC ---------  Long,源设备场景。如光栅运算未指定源,则应设为0  xSrc,ySrc ------  Long,对源DC中源矩形左上角位置进行描述的那个点。用源DC的逻辑坐标表示  dwRop ----------  Long,传输过程要执行的光栅运算
                                             ——Snow API
    --------------------------------------------------------------------
        函数功能:该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境。    函数原型:BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop);    参数:    hdcDest:指向目标设备环境的句柄。    nXDest:指定目标矩形区域左上角的X轴逻辑坐标。    nYDest:指定目标矩形区域左上角的Y轴逻辑坐标。    nWidth:指定源和目标矩形区域的逻辑宽度。    nHeight:指定源和目标矩形区域的逻辑高度。    hdcSrc:指向源设备环境的句柄。    nXSrc:指定源矩形区域左上角的X轴逻辑坐标。    nYSrc:指定源矩形区域左上角的Y轴逻辑坐标。    dwRop:指定光栅操作代码。这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色。    下面列出了一些常见的光栅操作代码:    BLACKNESS:表示使用与物理调色板的索引0相关的色彩来填充目标矩形区域,(对缺省的物理调色板而言,该颜色为黑色)。    DSTINVERT:表示使目标矩形区域颜色取反。    MERGECOPY:表示使用布尔型的AND(与)操作符将源矩形区域的颜色与特定模式组合一起。    MERGEPAINT:通过使用布尔型的OR(或)操作符将反向的源矩形区域的颜色与目标矩形区域的颜色合并。    NOTSRCCOPY:将源矩形区域颜色取反,于拷贝到目标矩形区域。    NOTSRCERASE:使用布尔类型的OR(或)操作符组合源和目标矩形区域的颜色值,然后将合成的颜色取反。    PATCOPY:将特定的模式拷贝到目标位图上。    PATPAINT:通过使用布尔OR(或)操作符将源矩形区域取反后的颜色值与特定模式的颜色合并。然后使用OR(或)操作符将该操作的结果与目标矩形区域内的颜色合并。    PATINVERT:通过使用XOR(异或)操作符将源和目标矩形区域内的颜色合并。    SRCAND:通过使用AND(与)操作符来将源和目标矩形区域内的颜色合并。    SRCCOPY:将源矩形区域直接拷贝到目标矩形区域。    SRCERASE:通过使用AND(与)操作符将目标矩形区域颜色取反后与源矩形区域的颜色值合并。    SRCINVERT:通过使用布尔型的XOR(异或)操作符将源和目标矩形区域的颜色合并。    SRCPAINT:通过使用布尔型的OR(或)操作符将源和目标矩形区域的颜色合并。    WHITENESS:使用与物理调色板中索引1有关的颜色填充目标矩形区域。(对于缺省物理调色板来说,这个颜色就是白色)。    返回值:如果函数成功,那么返回值非零;如果函数失败,则返回值为零。    Windows NT:若想获取更多错误信息,请调用GetLastError函数。    备注:如果在源设备环境中可以实行旋转或剪切变换,那么函数BitBlt返回一个错误。如果存在其他变换(并且目标设备环境中匹配变换无效),那么目标设备环境中的矩形区域将在需要时进行拉伸、压缩或旋转。    如果源和目标设备环境的颜色格式不匹配,那么BitBlt函数将源场景的颜色格式转换成能与目标格式匹配的格式。当正在记录一个增强型图元文件时,如果源设备环境标识为一个增强型图元文件设备环境,那么会出现错误。如果源和目标设备环境代表不同的设备,那么BitBlt函数返回错误。    Windows CE:在Windows CE 1.0版中,参数dwRop只可以指定为下列值:SRCCOPY、SRCAND、SRCPAINT、SRCINVERT。在Windows CE 2.0版中,参数dwRop可以是任何光栅操作代码值。    速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:wingdi.h;库文件:gdi32.lib。
                                             ——《Win32 API参考大全》
      

  3.   

    bitblt
    首先测出窗体的长,宽(用pixel表示)
    然后用循环即可
    如h为窗体的长
      w为窗体的宽
      h1为 图片长
      w1为 图片宽
    for i= 0 to h setp h1
      for j= 0 to w setp w1
      a=bitblt(xxx.hdc,i,j,h1,w1,ppp.hdc,0,0,vbsrccopy)
      next j
    next i不止可否???
    : )
      

  4.   

    Public Sub FillMap(hDCOut As Long, _输出的hDC
            x As Long, y As Long, _输出的坐标
            Width As Long, Height As Long, _输出的大小
            hSrcDC As Long, _原图片hDC
            SrcX As Long, SrcY As Long, _原图片坐标
            SrcWidth As Long, SrcHeight As Long, _原图片大小
            Optional dwRop As RasterOpConstants = vbSrcCopy, _
            Optional ByVal StepX As Long = &H80000000, _
            Optional ByVal StepY As Long = &H80000000)