⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pr34.htm

📁 VB一些常见的问题的解决方法34
💻 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&nbsp;<br>  
<br>  
问题 如何找出 System 目录的正确路径?<br>  
<br>  
使用 GetSystemDirectory Function&nbsp;<br>  
<br>  
问题 如何找出 Temp 目录的正确路径?<br>  
<br>  
使用 GetTempPath Function&nbsp;<br>  
<br>  
有的人不太喜欢使用 API,一来有的 API   
有点难,一来比较不容易找到完整的资料说明或完整的范例。不过以上三个题目都可以不使用   
API 就得到答案的!原因如下:<br>  
<br>  
在我们启动电脑的同时,我们的操作系统,会挪出一个区块,用来存放一些系统环境变量,或许您会问,到底存了哪些东西呢?其实说来不外乎几个来源:<br>  
<br>  
1、Autoexec.bat:TMP / TEMP / PATH / PROMPT .....<br>  
2、Config.sys:COMSPEC .....&nbsp;<br>  
3、Msdos.sys:WinDir / WinBootDir .....<br>  
4、当然您的电脑中不一定有 Autoexec.bat 或 Config.sys,不过没关系,系统自己会给定一些初始值!<br>  
<br>  
而这些环境变量,在 VB 中只要使用 ENVIRON Statement   
就可以抓得到!语法如下:<br>  
<br>  
Environ[$](environmentstring)&nbsp;<br>  
<br>  
其中 environmentstring 是一个环境变量的字串,例如:〈TEMP〉、〈WinDir〉、〈PATH〉...等。<br>  
<br>  
所以,如果您 .....<br>  
<br>  
要得到 TEMP 的路径,只要使用 Environ(&quot;TEMP&quot;)   
即可,结果可能为 C:\WINDOWS\TEMP。<br>  
要得到 Windows 的路径,只要使用 Environ(&quot;Windows&quot;)   
即可,结果可能为 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 = &quot;&quot;<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 &quot;user32&quot; () As Long<br>  
Private Declare Function GetDC Lib &quot;user32&quot; (ByVal hWnd As Long) As   
Long<br>  
Private Declare Function ReleaseDC Lib &quot;user32&quot; (ByVal hWnd As Long,   
ByVal hdc As Long) As Long<br>  
Private Declare Function BitBlt Lib &quot;gdi32&quot; (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 = &amp;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, &quot;C:\TEST.BMP&quot;<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 &quot;user32&quot; (ByVal hWnd As   
Integer, ByVal bRevert As Integer) As Integer</p>  
<p>'移除系统 Menu 的 API<br>  
Private Declare Function RemoveMenu Lib &quot;user32&quot; (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 = &amp;H400&amp;</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 + -