*现有一幅底图(JPG格式)大于MDI窗口,如1024*768,窗口在运行时可以改变大小,*问题是:如何使底图始终充满MDI窗口(缩放充满方式),而不是在窗口缩小时只显示图
片的左上角(切割方式)?

解决方案 »

  1.   

    picture.move (0,0) to (form.hight,form.wide)
      

  2.   

    '创建一个mdi窗体在窗体放置两个picturebox:picWork在picHolder内,在picWork中加
    载背景图片
    '在放置一个timer控件相应的菜单项,然后mdi窗体粘贴如下代码Option ExplicitPrivate 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
    Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal lDC As Long)
    As Long
    Private Declare Function DeleteDC Lib "gdi32" (ByVal lDC As Long) As Long
    Private Declare Function SelectObject Lib "gdi32" (ByVal lDC As Long, ByVal
    hObject As Long) As LongDim pic As StdPicture, hMemDC As Long, pHeight As Long, pWidth As LongPrivate Sub MDIForm_Load()
        picHolder.Visible = False
        picWork.Visible = False
        picWork.AutoRedraw = True
        picWork.AutoSize = True
        pHeight = picWork.Height
        pWidth = picWork.Width
        Set pic = picWork.Picture
        Set picWork.Picture = Nothing
        picWork.AutoSize = False    hMemDC = CreateCompatibleDC(picWork.hDC)
        SelectObject hMemDC, pic.Handle
    End SubPrivate Sub MDIForm_Resize()
        Timer1.Enabled = False
        Timer1.Enabled = True
    End SubPrivate Sub MDIForm_Unload(Cancel As Integer)
        Set pic = Nothing
        DeleteDC hMemDC
    End SubPrivate Sub mnuCenter_Click()
        mnuTile.Checked = False
        mnuCenter.Checked = True
        MDIForm_Resize
    End SubPrivate Sub mnuTile_Click()
        mnuTile.Checked = True
        mnuCenter.Checked = False
        MDIForm_Resize
    End SubPrivate Sub Timer1_Timer()
        Timer1.Enabled = False
        If WindowState <> vbMinimized Then
            Dim X As Long, Y As Long
            picWork.BackColor = BackColor
            picWork.Move 0, 0, ScaleWidth, ScaleHeight
            If mnuTile.Checked Then
                For X = 0 To ScaleWidth Step pWidth
                    For Y = 0 To ScaleHeight Step pHeight
                        BitBlt picWork.hDC, X \ Screen.TwipsPerPixelX, Y \
    Screen.TwipsPerPixelX, pWidth \ Screen.TwipsPerPixelX, pHeight \
    Screen.TwipsPerPixelY, hMemDC, 0, 0, vbSrcCopy
                    Next
                Next
            Else
                X = (ScaleWidth - pWidth) \ 2: X = X \ Screen.TwipsPerPixelX
                Y = (ScaleHeight - pHeight) \ 2: Y = Y \ Screen.TwipsPerPixelY
                BitBlt picWork.hDC, X, Y, pWidth \ Screen.TwipsPerPixelX,
    pHeight \ Screen.TwipsPerPixelY, hMemDC, 0, 0, vbSrcCopy
            End If
            Set Picture = picWork.Image
            Visible = False
            Visible = True
        End If
    End Sub
      

  3.   

    '在主窗口中(frmMain),选择背景菜单
    Private Sub mnuSelectGround_Click()
    On Error GoTo Errhandle
        Dim fName As String, sName As String, OfName As OPENFILENAME
        
        OfName.lStructSize = Len(OfName)
        OfName.hwndOwner = hwnd
        OfName.hInstance = App.hInstance
        OfName.lpstrFilter = "图片文件" & Chr(0) & "*.Bmp;*.jpg;*.jpeg;*.gif;*.ico"
        OfName.lpstrFile = Space(255) & Chr(0)
        OfName.nMaxFile = 256
        OfName.lpstrFileTitle = Space(255) & Chr(0)
        OfName.nMaxFileTitle = 256
        OfName.lpstrTitle = "选择图片..."
        OfName.flags = OFN_LONGNAMES + OFN_PATHMUSTEXIST + OFN_FILEMUSTEXIST + OFN_HIDEREADONLY
        
        If GetOpenFileName(OfName) Then
            Screen.MousePointer = 11
            DoEvents
            
            SaveSetting "OrientZiXun", "BackGround", "PathValue", OfName.lpstrFile
            frmBack.SetBack
            frmBack.Hide
            
            Screen.MousePointer = 0
        End If
        
        Exit Sub
    Errhandle:
        Screen.MousePointer = 0
        ErrView Err.Description
    End Sub
    '添加一个背景窗口:frmBack,在窗口里面定义一个公共的设置背景函数,里面放一个PictureBox控件,设置AUTOSIZE为TRUE
    Public Sub SetBack()
    On Error Resume Next
        Dim i As Long, j As Long, ls_Path As String
        
        ls_Path = GetSetting("OrientZiXun", "BackGround", "PathValue")
        If Trim(ls_Path) <> "" Then
            If Dir(ls_Path) <> "" Then
                picBack.Picture = LoadPicture(ls_Path)
            Else
                picBack.Picture = LoadPicture(ls_Path)
            End If
        Else
            picBack.Picture = imgDefault.Picture
        End If    If frmMain.mnuLaShen.Checked Then'拉伸
            Me.PaintPicture picBack.Picture, 0, 0, frmMain.Width, frmMain.Height - 1800
        Else'平铺
            For j = 0 To frmMain.ScaleHeight Step picBack.ScaleHeight
                For i = 0 To frmMain.ScaleWidth Step picBack.ScaleWidth
                    Me.PaintPicture picBack.Picture, i, j
                Next
            Next
        End If
    '    Me.Font.Name = "楷体_GB2312"
    '    Me.ForeColor = vbWhite
    '    Me.Font.Size = 24
    '    Me.FontBold = True
    '    Me.CurrentX = frmMain.ScaleWidth - 3300
    '    Me.CurrentY = frmMain.ScaleHeight - 2500
    '    Me.Print "咨询管理系统"
        frmMain.Picture = Me.Image
        frmBack.Tag = Val(frmBack.Tag) + 1
        frmMain.BackColor = Val(frmBack.Tag)
    End Sub'在模块中
    Public Type OPENFILENAME
        lStructSize As Long
        hwndOwner As Long
        hInstance As Long
        lpstrFilter As String
        lpstrCustomFilter As String
        nMaxCustFilter As Long
        nFilterIndex As Long
        lpstrFile As String
        nMaxFile As Long
        lpstrFileTitle As String
        nMaxFileTitle As Long
        lpstrInitialDir As String
        lpstrTitle As String
        flags As Long
        nFileOffset As Integer
        nFileExtension As Integer
        lpstrDefExt As String
        lCustData As Long
        lpfnHook As Long
        lpTemplateName As String
    End Type'系统全局常量========================================================================
    Public Const OFN_LONGNAMES = &H200000
    Public Const OFN_PATHMUSTEXIST = &H800
    Public Const OFN_FILEMUSTEXIST = &H1000
    Public Const OFN_HIDEREADONLY = &H4
    Public Const OFN_EXPLORER = &H80000
    Public Const OFN_OVERWRITEPROMPT = &H2Public Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
      

  4.   

    http://expert.csdn.net/Expert/topic/2173/2173480.xml?temp=.7191736
      

  5.   

    http://expert.csdn.net/Expert/topic/2173/2173480.xml?temp=.7191736
      

  6.   

    Private Sub Form_Load()
        
        Picture1.Visible = False
        Picture1.Picture = LoadPicture("fasdfsdf.jpg")
        
    End SubPrivate Sub Form_Resize()
        
        Me.AutoRedraw = True
        
        Me.PaintPicture Picture1.Picture, 0, 0, Me.ScaleWidth, Me.ScaleHeight
        
        Me.AutoRedraw = False
        
    End Sub
      

  7.   

    还有一个属性漏了。
    Picture1.AutoSize = True
      

  8.   

    首先非常感谢兄台们的指点!!!小哥在此有礼了!!1
    to watt(瓦特):
    你的方法可以,但我所有的MDIchild的窗口都无法show到图片上面而成为不可见的窗口,你能帮我解决这一问题吗?to  ch21st(风尘鸟):
    你的方法中的Time如何设置,    mnuTile.Checked = False   mnuCenter.Checked = True
    没有定义,请告之在哪里定义,是一个复选框吗?
    Private Sub MDIForm_Resize()
        Timer1.Enabled = False <===这行有意义吗?
        Timer1.Enabled = True
    End Subto cuizm(射天狼):你的方法与watt(瓦特)方法的原理一样,虽然没有试,但我觉得应有同样的问题存在吧,你用测试过吗?
      

  9.   

    我写的是用在SDI窗体上的应用,在MDI窗体上没有PaintPicture方法,所以不可用,
    你是放了一个PictureBox上去吧?,这样的话,MDI的工作区就被PictureBox占去了,
    也就没有地方Show子窗体,我以前是用动态计数在显示的子窗体的个数(或计数)来
    决定作背景的PictureBox是否显示的,很容易写的,你试试吧!
      

  10.   

    to watt(瓦特):
    你的意思是说同一时刻MDI中只能要么显示子窗体,要么显示PictureBox,两者只能取其一,