菜鸟一只,想得到MDI窗体的背景图自动拉伸与自动居中的代码!望各位大哥帮忙!我看过了论坛里的一些帖子,但不是这里有问题就是那里有问题!
想求直接的代码!(最好简单易懂一点)
想求直接的代码!(最好简单易懂一点)
解决方案 »
- access调用CHM的问题
- ActiveX 部件不能创建对象: 'Excel.Application'
- VB查询数据库。使用T-SQL代码块。如何嵌入
- 类模块的应用错误
- 用vb如何实现 txt格式 转成 html格式
- 我该放弃vb吗
- 新年快乐,散分!
- VB问题!!!希望各位大大帮忙解决下!!!感谢了!!!
- 高手请进:我用vb编写了一com+组件,经com+组件服务导出客户端安装后,在另一台机器上安装此客户端安装包出错,不知何故
- 为什么我在使用shell32.dll中的API函数时总是提示:"找不到入口点"
- 让combobox中什么东西也输不不进去,但他的style=0
- 数据打印问题 !!!!!!!
是不是
先加一个的picturebox
align=3
borderstyle=0
在中读取要加入的图片
在再MDIForm_Resize()中设置读取图片的长宽(picturebox)以及picturebox的长宽 我想应该是这样吧 那个扩大图片的code 欧给忘了 要不就给你写出来了 喳喳msdn吧
看看吧!!
里所用的方法是可以,我早就试过了,只是缩放好像不太容易!
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
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有详细的说明。
我刚才试验了一下我的代码,大概在360左右,所以上面的那段程序改一句:
.Move 0, 0, Me.Width, Me.Height-360千万要把Image控件的Stretch属性设为False,否则的话你在居中显示的时候将非常有可能得到一个变形的图像。因为一旦这个属性被设为True之后图像将自动缩放到和Image控件一样的形状了,你就无法得到图片的原始尺寸了。顺便指正一下 haha22haha(.|~) 朋友的一个小小错误:
MIDFORM是没有ScaleWidth & ScaleHeight之类的属性的。直接使用Width和Height就可以了
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
缩放图片用StretchBlt
取得客户区大小用GetClientRect
居中只是坐标计算问题
http://vbaccelerator.com/home/VB/Code/Libraries/Graphics_and_GDI/Tiling_Bitmaps_Into_Forms__Controls_and_MDI_Form_Backgrounds/article.asp
高级界面编程是.Net阴影菜单(Hook)
超高级界面编程是金山词霸的屏幕取词(API Hook)vbaccelerator.com的代码已经封装成dll,可直接使用
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)”就是下载页面
在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,这个问题上面的帖子我已经讨论过了,这里不再重复了。罪过啊罪过,居然用了这么多控件,资源浪费得一塌糊涂,罪过,阿弥陀佛!
主要是采用你的思路
不过我改动后才能满足我的要求。在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 'Èç¹ûÏë¸ÄΪÀ­ÉìÔò£º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乱码部分的中文提示与你的一样!另外的SCALEMODE设为PIXEL(像素)应该设置成TWIP即可!
现在完成解决问题,虽然是耖资源一点,但可以实现一样的效果!
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
你指的是:锁定长宽比的最大拉伸,开头我理解错了。不好意思!
现在帮你的代码再修改一下,看上去短一点,速度稍微快一点点(呵呵,个人的一点点偏执情绪)。
另外,你还是把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所以这段代码需要你自己调试一下了。
我在调度并在你的现在这个基础上改,等调试好了再贴上来!
另外我form1的SCALEMODE还是要设为PIXEL,更是不正常!
到底是什么原因呢!
贴出来共享给大家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窗体被关闭等问题)!我先自己试着去解决,如果解决不了再问各位高手。