VB 版 (精华区)

发信人: xiangchu (天歌), 信区: VisualBasic
标  题: Visual Basic编程问答集(五)
发信站: 紫 丁 香 (Tue Aug 31 15:06:26 1999), 转信

(接上期)

□ 如何用程序改变Windows 95的墙纸?

在我们的程序设计中,如果想要改变Windows的墙纸,那么可以Windows的API
函数SystemParametersInfo来实现。
具体步骤如下:
1)  在VB中新建一个标准EXE工程;
2)  画出一个按钮Command1;
3)  在窗体Form1中定义Windows API的声明;
Private Declare Function SystemParametersInfo Lib "user32" Alias _
"SystemParametersInfoA" (ByVal uAction As Long, _
ByVal uParam As Long, lpvParam As Any, ByVal fuWinIni As Long) As Long
4) 在Command1的Click事件中编写以下代码:
        Private Sub Command1_Click()
          Dim t As Long
          Dim Wallpaper As String  '墙纸的图片文件名

          Wallpaper = InputBox("请输入图片文件的路径和文件名.")
          If Wallpaper = "" Then Exit Sub  '如果没有图片,返回
          '设置墙纸
          t = SystemParametersInfo(ByVal 20, vbnostring, ByVal Wallpaper, &H1)
          '如果设置不成功
          If t = 0 Then
             MsgBox "设置墙纸出错!"
             Exit Sub
           End If        
         End Sub
5) 设计完成,运行软件;

□ 如何用程序控制CommandDlg控件,使它可以选取一组文件名?

CommandDlg是VB5提供的控件,可用于文件名的获取,经常被用于打开文件/保存文件/另
存文件等操作,以获得用户输入的文件名。不过CommandDlg缺省的状态下只能读取一个
文件名。因此,我们通过设置CommandDlg的一个
属性Flags来达到获取一组文件名的目的。程序段如下:
Function GetMultiFileName() As String
On Error Resume Next
  
  '初始化文件路径
  CommandDlg1.Filter = "图片文件[*.BMP]|*.BMP"
  CommandDlg1.Filename = ""      '初始化文件名
  CommandDlg1.DialogTitle = "请选择图片文件名"
  CommandDlg1.FLAGS = cdlOFNAllowMultiselect
  CommandDlg1.Action = 1               '调用 WINDOWS 文件操作功能
         
  If Err <> vbCancel Then                 '如果不是选择取消(CANCEL)
    GetMultiFileName = CommandDlg1..Filename
  Else
    GetMultiFileName =""
  End If

  Debug.Print  "选择结果是:"+GetMultiFileName
End Function


□ 如果一张图片太大,如何用滚动条控制显示它的内容?
我们知道,VB里面的窗体(Form)没有象Delphi那样的滚动条。因此,要实现这种
控制功能,就必须“自己动手,丰衣足食”了。那么,我们如何来解决这个问题呢?
可以根据横,竖滚动条的数值改变,赋值图片的坐标X,Y的方法,再结合Picture控
件的容器(Container)特征来实现。
具体步骤如下:
1)  在VB中新建一个标准EXE工程;
2)  画出一个图片Picture1,横滚动条Hscroll1和竖滚动条VScroll1;
3)  在Picture1里面画一个Image1,设置Image1的Picture属性为一张较大的图片;
4)  在Form_Load事件中编写以下代码:
     Private Sub Form_Load()
      '初始化滚动条的最大滚动数值
      HScroll1.Max = Image1.Width-Picture1.Width
      VScroll1.Max = Image1.Height-Picture1.Height
     End Sub
5)  在HScroll1_Change中编写以下代码,控制图片的横向滚动:
Private Sub HScroll1_Change()
      '图片的坐标X等于滚动的数值
      Image1.Left = -HScroll1.Value
     End Sub
   6) 在VScroll1_Change中编写以下代码,控制图片的纵向滚动:
Private Sub VScroll1_Change()
      '图片的坐标Y等于滚动的数值
      Image1.Top = -VScroll1.Value
     End Sub
7) 设计完成,运行软件。

□ 如何设计一个可用鼠标改变大小的切分窗口(Splitter)?
在Windows 95的资源管理器(Explorer)中,有一种功能是可以给我们用鼠标任意拉动左
右2个列表的大小,调整列表的整体外观的“切分条”。在很多时候,我们希望自己编
写的软件里面也具有这种功能,那么,我们怎么实现呢?这里以切分2个ListBox为例,
实现的步骤如下:
1)  在VB中新建一个标准EXE工程;
2)  画出一个瘦高形状的图片Picture1,把图片的MouseIcon改为左右箭头,用来做切分
条,改名为Splitter;
3)  画出2个ListBox控件,分别改名为lstPers和lstTel。
4)  在Form1中编写以下代码:
      Option Explicit
      '定义需要使用的变量
      Private Const P_ECART = 3
      Private x1 As Integer, x2 As Integer
      Private y1 As Integer, y2 As Integer
      Private width1 As Integer,width2 As Integer
      Private height1 As Integer, height2 As Integer
      Private glbfrmInSizeX As Long

      '初始化窗体和变量
      Private Sub Form_Load()
        glbfrmInSizeX = &H7FFFFFFF    
        Form_Resize
      End Sub

      '当切分条Splitter移动的时候
      Private Sub splitter_MouseMove(Button As Integer, _
Shift As Integer, x As Single, y As Single)
       If glbfrmInSizeX <> &H7FFFFFFF Then
        If CLng(x) <> glbfrmInSizeX Then
            Splitter.Move Splitter.Left + x, y1, P_ECART, _
ScaleHeight - Sbar.Height - 2
            glbfrmInSizeX = CLng(x)
        End If
       End If
      End Sub

      '当鼠标松开切分条Splitter的时候
      Private Sub splitter_MouseUp(Button As Integer, Shift As Integer, _
x As Single, y As Single)
       If glbfrmInSizeX <> &H7FFFFFFF Then
        If CLng(x) <> glbfrmInSizeX Then
            Splitter.Move Splitter.Left + x, y1, P_ECART, _
ScaleHeight - Sbar.Height - 2
        End If
        glbfrmInSizeX = &H7FFFFFFF
        Splitter.BackColor = &H8000000F
        If Splitter.Left > 60 And Splitter.Left < (ScaleWidth - 60) Then
            lstpers.Width = Splitter.Left - lstpers.Left
        ElseIf Splitter.Left < 60 Then
            lstpers.Width = 60
        Else
            lstpers.Width = ScaleWidth - 60
        End If
        Form_Resize
       End If
      End Sub

      '当鼠标按下切分条Splitter的时候
      Private Sub splitter_MouseDown(Button As Integer, Shift As Integer, _
x As Single, y As Single)
       If Button = vbLeftButton Then
        Splitter.BackColor = &H808080
        glbfrmInSizeX = CLng(x)
       Else
        If glbfrmInSizeX <> &H7FFFFFFF Then
            splitter_MouseUp Button, Shift, x, y
        End If
        glbfrmInSizeX = &H7FFFFFFF
       End If
      End Sub

      '窗体的大小改变
      Private Sub Form_Resize()
       Const B_ECART = 1
       On Error Resume Next
       '赋值
       y1 = B_ECART
       height1 = ScaleHeight - Sbar.Height - B_ECART * 2
       x1 = B_ECART
       width1 = lstpers.Width
       x2 = x1 + lstpers.Width + P_ECART - 1
       width2 = ScaleWidth - x2 - B_ECART
       'ListBox和Splitter适应位置
       lstpers.Move x1 - 1, y1, width1, height1
       lstTel.Move x2, y1, width2 + 1, height1
       Splitter.Move x1 + lstpers.Width - 1, y1, P_ECART, height1    
     End Sub

5) 设计完成,运行软件;

                                                               (完) 

--
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: 202.118.228.152]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.113毫秒