📄 pr34.htm
字号:
<html>
<head>
<meta http-equiv="Content-Language" content="en-us">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>VB问题全功略(34)</title>
<style type="text/css">font { font-size: 9pt; line-height: 13pt }
p { font-size: 9pt; line-height: 13pt }
td { font-size: 9pt; line-height: 13pt }
select { font-family: 宋体; font-size: 9pt }
input { font-family: 宋体; font-size: 9pt }
textarea { font-family: 宋体; font-size: 9pt }
a { color: blue; font-size: 9pt; text-decoration: none }
a:hover { color: red; text-decoration: underline }
a:active { color: red; text-decoration: underline }
BODY { FONT-SIZE: 12px; SCROLLBAR-HIGHLIGHT-COLOR: #99ccff; SCROLLBAR-SHADOW-COLOR: #99ccff; COLOR: #000000; SCROLLBAR-3DLIGHT-COLOR: #99ccff; SCROLLBAR-TRACK-COLOR: #ffffff; FONT-FAMILY: "宋体"; SCROLLBAR-DARKSHADOW-COLOR: #99ccff; SCROLLBAR-BASE-COLOR: #99ccff}
</style>
</head>
<body bgcolor="#FFFFFF">
<div align="center">
<center>
<table border="0" width="100%">
<tr>
<td width="100%">
<p align="center"></td>
</tr>
<tr>
<td align="left" bgcolor="#99CCFF" width="924"><font color="#FF0000">VB问题全功略(34)
</font><font color="#000080">[<font face="宋体">查找本页请按Ctrl+F]</font></font></td>
</tr>
<tr>
<td width="100%" align="center"></td>
</tr>
</center>
<tr>
<td>
<p align="right">[<a href="pr33.htm"><u>上一页</u></a>]<font color="#FF0000"><b>(34)</b></font>[<a href="pr35.htm"><u>下一页</u></a>]</td>
</tr>
<center>
<tr>
<td><a href="#166">166、如何找出 Windows / System / Temp
目录的正确路径?(二)</a><br>
<a href="#167">167、如何将长文件名转成短文件名格式 (MS-DOS 8.3)</a><br>
<a href="#168">168、清除画面中各栏位资料</a><br>
<a href="#169">169、为您精心设计的画面拍张快照吧!( Taking a
screenshot )</a><br>
<a href="#170">170、随心所欲地移除表单左上方的系统功能表的某几个项目</a><br>
<br>
<font color="#FF0000">166、如何找出 Windows / System / Temp
目录的正确路径?(二)</font><a name="166"></a><br>
<br>
记得我们分三个单元来说明如何找出 Windows / System / Temp
目录的正确路径?<br>
<br>
当时我们都是使用 API 来做,使用的 API 分别是:<br>
<br>
问题 如何找出 Windows 目录的正确路径?<br>
<br>
使用 GetWindowsDirectory Function <br>
<br>
问题 如何找出 System 目录的正确路径?<br>
<br>
使用 GetSystemDirectory Function <br>
<br>
问题 如何找出 Temp 目录的正确路径?<br>
<br>
使用 GetTempPath Function <br>
<br>
有的人不太喜欢使用 API,一来有的 API
有点难,一来比较不容易找到完整的资料说明或完整的范例。不过以上三个题目都可以不使用
API 就得到答案的!原因如下:<br>
<br>
在我们启动电脑的同时,我们的操作系统,会挪出一个区块,用来存放一些系统环境变量,或许您会问,到底存了哪些东西呢?其实说来不外乎几个来源:<br>
<br>
1、Autoexec.bat:TMP / TEMP / PATH / PROMPT .....<br>
2、Config.sys:COMSPEC ..... <br>
3、Msdos.sys:WinDir / WinBootDir .....<br>
4、当然您的电脑中不一定有 Autoexec.bat 或 Config.sys,不过没关系,系统自己会给定一些初始值!<br>
<br>
而这些环境变量,在 VB 中只要使用 ENVIRON Statement
就可以抓得到!语法如下:<br>
<br>
Environ[$](environmentstring) <br>
<br>
其中 environmentstring 是一个环境变量的字串,例如:〈TEMP〉、〈WinDir〉、〈PATH〉...等。<br>
<br>
所以,如果您 .....<br>
<br>
要得到 TEMP 的路径,只要使用 Environ("TEMP")
即可,结果可能为 C:\WINDOWS\TEMP。<br>
要得到 Windows 的路径,只要使用 Environ("Windows")
即可,结果可能为 C:\WINDOWS。<br>
而如果您想找到 System 的路径,我想有了 Windows
路径之后,应该不是难事了吧!<br>
<br>
<font color="#FF0000">167、如何将长文件名转成短文件名格式
(MS-DOS 8.3)</font><a name="167"></a><br>
<br>
虽然在 Windows95/98 中已经都可以使用长文件名/目录 (最长可以到255个字元),但是在您将长文件名的文件或目录存档时,系统同时给了它一个可以相容于以前
MS-DOS 时代的 8.3 格式的文件名称!<br>
<br>
到目前为止,还是有些软件会使用 8.3
格式的文件名称,在安装这些软件时,它们写到注册表中的资料,仍然采用
8.3
格式的文件名称,所以有时候,您在维护系统时,必须知道目前这时长文件的档案,转成
8.3 格式的文件名称之后是什么文件。<br>
<br>
以下这个范例会让您在 DirListBox 及 FileListBox
中选择目录及文件名称,然后将您选出的(长)文件名转成 8.3
格式的文件名称,如果您有注意到的话,它不但是将文件名称转掉,连长文件的目录名称也会一起转成
8.3 格式的文件名称。<br>
<br>
<br>
由于程序码较长,我不再列出程序码,而直接将文件压缩下载:<br>
<br>
Source Code 下载<br>
<br>
<font color="#FF0000">168、清除画面中各栏位资料</font><a name="168"></a><br>
<br>
当一个 Form
中只有二、三个物件的时候,您要清除其中的资料,您会一个栏位一个栏位来清除,反正就是那么几个物件,二三行指令也就解决了!<br>
<br>
但是,若您的 Form
中有二、三十个,甚至五、六十个以上的物件时,可就要想想办法了!以下的这个模组就在这种情形下产生了,一般要清除资料,最重要的二个属性就是
.Text 及 .LisIndex。<br>
<br>
Public Sub ClearAllControls(frmFORM As Form)<br>
Dim ctlControl As Object<br>
On Error Resume Next<br>
For Each ctlControl In frmFORM.Controls<br>
ctlControl.Text = ""<br>
ctlControl.ListIndex = -1<br>
DoEvents<br>
Next<br>
End Sub<br>
<br>
而在程序中要呼叫这个模组只要如下使用即可:<br>
<br>
call ClearAllControls(Me)<br>
<br>
<font color="#FF0000">169、为您精心设计的画面拍张快照吧!(
Taking a screenshot )</font><a name="169"></a><br>
<br>
我们在设计系统时,有时候会保留让使用者做屏幕 HardCopy
的功能。<br>
<br>
以前,我总是要求使用者自己去按键盘上的【Print Screen】按钮,将画面的影像留在【剪贴板】中,并要求使用者自己到
Windows95/98
提供的【小画家】或【小作家】中,先做【贴上】的动作后,再将画面影像存成
.BMP 档或直接由印表机中印出。<br>
<br>
上面这些动作,对一个程序开发者,或一个熟练的操作者并不困难,但是,很可悲的,大部份的使用者都不属于以上所描述的二种人,例如:我曾经写过一个系统是给大楼清洁维护公司的人员用的,其中有很多使用者甚至是一些学历不高的『欧巴尚』,不但程序的设计都要简化操作,连系统上线都是高难度的,更别说屏幕的
HardCopy 列印、存档的动作了!<br>
<br>
不过,以上的动作,我们都可以直接在 VB
的程序中做到,要做到这个功能有二个方法:<br>
方法一:直接模拟按【Print Screen】按钮,再将【剪贴板】中的图像抓到
Picture 中。<br>
方法二:完全使用 API 来处理。<br>
<br>
下面来看看第二种做法:<br>
<br>
'请在声明区中加入以下声明:<br>
<br>
Private Declare Function GetDesktopWindow Lib "user32" () As Long<br>
Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As
Long<br>
Private Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long,
ByVal hdc As Long) As Long<br>
Private 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<br>
<br>
Private Const SRCCOPY = &HCC0020<br>
<br>
'在 Form 中加入二个 CommandButton,及一个 PictureBox,不必更改属性,加入以下程序码:<br>
<br>
Private Sub Form_Load()<br>
'将 Picture1 之长宽设定成和屏幕一样大小<br>
Picture1.Width = Screen.Width<br>
Picture1.Height = Screen.Height<br>
End Sub<br>
<br>
Private Sub Command1_Click()<br>
'将屏幕画面抓下后放到 Picture1 中<br>
Dim lngDesktopHwnd As Long<br>
Dim lngDesktopDC As Long<br>
<br>
Picture1.AutoRedraw = True<br>
Picture1.ScaleMode = vbPixels<br>
lngDesktopHwnd = GetDesktopWindow<br>
lngDesktopDC = GetDC(lngDesktopHwnd)<br>
<br>
Call BitBlt(Picture1.hdc, 0, 0, Screen.Width, Screen.Height, lngDesktopDC, 0, 0,
SRCCOPY)<br>
Picture1.Picture = Picture1.Image<br>
Call ReleaseDC(lngDesktopHwnd, lngDesktopDC)<br>
End Sub<br>
<br>
Private Sub Command2_Click()<br>
'将 Picture1 中的屏幕画面存成 .BMP 档<br>
SavePicture Picture1, "C:\TEST.BMP"<br>
End Sub<br>
<br>
在以上的范例中,只要按下 Command1
就会将屏幕的画面截取下来放到 Picture1 中,按下 Command2
之后,就会将 Picture1 中的图片存成文件 (
文件名称可自行更改 ),如果您想打印,也可以直接使用
PaintPicture 将图片丢到打印机中打出!<br>
<br>
至于图片的打印,以后会另有单元介绍。
<p><font color="#FF0000">170、随心所欲地移除表单左上方的系统功能表的某几个项目<a name="170"></a></font></p>
<p>针对这个主题,其实以前已经讨论过二次了,只不过不是以这样直接了当的方式点出在题目中而已,不知道大家是否有印象?</p>
<p>这二次分别是:</p>
<p>问题:如何移除 Form 右上方之『X』按钮?</p>
<p>对应到系统功能表的【关闭】选项</p>
<p>问题:如何防止 Form 被移动?</p>
<p>对应到系统功能表的【移动】选项</p>
<p>而我在网路上闲逛时,看到有个外国人用了一个很笨的方法写了一个模组,不过对于不想研究
API
的人来说应该是很好用的模组,可以让您用选择的方式随便您想移除系统功能表的任一个项目!</p>
<p>完整程序码如下,说明加在其中:</p>
<p>'在声明区中加入以下声明:</p>
<p>'抓取系统 Menu 的 hwnd<br>
Private Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As
Integer, ByVal bRevert As Integer) As Integer</p>
<p>'移除系统 Menu 的 API<br>
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As
Integer, ByVal nPosition As Integer, ByVal wFlags As Integer) As Integer<br>
'第一个参数是系统 Menu 的 hwnd<br>
'第二个参数是要移除选项的 Index</p>
<p>Private Const MF_BYPOSITION = &H400&</p>
<p>'模组内容如下:</p>
<p>Private Sub RemoveMenus(frm As Form, remove_restore As Boolean, remove_move
As Boolean, remove_size As Boolean, remove_minimize As Boolean, remove_maximize
As Boolean, remove_seperator As Boolean, remove_close As Boolean)</p>
<p>Dim hMenu As Long</p>
<p>' 抓取系统 Menu 的 hwnd<br>
hMenu = GetSystemMenu(hWnd, False)</p>
<p>If remove_close Then RemoveMenu hMenu, 6, MF_BYPOSITION '是否移除【关闭】选项<br>
If remove_seperator Then RemoveMenu hMenu, 5, MF_BYPOSITION '是否移除【分隔线】<br>
If remove_maximize Then RemoveMenu hMenu, 4, MF_BYPOSITION '是否移除【放到最大】选项<br>
If remove_minimize Then RemoveMenu hMenu, 3, MF_BYPOSITION '是否移除【缩到最小】选项<br>
If remove_size Then RemoveMenu hMenu, 2, MF_BYPOSITION '是否移除【大小】选项<br>
If remove_move Then RemoveMenu hMenu, 1, MF_BYPOSITION '是否移除【移动】选项<br>
If remove_restore Then RemoveMenu hMenu, 0, MF_BYPOSITION '是否移除【还原】选项<br>
End Sub</p>
<p>这个模组共有八个参数,第二个到第八个参数分别对应到系统功能表的七个选项!
( True / False )</p>
<p>今天如果我想做到和问题如何移除 Form 右上方之『X』按钮?一样的结果,表示我要将对应到系统功能表的【关闭】选项移除,则我只要将相对应的参数设成
True 即可,其他要保留的则为 False。</p>
<p>范例如下:</p>
<p>Private Sub Form_Load()<br>
RemoveMenus Me, False, False, False, False, False, True, True<br>
End Sub</td>
</tr>
</table>
</center>
</div>
<div align="center">
<center>
<table border="0" width="100%" cellspacing="1">
<tr>
<td width="100%" bgcolor="#99CCFF">
<p align="center"><font color="#ff0000"><a href="../../index.html" target="_blank">[木瓜软件工作室]</a>
整理</font></td>
</tr>
</table>
</center>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -