A. VB中如何调用XP的图片查看器
使用 shell :
★ShellExecute函数和Shell函数:打开外部程序
ShellExecute函数
'声明
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hWnd As Long, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, _
ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
'命令语句
Private Sub Command1_Click()
Dim lR As Long
lR = ShellExecute(Me.hWnd, "Open", sFile, "", "", vbNormalFocus)
End Sub
本函数还可以用来连接到网页:
ShellExecute 0&, vbNullString, "http://coolbasic.yeah.net", vbNullString, vbNullString, vbNormalFocus
或者这样写来发送Email:
ShellExecute me.hwnd, "open", "mailto:[email protected]", vbNullString, vbNullString, SW_SHOW
另外有ShellExecute的替代用法,更加简单实用,不用API,一句Shell搞定!
连接到网页:
Shell "rundll32.exe url.dll,FileProtocolHandler http://www.online.sh.cn"
打开文件:
Shell "rundll32.exe url.dll,FileProtocolHandler " & App.Path & "\SHELLTST.TXT"
Shell函数
运行一个可执行程序,并且如果该程序仍然在运行,则返回一个包含该程序的进程 ID 的整数。
Public Function Shell( _
ByVal Pathname As String, _
Optional ByVal Style As AppWinStyle = AppWinStyle.MinimizedFocus, _
Optional ByVal Wait As Boolean = False, _
Optional ByVal Timeout As Integer = -1 _
) As Integer
格式:Shell(Pathname, Style As AppWinStyle, Wait, Timeout)
参数:
△Pathname
必选项。字符串。要执行的程序名以及任何需要的参数和命令行开关。Pathname 还可以包括驱动器和目录路径或文件夹。
△Style
可选项。AppWinStyle。从 AppWinStyle 枚举中选择的值,该枚举与要在其中运行程序的窗口样式相对应。如果省略 Style,则 Shell 使用 AppWinStyle.MinimizedFocus,这将使程序以最小化启动并具有焦点。
Style 参数可以有以下设置之一:
AppWinStyle.Hide 隐藏窗口并为隐藏的窗口提供焦点。
AppWinStyle.NormalFocus 为窗口提供焦点,并以最近的大小和位置显示窗口。
AppWinStyle.MinimizedFocus 为窗口提供焦点,并以图标的形式显示窗口。
AppWinStyle.MaximizedFocus 为窗口提供焦点,并以全屏方式显示窗口。
AppWinStyle.NormalNoFocus 将窗口设置为最近的大小和位置。当前活动窗口保持焦点。
AppWinStyle.MinimizedNoFocus 以图标的形式显示窗口。当前活动窗口保持焦点。
△Wait
可选项。Boolean。指示 Shell 函数是否应等待程序完成的值。如果省略 Wait,则 Shell 使用 False。
△Timeout
可选项。Integer。Wait 为 True 时等待完成的毫秒数。如果省略 Timeout,则 Shell 使用 -1,表示没有超时,Shell 直到程序完成时才返回。因此,如果省略 Timeout 或将它设置为 -1,则 Shell 可能永远不会将控制返回给程序。
异常/错误
异常类型 错误号 条件
ArgumentException 5 Style 不在 0 到 9(包含 0 和 9)范围内。
FileNotFoundException 53 Shell 无法启动指定的程序。
备注
Shell 函数的返回值取决于 Pathname 中指定的程序在 Shell 返回时是否仍在执行。如果将 Wait 设置为 True 并且程序在超时过期前结束,Shell 返回零。如果超时过期或者省略 Wait 或将它设置为 False,则 Shell 返回程序的进程 ID。进程 ID 是标识正在运行的程序的唯一数字。
如果 Shell 函数无法启动指定的程序,则出现 System.IO.FileNotFoundException 错误。例如,当试图从使用 System.Windows.Forms 的应用程序运行 16 位程序(如 command.com)时,可能会发生这种情况。解决办法是运行将调用所需的 16 位程序的 32 位程序。如果是 command.com,则可以将运行 cmd.exe 作为另一种选择。
默认情况下,Shell 函数异步运行程序。这意味着用 Shell 函数启动的程序在 Shell 函数后面的语句执行前可能没有结束执行。如果想等待程序结束后再继续,请将 Wait 设置为 True。
整个路径和文件规范应该始终用引号引起来,如以下示例所示:
ID = Shell("""C:\Program Files\MyFile.exe"" -a -q", , True, 100000)
字符串内每对相邻的双引号 ("") 被解释为字符串中的一个双引号字符。因此,前面的示例表示 Shell 函数的下列字符串:
"C:\Program Files\MyFile.exe" -a -q
如果路径没有用引号引起来,Windows 就会在 C:\ 目录中查找名为 Program.exe 的文件,而不是在 C:\Program Files 目录中查找 MyFile.exe 文件。
安全说明 如果路径和文件规范没有用引号引起来,那么当文件名或路径节点包含空格时,就会出现安全风险。在上面的示例中,路径节点 \Program Files 包含一个空格。如果规范不在引号中,并且名为 Program.exe 的程序(例如通过非法的破坏)安装在 C:\ 中,Windows 就会执行 Program.exe 程序而不是 MyFile.exe。
安全说明 Shell 函数需要非托管代码权限,这可能会对它在部分信任情况下的执行产生影响。有关更多信息,请参见 SecurityPermission 类和代码访问权限。
示例
本示例使用 Shell 函数运行一个用户指定的应用程序。通过将 AppWinStyle.NormalFocus 指定为第二个参数,以正常大小打开应用程序并为它提供焦点。
Dim ProcID As Integer
' Run Calculator.
ProcID = Shell("C:\Windows\system32\calc.exe", AppWinStyle.NormalFocus)
' The preceding path is for Windows XP;
' The Windows 2000 path is C:\WINNT\system32\calc.exe.
另,shell函数无须声明,例:
Option Explicit
Private Sub Command1_Click()
Shell ("D:\Program Files\WinRAR\winrar.exe")
End Sub
调用Shell函数可以执行外部可执行文件,其扩展名如.exe 、.com、.bat或.pif,缺省扩展名为.exe。不能执行操作系统内部命令及所有非执行文件(如文档),否则将显示出错信息
VB 中,常以Shell指令来执行外部程式,然而它在Create该外部process 后,立刻就会回到vb 的下一行程式,无法做到等待该Process结束时,才执行下一行指令,或是说,无法得知该Process是否已结束,甚者,该Process执行到一半,又该如何中止其执行等等,这些都不是Shell指令所能控制的,因此我们需使API的帮助来完成。
第一个问题,如何等待shell所Create的process结束后才往后执行vb的程式。
首先要知道的是,每个Process有唯一的一个ProcessID,这是OS给定的,用来区别每个 Process,这个Process ID(PID)主要可用来取得该Process相对应的一些资讯,然而要对该Process的控制,却大多透过 Process Handle(hProcess)。VB Shell指令的传回值是PID,而非hProcess,所以我们需透过OpenProcess这个API来取得 hProcess而OpenProcess()的第一个参数,指的是所取得的hProcess所具有的
能力,像 PROCESS_QUERY_INFORMATION 便是让GetExitCode()可取得hProcess所指的process之状态,而PROCESS_TERMINATE,便是让TerminateProcess(hProcess..)的指令能够生效,也就是说,不同参数设定,使hProcess所具有的权限、能力有所不同。取得 hProcess后便可以使用WaitForSingleObject()来等待hProcess状态的改变,也就是说,它会等待 hProcess所指的process执行完,这个指令才结束,它
第二个参数所指的是 WaitForSingleObject()所要等待的时间(in milliseconds ),如果超过所指的时间,就TimeOut而结束WaitForSingleObject()的等待。若要它无限的等下去,就设定为INFINITE。
pid = Shell("C:\tools\spe3\pe2.exe", vbNormalFocus)
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid)
ExitEvent = WaitForSingleObject(hProcess, INFINITE)
Call CloseHandle(hProcess)
上例会无限等待shell指令create之process结束后,才再做后面的vb指令。有时觉得那会等太久,所以有第二个解决方式:等process结束时再通知vb 就好,即:设定一个公用变数(isDone),当它变成True时代表Shell所Create的Process已结束。当Process还在执行时,GetExitCodeProcess会传&H103给其第二个参数,直到结束时才传另外的数值,如果程式正常结束,那Exitcode = 0,否则就得看它如何
结束了。或许有人在其他地方看到 loop的地方是Loop while Exitcode <> 0,那有一点危险,如果以这个例子来看,您不是用F4来离开pe2而是用右上方 X 的结束dos window那麽,会因为ExitCode的值永远不会是0,而进入无穷的回圈。
Dim pid As Long
pid = Shell("C:\tools\spe3\pe2.exe", vbNormalFocus)
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid)
isDone = False
Do
Call GetExitCodeProcess(hProcess, ExitCode)
Debug.Print ExitCode
DoEvents
Loop While ExitCode = STILL_ALIVE
Call CloseHandle(hProcess)
isDone = True
另外,如果您的shell所Create的程式,有视窗且为立刻Focus者,可另外用以下的方式
Dim pid As Long
Dim hwnd5 As Long
pid = Shell("c:\tools\spe3\pe2.exe", vbNormalFocus)
hwnd5 = GetForegroundWindow()
isDone = False
Do While IsWindow(hwnd5)
DoEvents
Loop
isDone = True
而如何强迫shell所Create的process结束呢,那便是
Dim aa As Long
If hProcess <> 0 Then
aa = TerminateProcess(hProcess, 3838)
End If
hProcess便是先前的例子中所取得的那个Process Handle, 3838所指的是传给GetExitCodeProcess()中的第二参数,这是我们任意给的,但最好不要是0,因为0一般是代表正常结束,当然这样设也不会有错。当然不可设&H103,以这个例子来看,如果程式正处于以下的LOOPDo
Call GetExitCodeProcess(hProcess, ExitCode)
Debug.Print ExitCode
DoEvents
Loop While ExitCode = STILL_ALIVE
Debug.print ExitCode
而执行了 TerminateProcess(hProcess, 3838)那会看到ExitCode = 3838。然而,这个方式在win95没问题,在NT中,可能您要在OpenProcess()的第一个参数要更改成 PROCESS_QUERY_INFORMATION Or PROCESS_TERMINATE 这样才能Work。不过良心的建议,非到最后关头,不要使用TerminateProcess(),因不正常的结束,往往许多程式结束前所要做的事都没有做,可能造成Resource的浪费,甚者,下次再执行某些程式时会有问题,例如:本人常使用MS-dos Shell Link 的方式执行一程式,透过Com port与大电脑的联结,如果Ms-dos Shell Link 不正常结束,下次再想Link时,会发现too Many Opens,这便是一例。
另外,有人使用Shell来执行.bat档,即:
pid = Shell("c:\aa.bat", vbNormalFocus)
可是却遇上aa.bat结束了,但ms-dos的Window却仍活着,那可以用以下的方式来做
pid = Shell("c:\command.com /c c:\aa.bat", vbNormalFocus)
那是执行Command.com,而Command.com指定执行c:\aa.bat 而且结束时自动Close
B. VB做个图片的查看器 就是点图片能切换到下一张如此循环
'新建一个exe工程
'依次打开菜单:工程,部件;在控件列表中选中“Microsoft Common Dialog 6.0(SP6)”按确定退出
'窗体form1上画3个command按钮,1个FileListBox文件列表控件,1个PicrureBox图像框控件,1个CommonDialog文件浏览控件
'将以下代码复制到Form1的代码区
Private FileIdx As Long '文件索引号
Private APath As String '图片文件夹
Private Sub Form_Load() '初始化控件
Command1.Top = 0
Command2.Top = 0
Command3.Top = 0
Command1.Left = 0
Command2.Left = Command1.Width + Command1.Width / 8
Command3.Left = Command2.Left + Command2.Width + Command1.Width / 8
Command1.Caption = "打开"
Command2.Caption = "上一张"
Command3.Caption = "下一张"
Picture1.Left = 0
Picture1.Top = Command1.Height + Command1.Height / 4
Picture1.AutoRedraw = True
Picture1.AutoSize = True
File1.Pattern = "*.bmp;*.jpg" '文件类型
File1.Refresh
File1.Visible = False
End Sub
Private Sub Picture1_Resize() '根据图片尺寸改变窗体大小
Me.Width = Picture1.Width
Me.Height = Picture1.Height + Picture1.Top + Command1.Height + Command1.Height / 4
If Me.Width < Command3.Left + Command3.Width Then Me.Width = Command3.Left + Command3.Width
End Sub
Private Sub Command1_Click() '打开文件夹
Dim Tmp() As Byte, FirtFile As String
CommonDialog1.ShowOpen
APath = CommonDialog1.FileName
If APath = "" Then Exit Sub
Tmp = StrConv(APath, vbFromUnicode)
FirtFile = ""
Do While Tmp(UBound(Tmp)) <> Asc("\") '提取根目录
FirtFile = String(1, Tmp(UBound(Tmp))) & FirtFile
ReDim Preserve Tmp(UBound(Tmp) - 1)
Loop
APath = StrConv(Tmp, vbUnicode)
File1.Path = APath
File1.Refresh
If File1.ListCount = 0 Then Exit Sub
For FileIdx = 0 To File1.ListCount - 1 '打开选中的图片
If File1.List(FileIdx) = FirtFile Then
Picture1.Picture = LoadPicture(APath & File1.List(FileIdx))
Exit Sub
End If
Next
FileIdx = 0
Picture1.Picture = LoadPicture(APath & File1.List(0))
End Sub
Private Sub Command2_Click() '上一个
File1.Refresh '刷新文件
If File1.ListCount = 0 Then Exit Sub '如果文件夹内没有图片就退出过程
If FileIdx - 1 >= 0 Then
FileIdx = FileIdx - 1 '上一个就-1
Picture1.Picture = LoadPicture(APath & File1.List(FileIdx))
Else
FileIdx = File1.ListCount - 1 '上到0后就跳回最后一个
Picture1.Picture = LoadPicture(APath & File1.List(FileIdx))
End If
End Sub
Private Sub Command3_Click() '下一个
File1.Refresh
If File1.ListCount = 0 Then Exit Sub
If FileIdx + 1 < File1.ListCount Then
FileIdx = FileIdx + 1 '下一个就+1
Picture1.Picture = LoadPicture(APath & File1.List(FileIdx))
Else
FileIdx = 0 '下到最后一个后就跳回0
Picture1.Picture = LoadPicture(APath & File1.List(FileIdx))
End If
End Sub
C. 用VB编写: 《图片浏览软件》
我简单给你个放大缩小的示例吧。
Private Sub mnuZoomIn_Click() ‘缩小0.8倍
On Error Resume Next
x1 = Image1.Width * 0.8
y1 = Image1.Height * 0.8
Image1.Move (Picture1.Width - x1) / 2, (Picture1.Height - y1) / 2, x1, y1
End Sub
Private Sub mnuZoomOut_Click() ’放大1.2倍
On Error Resume Next
x1 = Image1.Width * 1.2
y1 = Image1.Height * 1.2
Image1.Move (Picture1.Width - x1) / 2, (Picture1.Height - y1) / 2, x1, y1
End Sub
滚动条的我忘了,原来的程序源码都丢了,其实很简单,只需要针对滚动条的数值,把图像文件移动到合适位置就可以。多查查函数和控件手册就好,因为你需要的功能都很简单。
D. vb如何制作图片查看器
一个简单的用于说明核心代码的小程序:
DimiAsInteger
DimpathNameAsString
PrivateSubDir1_Change()
File1.Path=Dir1.Path
EndSub
PrivateSubDrive1_Change()
Dir1.Path=Drive1.Drive
EndSub
PrivateSubFile1_Click()'点选file1中的文件名,显示图片
pathName=IIf(Right(File1.Path,1)="",File1.Path&File1.FileName,File1.Path&""&File1.FileName)
Picture1.Picture=LoadPicture(pathName)
EndSub
张志晨
E. VB图片查看器问题
小问题
1.利用 webbrowser控件替代以上两种控件,在网页中显示
如果你不想缩小图像,而是加滚动条的话 我强烈建议你用 webbrowser控件
在工程部件里添加 microsoft internet controls 组件即可
然后 代码中用 WebBrowser1.Navigate "D:\照片\1.JPG" '必须是绝对路径,这样滚动条自己生成
如果你想实现缩放,建议用image ,如果你想同时实现两个功能 还是选webbrowser控件 只是代码复杂点
2.Picturebox 加滚动条
3.Image Stretch=true
F. 怎样用VB做一个图片浏览器
Public Class Form1
Dim i As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
i = i - 1
If (i < 0) Then
i = 4
End If
'pic.Image = imgl.Images(i)
pic.Image = Image.FromFile(imgNames(i).FullName)
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
i = i + 1
If (i >= 4) Then
i = 0
End If
'pic.Image = imgl.Images(i)
pic.Image = Image.FromFile(imgNames(i).FullName)
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
If Button3.Text Is "播放" Then
Timer1.Start()
Button3.Text = "暂停"
Else
Timer1.Stop()
Button3.Text = "播放"
End If
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
i = i + 1
If (i >= 4) Then
i = 0
End If
'pic.Image = imgl.Images(i)
pic.Image = Image.FromFile(imgNames(i).FullName)
End Sub
Dim imgNames As IO.FileInfo()
Private Sub test2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim _Url As String
_Url = Application.StartupPath & "\Imager" '获取程序文件信息所在的文件夹
Dim _ImgUrl As New System.IO.DirectoryInfo(_Url) '新建文件夹对象
imgNames = _ImgUrl.GetFiles("*.jpg") '从文件信息中获取文件对象的类型
End Sub
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
FolderBrowserDialog1.ShowDialog()
Dim _Url As String
_Url = FolderBrowserDialog1.SelectedPath
Dim _ImgUrl As New System.IO.DirectoryInfo(_Url) '新建文件夹对象
imgNames = _ImgUrl.GetFiles("*.jpg") '从文件信息中获取文件对象的类型
End Sub
Dim form As New Form2
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles form2Click.Click
Form.Show() '*************显示窗体
End Sub
Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
Me.Close()
End Sub
Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
form.Close()
End Sub
Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click
Dim clockF As New clock
clockF.ShowDialog()
End Sub
End Class
显示张数的用text显示出来就可以了
其实我也是初学者这些代码有些小BUG请包涵我会修改的
大家可以加个QQ交流交流
G. VB做windows图片和传真查看器
Picture1.Picture = LoadPicture(文件地址)
Image1.Picture = LoadPicture(文件地址)
Image1支持透明
Picture1透明地方为背景色
H. VB做个查看图片的小程序,请高手帮忙
用文件列表框的Filename的属性。不过要看看资料,它返回的是文件名字。在配合PATH的属性,把路径和名字一起加上就行。PATH的属性,你要看看。因为根目录里的文件和文件夹里的文件调出不一样。PATH的最后一个文件夹路径不会自动添加"\",自己要加上(提示:用right的函数,例如if right(dir1.path,"\") then ....),自己编吧。
I. 利用vb设计图片查看器的程序步骤
1、添加picturebox控件到窗体
2、添加commandbutton控件
3、添加Microsoft Common Dialog Control控件(文件对话框)
4、在按钮的click中,添加打开对话框代码,使用loadpicture函数,打开文件,并赋值给picturebox的picture属性
J. vb制作:简单图片浏览器
工程我已发给你
Dim tempx, tempy
Private Sub File1_Click()
a = File1.Path & "\" & File1.FileName
Dim FSO As New FileSystemObject
Picture1.Picture = LoadPicture(a)
tempx = Picture1.Width
tempy = Picture1.Height
Image1.Picture = LoadPicture(a)
StatusBar1.Panels.Item(1).Text = "文件大小(kb):" & FileLen(a) / 1024 & Space(1) & "修改日期:" & FSO.GetFile(a).DateLastModified & Space(1) & "大小:" & Image1.Width / 15 & "x" & Image1.Height / 15
End Sub
Private Sub HScroll1_Change()
Picture1.Picture = LoadPicture("")
Call daxiao(HScroll1.Value, HScroll1.Value)
Picture1.Width = HScroll1.Value + tempx
Picture1.Height = HScroll1.Value + tempy
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
File1.Path = Text1
File1.Pattern = "*.jpg;*.bmp"
End If
End Sub
Private Sub daxiao(x As Double, y As Double)
With LoadPicture(File1.Path & "\" & File1.FileName)
.Render Picture1.hDC, 0, 0, y, x, 0, .Height, .Width, -.Height, 0
End With
End Sub