菜鸟一只,想得到MDI窗体的背景图自动拉伸与自动居中的代码!望各位大哥帮忙!我看过了论坛里的一些帖子,但不是这里有问题就是那里有问题!
想求直接的代码!(最好简单易懂一点)

解决方案 »

  1.   

    自动拉伸与自动居中??  
    是不是
    先加一个的picturebox
    align=3
    borderstyle=0
     在中读取要加入的图片
    在再MDIForm_Resize()中设置读取图片的长宽(picturebox)以及picturebox的长宽   我想应该是这样吧 那个扩大图片的code 欧给忘了 要不就给你写出来了  喳喳msdn吧
      

  2.   

    http://dev.csdn.net/develop/article/28/28936.shtm
    看看吧!!
      

  3.   

    http://dev.csdn.net/develop/article/28/28936.shtm
    里所用的方法是可以,我早就试过了,只是缩放好像不太容易!
      

  4.   

    父窗体中代码:
    Private Sub MDIForm_Load()    With frmPicture
            .Show
            .Left = 0
            .Top = 0
            .Width = Me.ScaleWidth
            .Height = Me.ScaleHeight
        End With
    End SubPrivate Sub MDIForm_Resize()
        With frmPicture
        .Show
        .Left = 0
        .Top = 0
        .Width = Me.ScaleWidth
        .Height = Me.ScaleHeight
        End With
    End Sub
    子窗体中代码子窗体中添加一个image控件名字为imgBackPic,其stretch 属性为 true
    Private Sub Form_Load()
    '
    On Error GoTo 17
    imgBackPic.Left = 0
    imgBackPic.Top = 0
    imgBackPic.Width = Me.ScaleWidth
    imgBackPic.Height = Me.ScaleHeightimgBackPic.Picture = LoadPicture(App.Path & "\userpic.jpg")
    Exit Sub
    17:
    MsgBox Err.Description
    End SubPrivate Sub Form_Resize()
    With imgBackPic '子窗体中添加一个image控件名字为imgBackPic,其stretch 属性为 true
    .Width = Me.ScaleWidth
    .Height = Me.ScaleHeight
    End WithEnd Sub
      

  5.   

    在MID窗体上放置一个PICTUREBOX控件,将其ScaleMode属性设为Pixel,再在PICTUREBOX里面放一个IMAGE控件,在Image控件中放张照片,再将Image控件的Visible属性设为False,然后在MIDFORM的RESIZE事件中写如下代码:
    Private Sub MDIForm_Resize()
    Dim X as long
    Dim Y as long
    Dim H as long
    Dim W as long
    With Picture1 
       .Move 0, 0, Me.Width, Me.Height
       .Cls
       X=(.scalewidth-image1.width)\2   '如果想改为拉伸则:X=0
       Y=(.scaleheight-image1.height)\2 '如果想改为拉伸则:Y=0
       H=image1.height                  '如果想改为拉伸则:H=.scalehhight
       W=image1.width                   '如果想改为拉伸则:W=.scalehwidth
       .PaintPicture Image1.Picture,X,Y,W,H
    End With
    End Sub
    按下F5,并改变你的窗体的宽度和高度看看。这个主要是用了PaintPicture 方法,参考MSDN有详细的说明。
      

  6.   

    我给你的这个程序在垂直位置上会有一点小小的误差,原因是在于窗体的高度是从蓝色的标题栏开始计算的,所以实际运行的时候你会发现图片的位置有点考下了,你可以估计一下窗体标题栏和菜单栏的总高度,在改变PictureBox的位置和大小的时候减去这个数值。
    我刚才试验了一下我的代码,大概在360左右,所以上面的那段程序改一句:
     .Move 0, 0, Me.Width, Me.Height-360千万要把Image控件的Stretch属性设为False,否则的话你在居中显示的时候将非常有可能得到一个变形的图像。因为一旦这个属性被设为True之后图像将自动缩放到和Image控件一样的形状了,你就无法得到图片的原始尺寸了。顺便指正一下  haha22haha(.|~) 朋友的一个小小错误:
    MIDFORM是没有ScaleWidth & ScaleHeight之类的属性的。直接使用Width和Height就可以了
      

  7.   

    还要补充一下:我试验的时候没有加菜单栏,所以后面减了一个360,如果你的MIDFORM有菜单的话可能就要减720了,因为菜单栏的高度似乎和标题栏差不多。
      

  8.   

    Print "MDIForm1.Width=" & MDIForm1.Width
    Print "MDIForm1.ScaleHeight=" & MDIForm1.ScaleHeight
    Print "MDIForm1.ScaleWidth=" & MDIForm1.ScaleWidth
    Print "MDIForm1.Height=" & MDIForm1.Height
    Print "Me.Height=" & Me.Height
    Print "Me.ScaleHeight=" & Me.ScaleHeight
    Print "Me.width   =" & Me.Width
    Print "Me.ScaleWidth=" & Me.ScaleWidth
      

  9.   

    建议将画好的图形显示在MDI窗口中,不要用PICTUREBOX控件,否则子窗口会显示在PICTUREBOX控件后边~~~~~~~
      

  10.   

    用子类技术处理MDI主窗口的MDIClient子窗口的WM_Paint消息
    缩放图片用StretchBlt
    取得客户区大小用GetClientRect
    居中只是坐标计算问题
      

  11.   

    可参考:
    http://vbaccelerator.com/home/VB/Code/Libraries/Graphics_and_GDI/Tiling_Bitmaps_Into_Forms__Controls_and_MDI_Form_Backgrounds/article.asp
      

  12.   

    WallesCai(WallesCai)的方法固然可以,但是,这个时候子窗体显示不出来的啊!当然可以采用当有子窗体的时候背景隐藏,不过这只能是最大化的时候万一不是最大化的时候就麻烦了!
      

  13.   

    zyl910(910:分儿,我又来了!) 的方法太高深了,有没有现成的代码发一个?邮箱:[email protected]
      

  14.   

    这只算基础界面编程(SubClass)
    高级界面编程是.Net阴影菜单(Hook)
    超高级界面编程是金山词霸的屏幕取词(API Hook)vbaccelerator.com的代码已经封装成dll,可直接使用
      

  15.   

    就是
    http://vbaccelerator.com/home/VB/Code/Libraries/Graphics_and_GDI/Tiling_Bitmaps_Into_Forms__Controls_and_MDI_Form_Backgrounds/article.asp
    左边的“VB6 Bitmap Tiling Source and Demonstration (46K)”就是下载页面
      

  16.   

    唉,只好用绝招了:
    在MID窗体上放置一个PICTUREBOX控件,将其ScaleMode属性设为Pixel,再在PICTUREBOX里面放一个IMAGE控件,在Image控件中放张照片,再将Image控件的Visible属性设为False。
    一直到这里都是和前面说的一样的,现在再加一个MDI子窗体,就是添加一个普通窗体,并将他的MDICHILD属性改为TRUE就对了,设置这个子窗体的属性,将它的BORADSTYLE设为NONE(无边框),然后将它的AUTOREDRAW设为TRUE,SCALEMODE设为PIXEL(像素),APEARANCE属性设为FLAT(平板窗体)。对了,原来MDI窗体里面那个PICTUREBOX的VISIBLE属性改为FALSE,因为现在我们只是用它来作为一个容器用,而不是用来显示图片,所以不要让它可见。
    然后在MIDFORM的RESIZE事件中写如下代码:
    Private Sub MDIForm_Resize()
    Dim X as long
    Dim Y as long
    Dim H as long
    Dim W as long
    With Form1      '这里原来是PICTURE1,现在我们用FORM1来显示
       .Move 0, 0, Me.Width - 128, Me.Height -400 '如果有菜单的话后面的数字改为704
       .Cls
       X=(.scalewidth-image1.width)\2   '如果想改为拉伸则:X=0
       Y=(.scaleheight-image1.height)\2 '如果想改为拉伸则:Y=0
       H=image1.height                  '如果想改为拉伸则:H=.scalehhight
       W=image1.width                   '如果想改为拉伸则:W=.scalehwidth
       .PaintPicture Image1.Picture,X,Y,W,H
       .refresh '因为我们将FORM的AUTOREDRAW设为TRUE,所以要REFRESH一下才能显示
    End With
    End Sub程序基本没有动,只是昨天我写的时候没有考虑到加载子窗体会被挡住的问题(好像有点白痴哦,哪有用了MDI窗体不用子窗体的呀,呵呵)所以现在我们专门使用一个没有边框的平板窗体来显示图片,而显示的方法和大小比例还是一样的。所以代码看上去和原来没有什么变化。
    至于为什么.Move 0, 0, Me.Width - 128, Me.Height -400 要减128和400,这个问题上面的帖子我已经讨论过了,这里不再重复了。罪过啊罪过,居然用了这么多控件,资源浪费得一塌糊涂,罪过,阿弥陀佛!
      

  17.   

    多谢 WallesCai(WallesCai) 网友,问题已经解决了
    主要是采用你的思路
    不过我改动后才能满足我的要求。在Resize事件里我作如下改动
    Private Sub MDIForm_Resize()
    On Error Resume Next
    Dim X As Long
    Dim Y As Long
    Dim H As Long
    Dim W As Long
    Dim picW As Long
    Dim picH As LongWith Form1      'ÕâÀïÔ­À´ÊÇPICTURE1,ÏÖÔÚÎÒÃÇÓÃFORM1À´ÏÔʾ
       .Move 0, 0, Me.ScaleWidth, Me.ScaleHeight   'Èç¹ûÓв˵¥µÄ»°ºóÃæµÄÊý×Ö¸ÄΪ704
       .Cls
       picW = Me.Image1.Picture.Width
       picH = Me.Image1.Picture.Height
       If picW / picH < Me.ScaleWidth / Me.ScaleHeight Then
            Image1.Height = Me.ScaleHeight
            Image1.Width = Me.ScaleHeight * picW / picH
        Else
            Image1.Width = Me.ScaleWidth
            Image1.Height = Me.ScaleWidth * picH / picW
        End If
       X = (.Width - Image1.Width) / 2 '&Egrave;&ccedil;&sup1;&ucirc;&Iuml;&euml;&cedil;&Auml;&Icirc;&ordf;&Agrave;&shy;&Eacute;ì&Ocirc;ò&pound;&ordm;X=0
       Y = (.Height - Image1.Height) / 2 '&Egrave;&ccedil;&sup1;&ucirc;&Iuml;&euml;&cedil;&Auml;&Icirc;&ordf;&Agrave;&shy;&Eacute;ì&Ocirc;ò&pound;&ordm;Y=0
       H = Image1.Height                '&Egrave;&ccedil;&sup1;&ucirc;&Iuml;&euml;&cedil;&Auml;&Icirc;&ordf;&Agrave;&shy;&Eacute;ì&Ocirc;ò&pound;&ordm;H=.scalehhight
       W = Image1.Width                 '&Egrave;&ccedil;&sup1;&ucirc;&Iuml;&euml;&cedil;&Auml;&Icirc;&ordf;&Agrave;&shy;&Eacute;ì&Ocirc;ò&pound;&ordm;W=.scalehwidth
       .PaintPicture Image1.Picture, X, Y, W, H
       .Refresh  '&Ograve;ò&Icirc;&ordf;&Icirc;&Ograve;&Atilde;&Ccedil;&frac12;&laquo;FORM&micro;&Auml;AUTOREDRAW&Eacute;è&Icirc;&ordf;TRUE&pound;&not;&Euml;ù&Ograve;&Ocirc;&Ograve;&ordf;REFRESH&Ograve;&raquo;&Iuml;&Acirc;&sup2;&Aring;&Auml;&Uuml;&Iuml;&Ocirc;&Ecirc;&frac34;
    End With
    End Sub乱码部分的中文提示与你的一样!另外的SCALEMODE设为PIXEL(像素)应该设置成TWIP即可!
    现在完成解决问题,虽然是耖资源一点,但可以实现一样的效果!
      

  18.   

    那个事件再写一下共享给大家!Private Sub Command1_Click()
    End SubPrivate Sub MDIForm_Resize()
    On Error Resume Next
    Dim X As Long
    Dim Y As Long
    Dim H As Long
    Dim W As Long
    Dim picW As Long
    Dim picH As LongWith Form1      '这里原来是PICTURE1,现在我们用FORM1来显示
       .Move 0, 0, Me.ScaleWidth, Me.ScaleHeight   '如果有菜单的话后面的数字改为704
       .Cls
       picW = Me.Image1.Picture.Width
       picH = Me.Image1.Picture.Height
       If picW / picH < Me.ScaleWidth / Me.ScaleHeight Then
            Image1.Height = Me.ScaleHeight
            Image1.Width = Me.ScaleHeight * picW / picH
        Else
            Image1.Width = Me.ScaleWidth
            Image1.Height = Me.ScaleWidth * picH / picW
        End If
       X = (.Width - Image1.Width) / 2 '如果想改为拉伸则:X=0
       Y = (.Height - Image1.Height) / 2 '如果想改为拉伸则:Y=0
       H = Image1.Height                '如果想改为拉伸则:H=.scalehhight
       W = Image1.Width                 '如果想改为拉伸则:W=.scalehwidth
       .PaintPicture Image1.Picture, X, Y, W, H
       .Refresh  '因为我们将FORM的AUTOREDRAW设为TRUE,所以要REFRESH一下才能显示
    End With
    End Sub
      

  19.   

    呵呵,原来你说的拉伸不是和屏幕墙纸的那种不管比例野蛮拉伸呀,我还真的理解错了。
    你指的是:锁定长宽比的最大拉伸,开头我理解错了。不好意思!
    现在帮你的代码再修改一下,看上去短一点,速度稍微快一点点(呵呵,个人的一点点偏执情绪)。
    另外,你还是把MDIForm上的那个picturebox删掉吧,我们直接把IMAGE控件放到FORM1上去,又可以省一个重量级的控件了。
    Private Sub MDIForm_Resize()
    On Error Resume Next
    Dim X As Long
    Dim Y As Long
    Dim H As Long
    Dim W As Long
    Dim Ratio as Single
    Dim TempRatio as SingleWith Form1   
       .Move 0, 0, Me.ScaleWidth, Me.ScaleHeight
       .Cls
       H = .Image1.Height '因为IMAGE控件现在就在FORM1上了
       W = .Image1.Width  '所以也可以和FORM1的其他属性一样引用了               
       TempRatioX= .ScaleWidth/W
       Ratio = .ScaleHeight/H
       If Ratio>TempRatio then Ratio=TempRatio '这句最关键,看明白了就好
       W=W*Ratio    'VB会自动转换,咱就不用INT了,下同
       H=H*Ratio
       X = (.ScaleWidth - W) \ 2  '这里我使用整除"\"而不用浮点除法"/",也是为了提速
       Y = (.ScaleHeight - H) \ 2 '因为最后输出图像的位置是不会有半个像素的。
       .PaintPicture Image1.Picture, X, Y, W, H
       .Refresh  
    End With
    End Sub
    另外form1的SCALEMODE还是要设为PIXEL,因为我现在不在自己的机器上没有VB所以这段代码需要你自己调试一下了。
      

  20.   

    这样不行,还不如昨天我改的!
    我在调度并在你的现在这个基础上改,等调试好了再贴上来!
    另外我form1的SCALEMODE还是要设为PIXEL,更是不正常!
    到底是什么原因呢!
      

  21.   

    我已经调试出来的,对你的代码进行优化,发觉这样最好!
    贴出来共享给大家Private Sub MDIForm_Resize()
        On Error Resume Next
        Dim X As Long, Y As Long, H As Long, W As Long
        Dim Ratio As Single
        
        With Form1
           .Move 0, 0, Me.ScaleWidth, Me.ScaleHeight
           .Cls
           Ratio = .Image1.Picture.Width / .Image1.Picture.Height       If Ratio < Me.ScaleWidth / Me.ScaleHeight Then
                .Image1.Height = Me.ScaleHeight
                .Image1.Width = Me.ScaleHeight * Ratio
            Else
                .Image1.Width = Me.ScaleWidth
                .Image1.Height = Me.ScaleWidth / Ratio
            End If
           H = .Image1.Height                '如果想改为拉伸则:H=.ScaleHeight
           W = .Image1.Width                 '如果想改为拉伸则:W=.ScaleWidth
           
           X = (.ScaleWidth - W) \ 2  '这里我使用整除"\"而不用浮点除法"/",也是为了提速
           Y = (.ScaleHeight - H) \ 2 '因为最后输出图像的位置是不会有半个像素的。
           .PaintPicture .Image1.Picture, X, Y, W, H
           .Refresh
        End With
    End Sub
    非常感谢 WallesCai网友,这个问题虽然解决了,但接下来又有新问题出现了(如:如何避免FORM1窗体被关闭等问题)!我先自己试着去解决,如果解决不了再问各位高手。
      

  22.   

    另外我刚刚发现,还得在form1的enable进行设置,把它设置成false,这样,这个form1窗体就不会被关闭了!真是简单易行!