我的地盘我做主
2007年01月25日设计代码

没有评论
50 views

在VB中调用DOS命令,如何得知DOS命令是否已经执行完毕

在VB中调用DOS命令,如何得知DOS命令是否已经执行完毕
_____________________________________________

Set wshl = CreateObject("wscript.shell")
wshl.Run "ping 9zp.com", 1, True 'true代表等待完成,1代表显示运行窗口
MsgBox "完成"
******************************************

[名称] 如何建立控制台窗口

[数据来源] 未知

[保存时间] 2002-06-18

[内容简介] 空

[源代码内容]

如何建立控制台窗口
以及让用户在其中输入字符同计算机进行交互对话。
首先在选VB菜单中的 Project | Module 项向工程文件中加入一个模块,然后在
这个Module中加入以下代码:

Option Explicit

Private Declare Function AllocConsole Lib "kernel32" () As Long

Private Declare Function FreeConsole Lib "kernel32" () As Long

Private Declare Function GetStdHandle Lib "kernel32" _
(ByVal nStdHandle As Long) As Long

Private Declare Function ReadConsole Lib "kernel32" Alias _
"ReadConsoleA" (ByVal hConsoleInput As Long, _
ByVal lpBuffer As String, ByVal nNumberOfCharsToRead As Long, _
lpNumberOfCharsRead As Long, lpReserved As Any) As Long

Private Declare Function SetConsoleMode Lib "kernel32" (ByVal _
hConsoleOutput As Long, dwMode As Long) As Long

Private Declare Function SetConsoleTextAttribute Lib _
"kernel32" (ByVal hConsoleOutput As Long, ByVal _
wAttributes As Long) As Long

Private Declare Function SetConsoleTitle Lib "kernel32" Alias _
"SetConsoleTitleA" (ByVal lpConsoleTitle As String) As Long

Private Declare Function WriteConsole Lib "kernel32" Alias _
"WriteConsoleA" (ByVal hConsoleOutput As Long, _
ByVal lpBuffer As Any, ByVal nNumberOfCharsToWrite As Long, _
lpNumberOfCharsWritten As Long, lpReserved As Any) As Long

Private Const STD_INPUT_HANDLE = -10&
Private Const STD_OUTPUT_HANDLE = -11&
Private Const STD_ERROR_HANDLE = -12&

Private Const FOREGROUND_BLUE = &H1
Private Const FOREGROUND_GREEN = &H2
Private Const FOREGROUND_RED = &H4
Private Const FOREGROUND_INTENSITY = &H8
Private Const BACKGROUND_BLUE = &H10
Private Const BACKGROUND_GREEN = &H20
Private Const BACKGROUND_RED = &H40
Private Const BACKGROUND_INTENSITY = &H80

'For SetConsoleMode (input)
Private Const ENABLE_LINE_INPUT = &H2
Private Const ENABLE_ECHO_INPUT = &H4
Private Const ENABLE_MOUSE_INPUT = &H10
Private Const ENABLE_PROCESSED_INPUT = &H1
Private Const ENABLE_WINDOW_INPUT = &H8
'For SetConsoleMode (output)
Private Const ENABLE_PROCESSED_OUTPUT = &H1
Private Const ENABLE_WRAP_AT_EOL_OUTPUT = &H2

'''''G L O B A L S'''''''''''''''''''''''''''''''''''
Private hConsoleIn As Long ' The console's input handle
Private hConsoleOut As Long ' The console's output handle
Private hConsoleErr As Long ' The console's error handle

'''''M A I N'''''''''''''''''''''''''''''''''''''''''
Private Sub Main()
Dim szUserInput As String

AllocConsole '建立一个控制台窗口
SetConsoleTitle "VB Console Example" '设置窗口标题

'获得控制窗口的句柄
hConsoleIn = GetStdHandle(STD_INPUT_HANDLE)
hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE)
hConsoleErr = GetStdHandle(STD_ERROR_HANDLE)

SetConsoleTextAttribute hConsoleOut, _
FOREGROUND_RED or FOREGROUND_GREEN _
or FOREGROUND_BLUE or FOREGROUND_INTENSITY _
or BACKGROUND_BLUE

ConsolePrint "VB Console Example" & vbCrLf

SetConsoleTextAttribute hConsoleOut, _
FOREGROUND_RED or FOREGROUND_GREEN _
or FOREGROUND_BLUE

ConsolePrint "Please Enter Your Name Here–> "

'获得用户名
szUserInput = ConsoleRead()
If Not szUserInput = vbNullString Then
ConsolePrint "Hello, " & szUserInput & "!" & vbCrLf
Else
ConsolePrint "Hello,But who are you?" & vbCrLf
End If

ConsolePrint "Press Enter To Close The Console"
Call ConsoleRead

FreeConsole ' Destroy the console
End Sub

Private Sub ConsolePrint(szOut As String)
WriteConsole hConsoleOut, szOut, Len(szOut), vbNull, vbNull
End Sub

Private Function ConsoleRead() As String
Dim sUserInput As String * 256

Call ReadConsole(hConsoleIn, sUserInput, Len(sUserInput), vbNull, vbNull)
'Trim off the NULL charactors and the CRLF.
ConsoleRead = Left$(sUserInput, InStr(sUserInput, Chr$(0)) – 3)
End Function
选VB菜单中的 Project | Project1 Properties项,将Startup Object改变为Sub Main,然后
运行程序,程序就会弹出一个控制台窗口,用户可以根据控制台窗口中的提示信息与程序进行交互
对话。

http://community.csdn.net/Expert/topic/4377/4377306.xml?temp=.4533197

'应该是Shell的命令程序没执行完,就执行显示文件到TEXTBox的操作了,使用WaitForSingleObject来等待Shell执行完后再执行下面操作
'先申明如下API
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Const SYNCHRONIZE = &H100000
Private Const INFINITE = &HFFFFFFFF

'调用如下
Dim pId As Long, pHnd As Long
pId = Shell(要执行的应用程序)
pHnd = OpenProcess(SYNCHRONIZE, 0, pId)
If pHnd <> 0 Then
Call WaitForSingleObject(pHnd, INFINITE)
Call CloseHandle(pHnd)
'执行你读取文件到TextBox的操作
………………
else
msgbox "调用失败"
End If

2007年01月19日设计代码

没有评论
38 views

用Delphi开发视频聊天软件

摘要:目前网上视频聊天软件、视频会议软件、可视IP电话软件随处可见,你是否想自己做一个玩玩?其实这类软件无非是视频加上网络而建成的。如果熟悉视频捕捉和网络传输技术,根本就难不倒你。微软为软件开发人员提供了一个专门用于视频捕捉的VFW SDK(Video for Windows SDK),用它实现视频捕捉很简单,至于网络传输嘛,Delphi更是提供了N多种网络组件,随你用了。本文详细介绍了如何利用Delphi中开发视频聊天软件,同时给出了两个程序示例。

  关键词:Delphi VFW 视频 视频会议 视频聊天 Video for Windows

  一、引言

  我们知道视频聊天软件的关键技术在于采集视频,并实时传输给聊天软件在线的人。对于视频的采集,这里采用微软公司的关于数字视频的一个软件包VFW(Video for Windows)。相信很多人对它都很熟习,VFW能使应用程序通过数字化设备从传统的模拟视频源得到数字化的视频剪辑,VFW的一个关键思想是播放时不需要专用硬件。为了解决数字视频数据量大的问题,需要对数据进行压缩,而VFW引进了AVI的文件标准。该标准未规定如何对视频进行捕捉、压缩及播放,仅规定视频和音频该如何存储在硬盘上及在AVI文件中交替存储视频帧和与之相匹配的音频数据。通过VFW,开发人员通过发送消息或设置属性来捕捉、播放和编辑视频剪辑。当用户在安装VFW时,安装程序会自动地安装配置视频所需要的组件,如设备驱动程序、视频压缩程序等。VFW主要由6个模块组成。VFW功能模块:

  AVICAP.DLL 包含执行视频捕捉的函数,它给AVI文件的I/O处理和视频、音频设备驱动程序提供一个高级接口

  MSVIDEO.DLL 包含一套特殊的DrawDib函数,用来处理屏幕上的视频操作

  MCIAVI.DRV 包括对VFW的MCI命令解释器的驱动程序

  AVIFILE.DLL 包含由标准多媒体I/O(mmio)函数提供的更高的命令,用来访问.AVI文件

  ICM 压缩管理器,用于管理的视频压缩/解压缩的编译码器(Codec)

  ACM 音频压缩管理器,提供与ICM相似的服务,适用于波形音频

  对于视频的传输,我们使用UDP来传,因为UDP传输速度快,TCP是面向连接的,建立连接时双方需经过三次握手,数据传输可靠,FTP、telnet等就是基于TCP的,UDP是面向非连接的,发出信息不需对方确认,但这样速度比TCP快,但有可能丢失数据,象SMTP、tftp等就是基于UDP的。另外UDP还支持广播,UDP广播两种,一种是directed broadcast,比如你的网段是192.168.0.X,你就往192.168.0.255发就可以了。另一种是limited broadcast,广播地址是255.255.255.255

  二、视频聊天软件的开发步骤

  2.1 创建捕捉窗口,采集视频

  在进行视频捕捉之前必需要先创建一个捕捉窗口,并应以此为基础进行所有的捕捉及设置操作。捕捉窗口可用AVICap窗口类的"CapCreateCaptureWindow"函数来创建,其窗口风格可设置为WSCHILD和WS_VISIBLE参数。

  有了捕捉窗口,我们就可以将视频流和音频流捕捉到一个AVI文件中;动态地同视频和音频输入器件连接或断开;用Overlay或Preview模式对输入的视频流进行实时显示,设置捕捉速率,显示控制视频源、视频格式及视频压缩的对话框,创建、保存或载入调色板,将图像和相关的调色板拷贝到剪贴板,将捕捉的单帧图像保存到BMP格式文件中。

  2.2 捕捉窗口和驱动程序的关联

  仅仅一个捕捉窗口是不能工作起来的,它必须要与一个设备相关联才能取得视频信号。用函数CapDriverConnect可使捕捉窗与其设备驱动程序相关联。

  2.3设置视频设备的属性

  通过设置TcaptureParms结构变量的各个成员变量,可以控制设备的采样频率、中断采样按键、状态行为。设置好TcaptureParms结构变量后,可以用函CapCaptureSetSetup使设置生效。之后还可以用CapPreviewScale、CapPreviewRate设置预览的比例与速度,也可以直接使用设备的默认值。

  2.4打开预览

  利用函数CapOverlay可选择是否采用叠加模式预览,以使系统资源占用小,视频显示速度加快。然后用CapPreview启动预览功能,这时就可以在屏幕上看到来自摄像头的图像了。

  2.5使用捕捉窗回调函数

  前的四个步骤就可以建立一个基本的视频捕捉程序了,如果想自己处理从设备捕捉到的视频数据,则要使用捕捉窗回调函数来处理,比如一帧一帧地获得视频数据,也可以以流的方式获得视频数据等等。

  2.6传输视频流

  使用回调函数可以取得第一帧的数据,我们使用网络技术将数据发给其它机器,其它机品将接收的数据显示出来。

  2.7接收视频

  接收UDP数据,同时将接收到的数据回显出来,这样就可以看到远处传来的视频了。

  三、用Delphi编写程序代码

  微软的VFW SDK只有VC和VB版,并没有Delphi版,不过在网上可以找到VFW.PAS文件,FW.PAS文件声明了调用DLL中的各个函数和变量。(注:源代码中提供了VFW.PAS文件)

  下面就以Delphi7开发一个网络视频聊天软件,聊天软件分两个程序,一个是视频采集程序并进行UDP广播的视频聊天软件服务器,另一个是接收UDP广播程序显示传来的视频数据的视频聊天软件客户端。

  3.1建立视频聊天软件服务器

  3.1.1新建一个工程,命名为Project1.dpr,并把VFW.PAS加到USE中

  3.1.2在Form1上放置一个Tpanel控件,该控件用于显示视频。之后再放置两个Tbutton控件,一个caption为"开始",另一个Name为"停止",放置一个UDP组件,这里用indy的IdUDPClient用来传输视频,如图示:

  3.1.3定义全局变量

CapWnd:THandle; //定义捕捉窗句柄
CapParms:TcaptureParms; //用于设置设备属性的结构变量
BMPINFO:TBitmapInfo; //BMP图像信息

3.1.4编码事件代码
 
  开始按钮代码:

CapWnd := capCreateCaptureWindow(’我的窗口’, WS_VISIBLE or WS_CHILD,//窗口样式 0, //X坐标 0, //Y坐标 panel1.Width, //窗口宽 panel1.Height, //窗口高 panel1.handle, //窗口句柄 0); //通常为0
if CapWnd = 0 then exit; //定义帧捕捉回调函数
CapSetCallbackOnFrame(CapWnd,FrameCallBack);
CapParms.dwRequestMicroSecPerFrame:=1;
CapParms.fLimitEnabled:=FALSE;
CapParms.fCaptureAudio:=FALSE;
CapParms.fMCIControl:=FALSE;
CapParms.fYield:=TRUE;
CapParms.vKeyAbort:=VK_ESCAPE;
CapParms.fAbortLeftMouse:=False;
CapParms.fAbortRightMouse:=FALSE; //让设置生效
CapCaptureSetSetup(capWnd,@CapParms,sizeof(TCAPTUREPARMS));
CapPreviewRate(capWnd,33); //设置预览视频的频率
CapCaptureSequenceNoFile(capWnd); //如果要捕捉视频流,则要使用函数来指定不生成文件,不然会自动生成AVI文件 CapDriverConnect(CapWnd,0); //连接摄像头设备,第二个参数是个序号,当系统中装有多个显示驱动程序时,其值分别依次为0到总个数如果有多个摄像头,那么就是0->1->2
capGetVideoFormat(capWnd, @BMPINFO,sizeof(TBitmapInfo)); //取得视频图像数据头
CapPreviewScale(capWnd,TRUE); //是否缩放
CapOverlay(capWnd,true); //指定是否使用叠加模式,true为使用,否则为falseCapPreview(capWnd,true);

  回调函数代码:

var hd:Thandle;
jpg:TJpegImage;
memStream :TMemoryStream;
Bitmap:TBitmap;
begin //将数据显在Image,
Bitmap:=TBitmap.Create;
Bitmap.Width :=BMPINFO.bmiHeader.biWidth;
// New size of Bitmap
Bitmap.Height:=BMPINFO.bmiHeader.biHeight;
hd:= DrawDibOpen; DrawDibDraw(hd,Bitmap.canvas.handle,0,0,_
 BMPINFO.BmiHeader.biwidth,BMPINFO.bmiheader.biheight,_
 @BMPINFO.bmiHeader,lpVHdr^.lpData,0,0,BMPINFO.bmiHeader.biWidth,_
 BMPINFO.bmiHeader.biheight,0);
DrawDibClose(hd); //发送数据
memStream := TMemoryStream.Create;
jpg := TJpegImage.Create;
jpg.Assign(Bitmap);
jpg.CompressionQuality := 10; //jpg压缩质量
jpg.JPEGNeeded;
jpg.Compress;
jpg.SaveToStream(memStream);
jpg.Free; //因为UDP数据包有大小限制,这里如果超出部分,就没有传输,完全可以发几次发出去
Form1.IdUDPClient1.BroadcastEnabled:=true;//用广播功能
if memStream.Size>Form1.IdUDPClient1.BufferSize then
//向192.168.0.X网段广播,端口 9001
Form1.IdUDPClient1.SendBuffer(’192.168.0.255’,9001,memStream.Memory^,Form1.IdUDPClient1.BufferSize) else Form1.IdUDPClient1.SendBuffer(’192.168.0.255’,9001,memStream.Memory^,memStream.Size);
memStream.Free;
Bitmap.Free;
End;

  停止代码:

capCaptureAbort(CapWnd); //停止捕捉 capDriverDisconnect(CapWnd); //将捕捉窗同驱动器断开

  完整的视频聊天软件服务器代码:

unit Unit1;
interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls,VFW, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient,jpeg;type TForm1 = class(TForm) Panel1: TPanel;
Button1: TButton;
Button2: TButton;
IdUDPClient1: TIdUDPClient;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private { Private declarations }
public { Public declarations }
end;

var Form1: TForm1;
CapWnd:THandle; //定义捕捉窗句柄
CapParms:TcaptureParms; //用于设置设备属性的结构变量
BMPINFO:TBitmapInfo; //BMP图像信息
implementation{$R *.dfm}
function FrameCallBack(hWnd: HWND; lpVHdr: PVIDEOHDR): LongInt;stdcall;
var hd:Thandle;
jpg:TJpegImage;
memStream :TMemoryStream;
Bitmap:TBitmap;
begin //将数据显在Image,
Bitmap:=TBitmap.Create;
Bitmap.Width :=BMPINFO.bmiHeader.biWidth;
// New size of Bitmap
Bitmap.Height:=BMPINFO.bmiHeader.biHeight;
hd:= DrawDibOpen;
DrawDibDraw(hd,Bitmap.canvas.handle,0,0,BMPINFO.BmiHeader.biwidth,BMPINFO._
 bmiheader.biheight,@BMPINFO.bmiHeader,_
 lpVHdr^.lpData,0,0,BMPINFO.bmiHeader.biWidth,BMPINFO.bmiHeader.biheight,0);
DrawDibClose(hd);
//发送数据
memStream := TMemoryStream.Create;
jpg := TJpegImage.Create; jpg.Assign(Bitmap);
jpg.CompressionQuality := 10;
//jpg压缩质量
jpg.JPEGNeeded;
jpg.Compress;
jpg.SaveToStream(memStream);
jpg.Free;
//因为UDP数据包有大小限制,这里如果超出部分,就没有传输,完全可以发几次发出去
Form1.IdUDPClient1.BroadcastEnabled:=true;//用广播功能
if memStream.Size>Form1.IdUDPClient1.BufferSize then
 //向192.168.0.X网段广播,端口 9001
 Form1.IdUDPClient1.SendBuffer(’192.168.0.255’,9001,memStream.Memory^,Form1.IdUDPClient1.BufferSize)
else
 Form1.IdUDPClient1.SendBuffer(’192.168.0.255’,9001,memStream.Memory^,memStream.Size);
 memStream.Free;
 Bitmap.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
 CapWnd := capCreateCaptureWindow(’我的窗口’, WS_VISIBLE or WS_CHILD,//窗口样式
  0, //X坐标
  0, //Y坐标
  panel1.Width, //窗口宽
  panel1.Height, //窗口高
  panel1.handle, //窗口句柄
  0); //通常为0
if CapWnd = 0 then exit; //定义帧捕捉回调函数
CapSetCallbackOnFrame(CapWnd,FrameCallBack);
CapParms.dwRequestMicroSecPerFrame:=1;
CapParms.fLimitEnabled:=FALSE;
CapParms.fCaptureAudio:=FALSE;
CapParms.fMCIControl:=FALSE;
CapParms.fYield:=TRUE;
CapParms.vKeyAbort:=VK_ESCAPE;
CapParms.fAbortLeftMouse:=False;
CapParms.fAbortRightMouse:=FALSE; //让设置生效
CapCaptureSetSetup(capWnd,@CapParms,sizeof(TCAPTUREPARMS));
CapPreviewRate(capWnd,33); //设置预览视频的频率
CapCaptureSequenceNoFile(capWnd); //如果要捕捉视频流,则要使用函数来指定不生成文件,不然会自动生成AVI文件
CapDriverConnect(CapWnd,0); //连接摄像头设备,第二个参数是个序号,当系统中装有多个显示驱动程序时,其值分别依次为0到总个数如果有多个摄像头,那么就是0->1->2 capGetVideoFormat(capWnd, @BMPINFO,sizeof(TBitmapInfo)); //取得视频图像数据头
CapPreviewScale(capWnd,TRUE); //是否缩放
CapOverlay(capWnd,true); //指定是否使用叠加模式,true为使用,否则为false CapPreview(capWnd,true);end;procedure TForm1.Button2Click(Sender: TObject);
begin capCaptureAbort(CapWnd); //停止捕捉
capDriverDisconnect(CapWnd); //将捕捉窗同驱动器断开
end;
end.

  3.2建立视频聊天软件客户端

3.2.1新建一个工程,命名为Project2.dpr

  3.2.2在程序窗口Form2上放置一个image控件,该控件用于接收的图像内容,再放置一个Tbutton控件,caption为"接收",,放置一个UDPServer组件,这里用indy的IdUDPServer用来接收网络视频,如图示:

  接收按钮代码:

IdUDPServer1.DefaultPort:=9001; //接收端口 IdUDPServer1.Active:=true; //启用

  IdUDPServer1的UDPRead事件代码:

var jpg:TJpegImage;begin try jpg := TJpegImage.Create; jpg.LoadFromStream(Adata); Image1.Picture.Bitmap.Assign(jpg); jpg.Free; exceptend;end;

  视频的传输是压缩成JPG进行传输的,服务器端和接收端都用到了jpeg单元,所以use中都要加入jpeg。

  完整的视频聊天软件客户端代码:

unit Unit2;
interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer, ExtCtrls,jpeg,IdSocketHandle;
type TForm1 = class(TForm) Image1: TImage;
IdUDPServer1: TIdUDPServer;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure IdUDPServer1UDPRead(Sender: TObject;
AData: TStream; ABinding: TIdSocketHandle);
private { Private declarations }
public
{
 Public declarations
}
end;
var Form1: TForm1;
implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
 IdUDPServer1.DefaultPort:=9001; //接收端口
 IdUDPServer1.Active:=true; //启用
end;
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject;AData: TStream; ABinding: TIdSocketHandle);
var jpg:TJpegImage;
begin
 try
  jpg := TJpegImage.Create;
  jpg.LoadFromStream(Adata);
  Image1.Picture.Bitmap.Assign(jpg);
  jpg.Free;
  except
end;
end;
end.

  好了,到这里程序代码也就写完了。在机上运行视频聊天软件服务器程序,点开始就开始进行视频的传输了,在网络上(网段为192.168.0.X,根据你的网络设置IP地址,我这用的局域网测试)的任何一台机上运行视频聊天软件客户端点接收都能接收到视频了。

  如果要接收的视频内容清晰点,可以设置jpg.CompressionQuality:=10;(这个值可以是从1至100,数值越大,图像越清晰,当然传输的速度会越慢了,图像越清晰,数据包就会越大,如果超出了UDP包限制,看到图像就不完整了)


视频聊天软件服务器


聊天软件客户端

  四、结束语

  在这里,我把自己的一些经验和代码拿出来与大家一起分享,请高手不要扔鸡蛋啊,我真的是花了不少力气的!看了这篇文章后,相信你也可以自己动手做一个网络视频聊天软件,也可以做个类似MSN、QQ、E话通一样的视频聊天软件,有了网络视频就可以在千里之外和家人进行可视通讯了。上面的示例程序还有很多地方需要改进的,比如视频的压缩可以用其它视频压缩编码器进行压缩,这里只讲了传输图像,并没有声音,再改一下就才能传输音视频了,有兴趣的朋友不妨自己动手去试一试。

DELPHI实现远程屏幕抓取

—- 在网络管理中,有时需要通过监视远程计算机屏幕来了解网上微机的使用情况。虽然,市面上有很多软件可以实现该功能,有些甚至可以进行远程控制,但在使用上缺乏灵活性,如无法指定远程计算机屏幕区域的大小和位置,进而无法在一屏上同时监视多个屏幕。其实,可以用Delphi自行编制一个灵活的远程屏幕抓取工具,简述如下。
—- 一、软硬件要求。

—- Windows95/98对等网,用来监视的计算机(以下简称主控机)和被监视的计算机(以下简称受控机)都必须装有TCP/IP 协议,并正确配置。如没有网络,也可以在一台计算机上进行调试。

—- 二、实现方法。

—- 编制两个应用程序,一个为VClient.exe,装在受控机上,另一个为VServer.exe,装在主控机上。VServer.exe指定要监视的受控机的IP地址和将要在受控机屏幕上抓取区域的大小和位置,并发出屏幕抓取指令给VClient.exe,VClient.exe得到指令后,在受控机屏幕上选取指定区域,生成数据流,将其发回主控机,并在主控机上显示出抓取区域的BMP图象。由以上过程可以看出,该方法的关键有二:一是如何在受控机上进行屏幕抓取,二是如何通过TCP/IP协议在两台计算机中传输数据。

—- UDP(User Datagram Protocol,意为用户报文协议)是Internet上广泛采用的通信协议之一。与TCP协议不同,它是一种非连接的传输协议,没有确认机制,可靠性不如TCP,但它的效率却比TCP高,用于远程屏幕监视还是比较适合的。同时,UDP控件不区分服务器端和客户端,只区分发送端和接收端,编程上较为简单,故选用UDP协议,使用Delphi 4.0提供的TNMUDP控件。

—- 三、创建演示程序。

—- 第一步,编制VClient.exe文件。新建Delphi工程,将默认窗体的Name属性设为“Client”。加入TNMUDP控件,Name属性设为“CUDP”;LocalPort属性设为“1111”,让控件CUDP监视受控机的1111端口,当有数据发送到该口时,触发控件CUDP的OnDataReceived事件;RemotePort属性设为“2222”,当控件CUDP发送数据时,将数据发到主控机的2222口。

—- 在implementation后面加入变量定义

const BufSize=2048;{ 发送每一笔数据的缓冲区大小 }
var
BmpStream:TMemoryStream;
LeftSize:Longint;{ 发送每一笔数据后剩余的字节数 }

为Client的OnCreate事件添加代码:
procedure TClient.FormCreate(Sender: TObject);
begin
BmpStream:=TMemoryStream.Create;
end;

为Client的OnDestroy事件添加代码:
procedure TClient.FormDestroy(Sender: TObject);
begin
BmpStream.Free;
end;

为控件CUDP的OnDataReceived事件添加代码:
procedure TClient.CUDPDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String);
var
CtrlCode:array[0..29] of char;
Buf:array[0..BufSize-1] of char;
TmpStr:string;
SendSize,LeftPos,TopPos,RightPos,BottomPos:integer;
begin
CUDP.ReadBuffer(CtrlCode,NumberBytes);{ 读取控制码 }
if CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]='show' then
begin { 控制码前4位为“show”表示主控机发出了抓屏指令 }
if BmpStream.Size=0 then { 没有数据可发,必须截屏生成数据 }
begin
TmpStr:=StrPas(CtrlCode);
TmpStr:=Copy(TmpStr,5,Length(TmpStr)-4);
LeftPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
TmpStr:=Copy(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)
-Pos(':',TmpStr));
TopPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
TmpStr:=Copy(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)-
Pos(':',TmpStr));
RightPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
BottomPos:=StrToInt(Copy(TmpStr,Pos(':',TmpStr
)+1,Length(TmpStr)-Pos(':',TmpStr)));
ScreenCap(LeftPos,TopPos,RightPos,BottomPos); {
截取屏幕 }
end;
if LeftSize>BufSize then SendSize:=BufSize
else SendSize:=LeftSize;
BmpStream.ReadBuffer(Buf,SendSize);
LeftSize:=LeftSize-SendSize;
if LeftSize=0 then BmpStream.Clear;{ 清空流 }
CUDP.RemoteHost:=FromIP; { FromIP为主控机IP地址 }
CUDP.SendBuffer(Buf,SendSize); { 将数据发到主控机的2222口 }
end;
end;

其中ScreenCap是自定义函数,截取屏幕指定区域,
代码如下:
procedure TClient.ScreenCap(LeftPos,TopPos,
RightPos,BottomPos:integer);
var
RectWidth,RectHeight:integer;
SourceDC,DestDC,Bhandle:integer;
Bitmap:TBitmap;
begin
RectWidth:=RightPos-LeftPos;
RectHeight:=BottomPos-TopPos;
SourceDC:=CreateDC('DISPLAY','','',nil);
DestDC:=CreateCompatibleDC(SourceDC);
Bhandle:=CreateCompatibleBitmap(SourceDC,
RectWidth,RectHeight);
SelectObject(DestDC,Bhandle);
BitBlt(DestDC,0,0,RectWidth,RectHeight,SourceDC,
LeftPos,TopPos,SRCCOPY);
Bitmap:=TBitmap.Create;
Bitmap.Handle:=BHandle;
BitMap.SaveToStream(BmpStream);
BmpStream.Position:=0;
LeftSize:=BmpStream.Size;
Bitmap.Free;
DeleteDC(DestDC);
ReleaseDC(Bhandle,SourceDC);
end;
存为“C:VClientClnUnit.pas”和“C:VClientVClient.dpr”,
并编译。

 

—- 第二步,编制VServer.exe文件。新建Delphi工程,将窗体的Name属性设为“Server”。加入TNMUDP控件,Name属性设为“SUDP”;LocalPort属性设为“2222”,让控件SUDP监视主控机的2222端口,当有数据发送到该口时,触发控件SUDP的OnDataReceived事件;RemotePort属性设为“1111”,当控件SUDP发送数据时,将数据发到受控机的1111口。加入控件Image1,Align属性设为“alClient”;加入控件Button1,Caption属性设为“截屏”;加入控件Label1,Caption属性设为“左:上:右:下”;加入控件Edit1,Text属性设为“0:0:100:100”;加入控件Label2,Caption属性设为“受控机IP地址”;加入控件Edit2,Text属性设为“127.0.0.1”;

在implementation后面加入变量定义
const BufSize=2048;
var
RsltStream,TmpStream:TMemoryStream;

为Server的OnCreate事件添加代码:
procedure TServer.FormCreate(Sender: TObject);
begin
RsltStream:=TMemoryStream.Create;
TmpStream:=TMemoryStream.Create;
end;

为Client的OnDestroy事件添加代码:
procedure TServer.FormDestroy(Sender: TObject);
begin
RsltStream.Free;
TmpStream.Free;
end;

为控件Button1的OnClick事件添加代码:
procedure TServer.Button1Click(Sender: TObject);
var ReqCode:array[0..29] of char;ReqCodeStr:string;
begin
ReqCodeStr:='show'+Edit1.Text;
StrpCopy(ReqCode,ReqCodeStr);
TmpStream.Clear;
RsltStream.Clear;
SUDP.RemoteHost:=Edit2.Text;
SUDP.SendBuffer(ReqCode,30);
end;

为控件SUDP的OnDataReceived事件添加代码:
procedure TServer.SUDPDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String);
var ReqCode:array[0..29] of char;ReqCodeStr:string;
begin
ReqCodeStr:='show'+Edit1.text;
StrpCopy(ReqCode,ReqCodeStr);
SUDP.ReadStream(TmpStream);
RsltStream.CopyFrom(TmpStream,NumberBytes);
if NumberBytes< BufSize then { 数据已读完 }
begin
RsltStream.Position:=0;
Image1.Picture.Bitmap.LoadFromStream(RsltStream);
TmpStream.Clear;
RsltStream.Clear;
end
else
begin
TmpStream.Clear;
ReqCode:='show';
SUDP.RemoteHost:=Edit2.Text;
SUDP.SendBuffer(ReqCode,30);
end;
end;

存为“C:VServerSvrUnit.pas”和
“C:VServerVServer.dpr”,并编译。
 

—- 四、测试。

—- 1、本地机测试:在本地机同时运行Vserver.exe和VClient.exe,利用程序的默认设置,即可实现截屏。查看“控制面板”-“网络”-“TCP/IP”-“IP地址”,将程序的“客户IP地址”设为该地址 ,同样正常运行。

—- 2、远程测试:选一台受控机,运行VClient.exe;另选一台主控机,运行VServer.exe,将“受控机IP地址”即Edit2的内容设为受控机的IP地址,“截屏”即可。以上简要介绍了远程屏幕抓取的实现方法,至于在主控机上一屏同时监视多个受控机,读者可自行完善。以上程序,在Windows98对等网、Delphi 4.0下调试通过。

Delphi 源程序格式书写规范

1.规范简介
本规范主要规定Delphi源程序在书写过程中所应遵循的规则及注意事项。编写该规范的目的是使公司软件开发人员的源代码书写习惯保持一致。这样做可以使每一个组员都可以理解其它组员的代码,以便于源代码的二次开发记忆系统的维护。
2.一般格式规范
2.1缩进
缩进就是在当源程序的级改变时为增加可读性而露出的两个空格。缩进的规则为每一级缩进两个空格。不准许使用Tab。因为Tab会因为用户所作的设置不同而产生不同的效果。当遇到begin 或进入判断、循环、异常处理、with语句、记录类型声明、类声明等的时侯增加一级, 当遇到end或退出判断、循环、异常处理、with语句、记录类型声明、类声明等的时侯减少一级。例如:
if TmpInt <> 100 then
TmpInt := 100;
2.2 Begin..End
begin语句和end语句在源程序中要独占一行,例如:
for I := 0 to 10 do begin //不正确的用法
end;
for I := 0 to 10 do //正确的用法
begin
end;
2.3空格
在操作符及逻辑判断符号的两端添加空格,例如:I := I + 1;,a and b 等,但添加括号时不需要空格。例如:if ( a > b ) then //错误的用法
If (a > b) then //正确的用法
又例如:procedure Test(Param1: integer; Param3: string);
3. Object Pascal语法书写格式规范
3.1保留字
Object Pascal 语言的保留字或关键词应全部使用小写字母。
3.2过程和函数
3.2.1命名及格式
过程和函数的名称应全部使用有意义的单词组成,并且所有单词的第一个字母应该使用大写字母。例如:
procedure formatharddisk;//不正确的命名
procedure FormatHardDisk;//正确的命名
设置变量内容的过程和函数,应使用Set作为前缀,例如:
procedure SetUserName;
读取变量内容的过程和函数,应使用Get作为前缀,例如:
function GetUserName: string;
3.2.2 过程和函数的参数
3.2.2.1命名
统一类型的参数写在同一句中:
procedure Foo(Param1, Param2, Param3: Integer; Param4: string);
3.2.2.2命名
所有参数必须是有意义的;并且当参数名称和其它属性名称重了的时候,加一个前缀'A', 例如:
procedure SomeProc(AUserName: string; AUserAge: integer);
3.2.2.3命名冲突
当使用的两个unit中包括一个重名的函数或过程时, 那幺当你引用这一函数或过程时,将执行在use 子句中后声明的那个unit中的函数或过程。为了避免这种'uses-clause-dependent'需要在引用函数或过程时,写完整函数或过程的出处。例如:
SysUtils.FindClose(SR);
Windows.FindClose(Handle);
3.3 变量
3.3.1 变量命名及格式
首先所有变量必须起有意义的名字,使其它组员可以很容易读懂变量所代表的意义,变量命名可以采用同义的英文命名,可使用几个英文单词,但每一单词的首字母必须大写。例如:
var
WriteFormat::string;
同时对于一些特定类型可采用一定的简写如下:
指针类型
P

纪录类型
Rec

数组类型
Arr


Class

循环控制变量通常使用单一的字符如:i, j, 或 k。 另外使用一个有意义的名字例如:UserIndex ,也是准许的。
3.3.2 局部变量
在过程中使用局部变量遵循所有其它变量的命名规则。
3.3.3 全局变量
尽量不使用全局变量,如必须使用全局变量则必须加前缀'g',同时应在变量名称中体现变量的类型。例如:
gprecUserCount: point;//名称为UserCount的全局变量,其类型为指向一结构的指针
但是在模块内部可以使用全局变量。所有模块内全局变量必须用'F'为前缀。如果几个模块之间需要进行资料交换,则需要通过声明属性的方法来实现。例如:
type
TFormOverdraftReturn = class(TForm)
private
{ Private declarations }
FuserName: string;
FuserCount: Integer;
Procedure SetUserName(Value: string);
Function GetUserName: string;
public
{ Public declarations }
property UserName: string read GetUserName write SetUserName;
property UserCount: Integer read FuserCount write FuserCount;
end;
3.4类型
3.4.1 大小写协议
保留字的类型名称必须全部小写。Win32 API 的类型通常全部大写,对于其它类型则首字母大写,其余字母小写,例如:
var
MyString: string; // reserved word
WindowHandle: HWND; // Win32 API type
I: Integer; // type identifier introduced in System unit
3.4.2 浮点类型
尽量不使用 Real 类型,他只是为了和旧的Pascal代码兼容,尽量使用Double 类型。Double 类型是对处理器和数据总线做过最优化的并且是IEEE定义的标准数据结构。当数值超出Double的范围时,使用Extended 。但Extended不被Jave支持。但使用其它语言编写的DLL时可能会使用Single 类型。
3.4.3 枚举类型
枚举类型的名字必须有意义并且类型的名字之前要加前缀'T'。枚举类型的内容的名字必须包含枚举类型名称的简写,例如:
TSongType = (stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB);
3.4.4 数组类型
数组类型的名字必须有意义并且类型的名字之前要加前缀'T'。如果声明一个指向数组类型的指针必须在该类型的名字之前加前缀'P',例如:
type
PCycleArray = ^TCycleArray;
TCycleArray = array[1..100] of integer;
3.4.5记录类型
记录类型的名字必须有意义并且类型的名字之前要加前缀'T'。如果声明一个指向数组类型的指针必须在该类型的名字之前加前缀'P',例如:
type
PEmployee = ^TEmployee;
TEmployee = record
EmployeeName: string
EmployeeRate: Double;
end;

作者: 索引越界 2006-2-20 18:32   回复此发言

——————————————————————————–

2 回复:Delphi 源程序格式书写规范
3.5类
3.5.1 命名及格式
类的名字必须有意义并且类型的名字之前要加前缀'T'。例如:
type
TCustomer = class(TObject)
类实例的名字通常是去掉'T'的类的名字。例如:
var
Customer: TCustomer;
3.5.2 类中的变量
3.5.2.1命名及格式
类的名字必须有意义并且类型的名字之前要加前缀'F'。所有的变量必须是四有的。如果需要从外部访问此变量则需要声明一属性
3.5.3 方法
3.5.3.1命名及格式
同函数和过程的命名及格式。
3.5.3.2 属性访问方法
所有的属性访问方法必须出现在private 或 protected 中。属性访问方法的命名同函数和过程的命名另外读方法(reader method)必须使用前缀'Get'. 写方法(writer method)必须使用前缀'Set'。写方法的参数必须命名为'Value',其类型同所要写的属性相一致。例如:
TSomeClass = class(TObject)
private
FSomeField: Integer;
protected
function GetSomeField: Integer;
procedure SetSomeField( Value: Integer);
public
property SomeField: Integer read GetSomeField write SetSomeField;
end;
3.6属性
3.6.1 命名及格式
同其用操作的,出去前缀'F'的类的变量的名称相一致 。
3.7文件
3.7.1项目文件
3.7.1.1项目目录结构
程序主目录–Bin(应用程序所在路径)
-Db(本地数据库所在路径)
-Doc(文档所在路径)
-Hlp(帮助文件所在路径)
-Backup(备份路径)
-Tmp(临时文件路径)
3.7.1.2命名
项目文件必须使用一个有意义的名字。例如: Delphi中系统信息的项目文件被命名为 SysInfo.dpr。
3.7.2 Form 文件
3.7.2.1命名
同Form的名称相一致:例如:Form的名称为FormMain则Form文件的名称就为FormMain.frm。
3.7.3 Data Module 文件
3.7.3.1命名
data module文件的命名应该有意义,并且使用'DM'作为前缀。例如: 用户data module 被命名为'DMCustomers.dfm'。
3.7.4 Remote Data Module 文件
3.7.4.1 命名
remote data module文件的命名应该有意义,并且使用'RDM'作为前缀。例如:用户remote data module 被命名为'RDMCustomers.dfm'。
3.7.5 Unit文件
3.7.5.1普通 Unit
3.7.5.1.1 Unit文件命名
unit文件的命名应该有意义,并且使用'unit'作为前缀。例如: 通用unit 被命名为'UnitGeneral'。
3.7.5.2 Form Units
3.7.5.2.1命名
Form unit 文件的名字必须和Form的名称保持一致。例如:主窗体叫FormMain.pas 则Form Unit文件的名字为:UnitFormMain。
3.7.5.3 Data Module Units
3.7.5.3.1命名
Data Module unit 文件的名字必须和Data Module的名称保持一致。例如:主Data Module叫DMMain.pas 则Data Module Unit文件的名字为:UnitDMMain。
3.7.5.4 文件头
在所有文件的头部应写上此文件的用途,作者,日期及输入和输出。例如:
{
修改日期:
作者:
用途:
本模块结构组成:
}
3.7.6 Forms和Data Modules Forms
3.7.6.1 Form类
1. Form类命名标准
Forms类的命名应该有意义,并且使用'TForm'作为前缀。例如: About Form类的名字为:
TAboutForm = class(TForm)
主窗体的名字为
TMainForm = class(TForm)
2. Form类实例的命名标准
Form 的类实例的名字应同期掉'T'的Form类的名字相一致。例如:
Type Name
Instance Name

TaboutForm
AboutForm

TmainForm
MainForm

TCustomerEntryForm
CustomerEntryForm

3.7.6.2 Data Modules Form
3.7.6.2.1. Data Module Form 命名标准
Data Modules Forms类的命名应该有意义,并且使用'TDM'作为前缀。例如:
TDMCustomer = class(TDataModule)
TDMOrders = class(TDataModule)
3.7.6.2.2. Data Module 实例命名标准
Data Module Form 的类实例的名字应同期掉'T'的Data Module Form类的名字相一致。例如:
Type Name

作者: 索引越界 2006-2-20 18:33   回复此发言

——————————————————————————–

3 回复:Delphi 源程序格式书写规范
Instance Name

TCustomerDataModule
CustomerDataModule

TordersDataModule
ordersDataModule

3.8控件
3.8.1 控件实例的命名
控件的实例应使用去掉'T'该控件类的名称作为前缀,例如:
输入用户姓名的Tedit的名字为:EditUserName。
3.8.2 控件的简写
控件的名称可使用以下简写,但所用简写于控件名称之间药添加'_':
3.8.2.1 Standard Tab
mm TMainMenu
pm TPopupMenu
mmi TMainMenuItem
pmi TPopupMenuItem
lbl TLabel
edt TEdit
mem TMemo
btn TButton
cb TCheckBox
rb TRadioButton
lb TListBox
cb TComboBox
scb TScrollBar
gb TGroupBox
rg TRadioGroup
pnl TPanel
cl TCommandList
3.8.2.2 Additional Tab
bbtn TBitBtn
sb TSpeedButton
me TMaskEdit
sg TStringGrid
dg TDrawGrid
img TImage
shp TShape
bvl TBevel
sbx TScrollBox
clb TCheckListbox
spl TSplitter
stx TStaticText
cht TChart
3.8.2.3 Win32 Tab
tbc TTabControl
pgc TPageControl
il TImageList
re TRichEdit
tbr TTrackBar
prb TProgressBar
ud TUpDown
hk THotKey
ani TAnimate
dtp TDateTimePicker
tv TTreeView
lv TListView
hdr THeaderControl
stb TStatusBar
tlb TToolBar
clb TCoolBar
3.8.2.4 System Tab
tm TTimer
pb TPaintBox
mp TMediaPlayer
olec TOleContainer
ddcc TDDEClientConv
ddci TDDEClientItem
ddsc TDDEServerConv
ddsi TDDEServerItem
3.8.2.5 Internet Tab
csk TClientSocket
ssk TServerSocket
wbd TWebDispatcher
pp TPageProducer
tp TQueryTableProducer
dstp TDataSetTableProducer
nmdt TNMDayTime
nec TNMEcho
nf TNMFinger
nftp TNMFtp
nhttp TNMHttp
nMsg TNMMsg
nmsg TNMMSGServ
nntp TNMNNTP
npop TNMPop3
nuup TNMUUProcessor
smtp TNMSMTP
nst TNMStrm
nsts TNMStrmServ
ntm TNMTime
nudp TNMUdp
psk TPowerSock
ngs TNMGeneralServer
html THtml
url TNMUrl
sml TSimpleMail
3.8.2.6 Data Access Tab
ds TDataSource
tbl TTable
qry TQuery
sp TStoredProc
db TDataBase
ssn TSession
bm TBatchMove
usql TUpdateSQL
3.8.2.7 Data Controls Tab
dbg TDBGrid
dbn TDBNavigator
dbt TDBText
dbe TDBEdit
dbm TDBMemo
dbi TDBImage
dblb TDBListBox
dbcb TDBComboBox
dbch TDBCheckBox
dbrg TDBRadioGroup
dbll TDBLookupListBox
dblc TDBLookupComboBox
dbre TDBRichEdit
dbcg TDBCtrlGrid
dbch TDBChart
3.8.2.8 Decision Cube Tab
dcb TDecisionCube
dcq TDecisionQuery
dcs TDecisionSource
dcp TDecisionPivot
dcg TDecisionGrid
dcgr TDecisionGraph
3.8.2.9 QReport Tab
qr TQuickReport
qrsd TQRSubDetail
qrb TQRBand
qrcb TQRChildBand
qrg TQRGroup
qrl TQRLabel
qrt TQRText
qre TQRExpr
qrs TQRSysData
qrm TQRMemo
qrrt TQRRichText
qrdr TQRDBRichText
qrsh TQRShape
qri TQRImage
qrdi TQRDBMImage
qrcr TQRCompositeReport
qrp TQRPreview
qrch TQRChart
3.8.2.10 Dialogs Tab
OpenDialog TOpenDialog
SaveDialog TSaveDialog
OpenPictureDialog TOpenPictureDialog
SavePictureDialog TSavePictureDialog
FontDialog TFontDialog
ColorDialog TColorDialog
PrintDialog TPrintDialog
PrinterSetupDialog TPrintSetupDialog
FindDialog TFindDialog
ReplaceDialog TReplaceDialog
3.8.2.11 Win31 Tab
dbll TDBLookupList
dblc TDBLookupCombo
ts TTabSet
ol TOutline
tnb TTabbedNoteBook
nb TNoteBook
hdr THeader
flb TFileListBox
dlb TDirectoryListBox
dcb TDriveComboBox
fcb TFilterComboBox
3.8.2.12 Samples Tab
gg TGauge
cg TColorGrid
spb TSpinButton
spe TSpinEdit
dol TDirectoryOutline
cal TCalendar
ibea TIBEventAlerter
3.8.2.13 ActiveX Tab
cfx TChartFX
vsp TVSSpell
f1b TF1Book
vtc TVTChart
grp TGraph
3.8.2.14 Midas Tab
prv TProvider
cds TClientDataSet
qcds TQueryClientDataSet
dcom TDCOMConnection
olee TOleEnterpriseConnection
sck TSocketConnection
rms TRemoteServer
mid TmidasConnection
4.修改规范
本规则所做的规定仅适用于已经纳入配置管理的程序。在这类修改中,要求保留修改前的内容、并标识出修改和新增的内容。并在文件头加入修改人、修改日期、修改说明等必要的信息。
4.1修改历史记录
对源文件进行经过批准的修改时,修改者应在程序文件头加入修改历史项。在以后的每一次修改时,修改者都必须在该项目中填写下列信息:
修改人
修改时间
修改原因
修改说明即如何修改
4.2新增代码行
新增代码行的前后应有注释行说明。
// 修改人,修改时间,修改说明
新增代码行
// 修改结束
4.3删除代码行
删除代码行的前后用注释行说明。
//修改人,修改时间,修改说明
//要删除的代码行(将要删除的语句进行注释)
//修改结束
4.4修改代码行
修改代码行以删除代码行后在新增代码行的方式进行。
//修改人,修改时间,修改说明
//修改前的代码行
//修改结束
//修改后的代码行
修改后的代码行
//修改结束

2006年12月22日设计代码

没有评论
63 views

CSS制作的特效文字

..:: 巧用CSS制作艺术字 ::..
如果灵活应用CSS各种滤镜的特点并加以组合,我们可以得到许多意想不到的效果。这是一些效果示范,供各位参考。
山水天下

用blur滤镜做出的效果,代码如下:
FILTER: blur(direction=135,strength=8)

山水天下

用dropshadow滤镜做出的效果,代码如下:
FILTER: dropshadow(color=#0000FF,offx=6,offy=6,positive=1)

山水天下

用glow滤镜做出的效果,代码如下:
FILTER: glow(color=#0000FF,strength=5)

山水天下

这个效果用到了两种滤镜:shadow和alpha,代码如下:
FILTER: alpha(opacity=100,finishiopacity=0,style=1)
shadow(color=#FF0000,direction=135)

山水天下

这个效果也用到两个滤镜mask和shadow,代码如下:
FILTER: mask(color=#E1E4EC)
shadow(color=#FF0000,direction=135)chroma(color=#E1E4EC)

注意:mask的颜色要和网页背景色一致,字体的颜色由shadow决定。

山水天下

如果说上面的效果是阴文的话,那么这个效果的应该算是阳文了,用两个滤镜实现mask和dropshadow,注意mask的颜色要和网页背景色一致,或者把mask和chroma成对使用,也可达到同样效果。代码如下:
FILTER: mask(color=#E1E4EC)
dropshadow(color=#0000FF,offx=-3,offy=-3,positive=1)
chroma(color=#E1E4EC)"

山水天下

用glow滤镜可以做空心字,方法是将字体颜色设置为背景色,再将glow滤镜的strenght的值设置为1或2即可。这个效果的代码如下:
FILTER: glow(color=#FF0000,strength=2)
shadow(color=#0000FF,direction=135)

山水天下
山水天下
山水天下
如果背景采用图片,为了能达到满意的效果需要将mask和chroma组合使用,这样能使字体感觉是透明的,让背景透出来。

上面列出的效果前者的代码是:
FILTER: mask(color=#E1E4EC)
shadow(color=#0000FF,direction=135)
chroma(color=#E1E4EC)

注意:字体的颜色由shadow决定,mask和chroma的颜色要相同,色彩任意。

中间的代码是:
FILTER: glow(strength=1)
mask(color=#0000FF)
chroma(color=#0000FF)

注意:mask和chroma的颜色相同,这个颜色决定了字体的颜色。

后者的代码是:
FILTER: mask(color=#E1E4EC)
dropshadow(color=#0000FF,offx=-3,offy=-3,positive=1)
chroma(color=#E1E4EC)

注意:mask和chroma的颜色相同,色彩由dropshadow决定。

WELCOME TO
WWW.WESTE.COM
这个效果的代码:
FILTER: glow(strength=4)mask(color=#E1E4EC)

2006年09月13日设计代码

没有评论
37 views

声音播放、无限循环和停止问题

  近好多朋友总问FLASH里调用库音乐和无限循环的问题
因为没有时间也没有太详细说明。今天在这里发一个简单的教材
希望对朋友们能有点帮助
[code]
my_song = new Sound()//定义一个声音变量
my_song.attachSound("第一次")//加载一个库里的声音元素,名字叫“第一次”
my_song.onSoundComplete = function() { //创建了在调用 onSoundComplete 事件时执行的函数,onSoundComplete 为声音播放完毕时自动调用的事件,这样,当声音播放完毕后自动执行mysong.start(),使声音不断播放。
my_song.start() }//播放声音
[/code]

当然,也可以设置两个按钮对声音的播放和停止进行控制
[code]
var stopPosition;//设置一个变量储存音乐的停止位置
bt1.onRelease=function(){//当鼠标按下暂停按钮的时候
my_sound.stop();//音乐停止
stopPosition=my_sound.position/100;//声音停止位置的时间付值给stopPosition
}
bt2.onRelease=function(){//当鼠标按下开始按钮的时候
my_sound.start(stopPosition);//从stopPosition位置开始播放
} //全部结束(sound对象的position属性取得当前声音文件的播放时间(毫秒),你可以用它来制作进度条。原理同load条的加载类)
[/code]

希望能对要做MP3播放器的朋友起到一定的作用

ASP生成静态Html文件技术杂谈

  网页生成静态Html文件有许多好处,比如生成html网页有利于被搜索引擎收录,不仅被收录的快还收录的全.前台脱离了数据访问,减轻对数据库访问的压力,加快网页打开速度.
像www.aspid.cn的主站就采用了TSYS生成html文件!
所以吟清最近对生成html比较感兴趣,看了不少文章,也有一点点收获.

1,下面这个例子直接利用FSO把html代码写入到文件中然后生成.html格式的文件
[code]
<%
filename="test.htm"
if request("body")<>"" then
set fso = Server.CreateObject("Scripting.FileSystemObject")
set htmlwrite = fso.CreateTextFile(server.mappath(""&filename&""))
htmlwrite.write ""
htmlwrite.write "输出Title内容: " & request.form("title") & "
输出Body内容:" & request.form("body")& ""
htmlwrite.close
set fout=nothing
set fso=nothing
end if
%>


[/code]

2,但是按照上面的方法生成html文件非常不方便,第二种方法就是利用模板技术,将模板中特殊代码的值替换为从表单或是数据库字段中接受过来的值,完成模板功能;将最终替换过的所有模板代码生成HTML文件.这种技术采用得比较多,大部分的CMS都是使用这类方法.
[code]
template.htm ’ //模板文件



$body$

[/code]

[code]
TestTemplate.asp ’// 生成Html
<%
Dim fso,htmlwrite
Dim strTitle,strContent,strOut
’// 创建文件系统对象
Set fso=Server.CreateObject("Scripting.FileSystemObject")
’// 打开网页模板文件,读取模板内容
Set htmlwrite=fso.OpenTextFile(Server.MapPath("Template.htm"))
strOut=f.ReadAll
htmlwrite.close

strTitle="生成的网页标题"
strContent="生成的网页内容"

’// 用真实内容替换模板中的标记
strOut=Replace(strOut,"$title$",strTitle)
strOut=Replace(strOut,"$body$",strContent)

’// 创建要生成的静态页
Set htmlwrite=fso.CreateTextFile(Server.MapPath("test.htm"),true)

’// 写入网页内容
htmlwrite.WriteLine strOut
htmlwrite.close

Response.Write "生成静态页成功!"

’// 释放文件系统对象
set htmlwrite=Nothing
set fso=Nothing
%>

[/code]

3,第三种方法就是用XMLHTTP获取动态页生成的HTML内容,再用ADODB.Stream或者Scripting.FileSystemObject保存成html文件。这句话是在蓝色理想上看到的,对XMLHTTP吟清还不熟悉正在找资料了解.找到一段XMLHTTP生成Html的代码参考一下.
[code]
<%
’常用函数
’1、输入url目标网页地址,返回值getHTTPPage是目标网页的html代码
function getHTTPPage(url)
dim Http
set Http=server.createobject("MSXML2.XMLHTTP")
Http.open "GET",url,false
Http.send()
if Http.readystate<>4 then
exit function
end if
getHTTPPage=bytesToBSTR(Http.responseBody,"GB2312")
set http=nothing
if err.number<>0 then err.Clear
end function
[/code]
'2、转换乱玛,直接用xmlhttp调用有中文字符的网页得到的将是乱玛,可以通过adodb.stream组件进行转换
[code]
Function BytesToBstr(body,Cset)
dim objstream
set objstream = Server.CreateObject("adodb.stream")
objstream.Type = 1
objstream.Mode =3
objstream.Open
objstream.Write body
objstream.Position = 0
objstream.Type = 2
objstream.Charset = Cset
BytesToBstr = objstream.ReadText
objstream.Close
set objstream = nothing
End Function

txtURL=server.MapPath("../index.asp")

sText = getHTTPPage(txtURL)

Set FileObject=Server.CreateObject("Scripting.FileSystemObject")
filename="../index.htm"
Set openFile=FileObject.OpenTextfile(server.mapPath(filename),2,true) ’true为不存在自行建立
openFile.writeline(sText)
Set OpenFile=nothing

%>

[/code]

2006年09月9日设计代码

没有评论
46 views

javascript脚本语言描述:document 文挡对象详解

注:页面上元素name属性和JavaScript引用的名称必须一致包括大小写
否则会提示你一个错误信息 "引用的元素为空或者不是对象"
———————————————————————

对象属性
document.title //设置文档标题等价于HTML的标签<br /> document.bgColor //设置页面背景色<br /> document.fgColor //设置前景色(文本颜色)<br /> document.linkColor //未点击过的链接颜色<br /> document.alinkColor //激活链接(焦点在此链接上)的颜色<br /> document.vlinkColor //已点击过的链接颜色<br /> document.URL //设置URL属性从而在同一窗口打开另一网页<br /> document.fileCreatedDate //文件建立日期,只读属性<br /> document.fileModifiedDate //文件修改日期,只读属性<br /> document.fileSize //文件大小,只读属性<br /> document.cookie //设置和读出cookie<br /> document.charset //设置字符集 简体中文:gb2312<br /> ———————————————————————<br /> 对象方法<br /> document.write() //动态向页面写入内容<br /> document.createElement(Tag) //创建一个html标签对象<br /> document.getElementById(ID) //获得指定ID值的对象<br /> document.getElementsByName(Name) //获得指定Name值的对象<br /> ———————————————————————</p> <p>images集合(页面中的图象)</p> <p>a)通过集合引用<br /> document.images //对应页面上的<img>标签<br /> document.images.length //对应页面上<img>标签的个数<br /> document.images[0] //第1个<img>标签<br /> document.images[i] //第i-1个<img>标签</p> <p>b)通过nane属性直接引用<br /> <img name="oImage"><br /> document.images.oImage //document.images.name属性</p> <p>c)引用图片的src属性<br /> document.images.oImage.src //document.images.name属性.src</p> <p>d)创建一个图象<br /> var oImage<br /> oImage = new Image()<br /> document.images.oImage.src="/1.jpg"<br /> 同时在页面上建立一个<img>标签与之对应就可以显示</p> <p><html><br /> <img name=oImage><br /> <script language="javascript"> var oImage oImage = new Image() document.images.oImage.src="/1.jpg" </script><br /> </html></p> <p>———————————————————————-</p> <p>forms集合(页面中的表单)</p> <p>a)通过集合引用<br /> document.forms //对应页面上的<br /> <form>标签<br /> document.forms.length //对应页面上<br /> <form>标签的个数<br /> document.forms[0] //第1个<br /> <form>标签<br /> document.forms[i] //第i-1个<br /> <form>标签<br /> document.forms[i].length //第i-1个<br /> <form>中的控件数<br /> document.forms[i].elements[j] //第i-1个<br /> <form>中第j-1个控件</p> <p>b)通过标签name属性直接引用</p> <form name="Myform"> <input name="myctrl"></form> <p>document.Myform.myctrl //document.表单名.控件名</p> <p>———————————————————————–<br /> <html><br /> <!--Text控件相关Script--></p> <form name="Myform"> <input type="text" name="oText"> <input type="password" name="oPswd"> <form> <script language="javascript"> //获取文本密码框的值 document.write(document.Myform.oText.value) document.write(document.Myform.oPswd.value) </script><br /> </html><br /> ———————————————————————–<br /> <html><br /> <!--Select控件相关Script--></p> <form name="Myform"> <select name="oSelect"><br /> <option value="1">1</option><br /> <option value="2">2</option><br /> <option value="3">3</option><br /> </select><br /> </form> <p><script language="javascript"> //遍历select控件的option项 var length length=document.Myform.oSelect.length for(i=0;i<length;i++) document.write(document.Myform.oSelect[i].value) </script></p> <p><script language="javascript"> //遍历option项并且判断某个option是否被选中 for(i=0;i<document.Myform.oSelect.length;i++){ if(document.Myform.oSelect[i].selected!=true) document.write(document.Myform.oSelect[i].value) else document.write("<font color=red>"+document.Myform.oSelect[i].value+"</font>") } </script></p> <p><script language="javascript"> //根据SelectedIndex打印出选中的option //(0到document.Myform.oSelect.length-1) i=document.Myform.oSelect.selectedIndex document.write(document.Myform.oSelect[i].value) </script></p> <p><script language="javascript"> //动态增加select控件的option项 var oOption = document.createElement("OPTION"); oOption.text="4"; oOption.value="4"; document.Myform.oSelect.add(oOption); </script><br /> <html><br /> -----------------------------------------------------------------------</p> <div id="oDiv">Text</div> <p>document.all.oDiv //引用图层oDiv<br /> document.all.oDiv.style<br /> document.all.oDiv.style.display="" //图层设置为可视<br /> document.all.oDiv.style.display="none" //图层设置为隐藏<br /> /*document.all表示document中所有对象的集合<br /> 只有ie支持此属性,因此也用来判断浏览器的种类*/</p> </div> </div> <div class="post-169 post hentry category-12" id="post-169"> <div class="meta"><span class="time">2006年08月28日</span><a href="http://blog.duoday.com/category/%e8%ae%be%e8%ae%a1%e4%bb%a3%e7%a0%81" title="查看 设计代码 的全部文章" rel="category tag">设计代码</a><br /><br /><a href="http://blog.duoday.com/2006/169.html#respond" title="应用CSS完全手册 上的评论">没有评论</a><br /><span class="time">55 views</span></div> <div class="content"> <h2><a href="http://blog.duoday.com/2006/169.html" rel="bookmark">应用CSS完全手册</a></h2> <p>■ FONT-FAMILY属性:</p> <p>  每部机器上都装有多种字体,浏览器会使用默认的字体浏览网页,比如简体中文版WINDOWS汉字默认是宋体,英文默认是ARIAL。 使用FONT-FAMILY属性则可以规定浏览器用什么字体解读网页。</p> <p> ■ FONT-FAMILY语法实例:<br /> h2 {font-family:times,impact,sans-serif}</p> <p>说明如下:</p> <p>  helvetica是浏览器首先寻找的字体名称,如果有就使用它。在helvetica字体没有找到的情况下,则会寻找impact字体,如果找到就使用它。如果以上两种字体都没有找到,则指示浏览使用sans-serif(通用字体)。在你不能保证你列出的字体浏览者一定会安装时,将一种通用字体加在字体列表中是一种好的做法。因此我们提倡使用最基本的字体制作网页,比如中文用宋体,英文用ARIAL,这样使得你的网页不会因为浏览器没能使用合适的字体解读而变样。</p> <p>■ 其它相关内容:</p> <p>通用字体有以下几类,其中cursive和fantasy不被NC支持:<br /> "serif"(比如Times);<br /> "sans-serif"(比如Helvetica);<br /> "cursive"(比如Comic Sans);<br /> "fantasy"(比如Western);<br /> "monospace"(比如Courier)<br /> 其他使用事项:<br /> 如果一种字体的名称中有空格,如"Times New Roman",在CSS语句中要用引号包含该字体。<br /> 例:Body {font-family:"Times New Roman",serif}<br /> 如果该语句已在双引号里,则字体名降级为单引号。<br /> 例: <p style="font-family:'Times New Roman',serif"> 如果该语句包括其它CSS规则,字体说明应放在最后。<br /> 例:H2 {color:red;margin:10px;font-family:"Times New Roman",serif}<br /> ■ 继承:</p> <p>  继承:就是在子元素没有定义样式的情况下,它将采用上一级元素的样式定义。</p> <p>  优先级:根据继承来理解优先级也就容易。最近的样式优先级最高。 比如:</p> <p>  CSS在<heda>声明 I{font-family:impact};</p> <p>  但在HTML语句中又如下定义: <p> 要显示的文字在<i><font face="Times">这里</font></i></p> <p> 在此例中样式表要求用IMPACT字体,而FONT标记要求用TIMES字体,最终浏览器使用的会是TIMES。作为CSS标准制定者,要求将CSS优先,他们认为像以上的例子中应该用IMPACT字体。可以浏览器产商照顾使用者的旧习惯,使用了FONT标记中的字体,尽管FONT已不被提倡。</p> <p>  ■ 更好的方法–关联:</p> <p>  我并讲不出抛弃FONT标记的理由,只知道这是潮流。显然CSS提供更好的方法避免你在像上面的例子一样使用FONT标记,那就是: 关联。 可以在HEAD部分的CSS定义中加入如下行: P I {font-family:times} /*P和I之间的空格不能少*/</p> <p>  在HTML中: <p>要显示的文字在<i>这里</i></p> <p>  虽然你没有使用FONT FACE,但根据HEAD部分的CSS定义,P标记里的I标记使用的字体一定是TIMES。要提起注意的是那行CSS样式只作用于P标记里的I标记。</p> <p>■ 大小控制方法:</p> <p>  以下是控制文字大小的三种方法:</p> <p>使用大小单位,pt(点),px(像素),em,及其他单位;<br /> 使用关键字(xx-small,x-small,small,medium,large,x-large,xx-large);<br /> 使用比例参数(150%等)。<br /> 例如:</p> <p>p {font-size:12pt};<br /> p {font-size:large};<br /> p {font-size:200%};<br /> ■ 字体风格:<br /> 斜体 p {font-style:italic};<br /> 粗体 p {font-weight:bold};<br />   在字重的设定方面,还有lighter(更轻)和bolder(更重),还可以使用数字100,200到900最重。</p> <p>  字体风格和字重都有一个共同的参数normal,一旦设为normal也就取消了字重和风格设置。</p> <p>■ FONT-VARIANT:</p> <p>  FONT-VARIANT 可以将正常文字尺寸缩小一半后转为大写:</p> <p>h2 {font-variant:small-caps}<br /> ■ TEXT-TRANSFORM:<br />   完全控制字母大小写:</p> <p>全部大写:h2 {text-transform:uppercase};<br /> 全部小写:h2 {text-transform:lowercase};<br /> 单词第一个字母大写:h2 {text-transform:capitalize};<br /> 取消所有设定:h2 {text-transform:none};<br /> ■ TEXT-DECORATION:<br />   哪天你突发奇想,希望链接没有下划线,现在你可以做到:</p> <p>文字下划线:A:link{text-decoration:underline};<br /> 文字上划线:A:link{text-decoration:overline};<br /> 文字删除线:A:link{text-decoration:line-through};<br /> 文字闪烁:A:link{text-decoration:blink};<br /> 不要任何效果:A:link{text-decoration:none}<br /> ■ 字间距:</p> <p>  利用字间距属性word-spacing,可以调整单词间的距离。</p> <p>h2 {word-spacing:5pt}<br /> ■ 字母间距:<br />   利用字母间距属性letter-spacing,可以调整单词中每个字母间的距离。</p> <p>h2 {letter-spacing:10pt};<br /> ■ 行高:<br />   与字距不同的是行距line-height,它调整的是行与行间垂直方向的距离,有三种方法设置:</p> <p>数值:h3 {font-size:12pt; line-height:2};/*此处line-height=2×12pt=24pt */<br /> 长度单位:h3 {font-size:12pt; line-height:24pt};<br /> 比例:h3 {font-size:12pt; line-height:200%};<br />   无论是字距或字母间距或行距都有一个共同的参数:normal,一旦设为normal就是要浏览器使用默认值。</p> <p>■ 水平对齐:</p> <p>  利用文字对齐属性text-align,可以控制段落的水平对齐:</p> <p>h2 {text-align:center}<br /> h2 {text-align:left}<br /> h2 {text-align:right}<br />   这项属性可作用于 <p>,<br /> <h1>-<br /> <h6>,<br /> <blockquote>和 <ul>标记。</p> <p> ■ 垂直对齐:<br />   利用垂直对齐属性vwrtical-align,可以控制对象(包括文字或图形)相对于母体的垂直位置:</p> <p>h2 {vertical-align:top}<br /> h2 {vertical-align:text-top}<br /> h2 {vertical-align:bottom}<br /> h2 {vertical-align:text-bottom}<br /> h2 {vertical-align:baseline}<br /> h2 {vertical-align:middle}<br /> h2 {vertical-align:sub}/*上标*/<br /> h2 {vertical-align:super}/*下标*/<br />   这些属性具体对齐效果如何,希望大家自已去试验。</p> <p> ■ 首行缩进:<br />   首行缩进text-indent,在文档排版中经常用到:</p> <p>h3 {text-indent:24pt}; ■ 容器的概念:<br />   根据CSS对网页样式的定义,页面上的所有元素都放在一个容器里,这个容器叫BOX。BOX也就包括:</p> <p>元素本身;<br /> 围绕元素的空格;(padding)<br /> 围绕元素空格外的边框;(border)<br /> 边框外的边距。(margin)<br /> ■ 四个边距:<br />   margin用于设定上,右,下,左,边距:</p> <p>body {margin-top:10px;margin-right:20px;margin-bottom:30px;margin-left:40px}<br /> body {margin:10px 20px 30px 40px}/*效果与上面方式相同*/<br />   以上参数值同样可以是其他长度单位(如:pt,em等)或比例。</p> <p> ■ 顶,底,左,右空格填充:<br />   padding用于设置空格填充范围,用法与边距属性相同:</p> <p>h3 {margin-top:10px;margin-right:20px;margin-bottom:30px;margin-<br /> left:40px};<br /> h3 {margin:10px 20px 30px 40px}<br /> ■ 边框:<br />   border可设定的属性很多,包括颜色和宽度,关键是可以指定每个边的宽度和每个边的颜色 。</p> <p>边框宽度border-width可以是thin,medium,thick或长度值:<br /> h3 {border-top-width:2px;border-right-width:4px;border-bottom-width:6px;border-left-width:8px};<br /> h3 {border-width:2px 4px 6px 8px}/*与上面相同*/</p> <p>p {border-top-width:thin;border-right-width:medium;border-bottom-<br /> width:thick;border-left-width:none};<br /> p {border-width:thin medium thick none}/*与上面相同,左边框将不显示*/</p> <p>边框颜色border-color定义方法与宽度定义相似,颜色值也可以用RGB值(如#ff00ff):<br /> h3 {border-color:red blue yellow green}/*上:红;右:蓝;下:黄;左:绿*/<br /> h3 {border-color:red blue }/*上,下:红;右,左:蓝;*/<br /> h3 {border-color:#ff00ff }/*所有边框为#ff00ff色*/</p> <p>边框线的线条式样border-style,有九个关键字来描述:<br /> none /*不画边框,不论边框厚度是多少*/<br /> dotted /*由点组成的虚线*/<br /> dash /*由短线组成的虚线*/<br /> solid /*实线 */<br /> double /*双实线*/<br /> groove /*3D沟状*/<br /> ridge /*3D脊状*/<br /> inset /*3D内嵌*/<br /> outset /*3D外嵌*/<br /> 其使用方法与厚度、颜色相似,不再多讲。</p> <p>一条边框的颜色,厚度,线条式样可以在一条语句中定义。例:<br /> h1 {border-top:5px solid red}<br />   这么多的参数,这么多的组合,要想得心应手,不下一番功夫去练习是不可能达到的。<br /> ■ 背景颜色:</p> <p>  background-color,用它可以指定整个网页的背景颜色,也可以是某一个单词。在传统的HTML中要将背景颜色应用到一段文字上是一件麻烦事,要将文字放在表格中再设置表格的背景。CSS使之变得非常容易。</p> <p>  P.colorback {background-color:#ff0000}</p> <p>  颜色可以是颜色名(如red)、十六进制数(如#ff0000)、RGB值(如RGB(255,0,0))。</p> <p>■ 背景图片:</p> <p>  background-image,用它可以指定整个网页的背景图片(将它放在BODY标签内),也可以是某一个单词。</p> <p>background-repeat 是否循环背景<br /> p {background-repeat:no-repeat;background-image:url(background.gif)}/*不循环*/<br /> p {background-repeat:repeat;background-image:url(background.gif)}/*循环*/<br /> background-attachment 是否固定背景<br /> body {background-attachment:scroll;background-image:url(background.gif)}/*随文字一起滚动*/<br /> body {background-attachment:fixed;background-image:url(background.gif)}/*固定不动*/<br />   P.colorback {background-color:#ff0000}</p> <p>  颜色可以是颜色名(如red)、十六进制数(如#ff0000)、RGB值(如RGB(255,0,0))。</p> <p> ■ 背景定位:</p> <p>  background-position用于设置背景的位置:</p> <p>p {background-position:top;background-image:url(background.gif)};</p> <p>  background-position其参数可以是关键字、长度数、比例值。</p> <p>关键字;<br /> top /*背景图像与前景对象的顶部对齐*/<br /> bottom /*背景图像与前景对象的底部对齐*/<br /> left /*背景图像与前景对象的左边对齐*/<br /> right /*背景图像与前景对象的右边对齐*/<br /> center /*与前面四个任一个组合,变成水平或垂直居中*/</p> <p>长度数;<br /> 可以是任何一种以前学过的长度单位(pt,px,ems…),例如:<br /> p{background-position:100px 50px;<br /> background-image:url(background.gif)}表示从左上角起水平100像素,垂直50像素的位置摆放。</p> <p>比例值;<br /> 例如:p{background-position:85% 50%;<br /> background-image:url(background.gif)}<br /> 表示从距离段落的右边85%,垂直距离段落顶端50%的位置摆放。</p> </div> </div> <div class="post-167 post hentry category-12" id="post-167"> <div class="meta"><span class="time">2006年08月25日</span><a href="http://blog.duoday.com/category/%e8%ae%be%e8%ae%a1%e4%bb%a3%e7%a0%81" title="查看 设计代码 的全部文章" rel="category tag">设计代码</a><br /><br /><a href="http://blog.duoday.com/2006/167.html#respond" title="用CSS实现滚动条的彩色显示 上的评论">没有评论</a><br /><span class="time">60 views</span></div> <div class="content"> <h2><a href="http://blog.duoday.com/2006/167.html" rel="bookmark">用CSS实现滚动条的彩色显示</a></h2> <p><html><br /> <head><br /> <meta http-equiv='Content-Type' content='text/html; charset=gb2312'></p> <style> BODY { color : #6A1100; text-decoration : none; scrollbar-arrow-color: #ff3300; scrollbar-base-color: #ff2200; scrollbar-dark-shadow-color: #00ff00; scrollbar-track-color: #ffcc00; scrollbar-face-color: #00cc00; scrollbar-shadow-color: #ff1100; scrollbar-highlight-color: #ff3300; scrollbar-3d-light-color: #000000; } </style> <p></head><br /> <body ><br /> </body></p> <p></html></p> </div> </div> <div class="navigation"> <span class="alignleft"><a href="http://blog.duoday.com/category/%e8%ae%be%e8%ae%a1%e4%bb%a3%e7%a0%81/page/3" >« 更早的文章</a></span> <span class="alignright"><a href="http://blog.duoday.com/category/%e8%ae%be%e8%ae%a1%e4%bb%a3%e7%a0%81/" >较新的文章 »</a></span> </div> </div> <div id="sidebar"> <ul> <li><h2>最新日志</h2> <ul> <li><a href="http://blog.duoday.com/2010/307.html">动网数据库Access 转成SQL Server2000 数据库的一个绝对成功的好方法</a></li> <li><a href="http://blog.duoday.com/2009/305.html">元旦来了,祝自己新年快乐每一天!</a></li> <li><a href="http://blog.duoday.com/2009/304.html">2009年7月30日胡扯</a></li> <li><a href="http://blog.duoday.com/2009/303.html">女人因为寂寞而出轨</a></li> <li><a href="http://blog.duoday.com/2009/301.html">我发烧了,却要坚持来上网</a></li> <li><a href="http://blog.duoday.com/2009/300.html">偷偷笑几下,相册我改好拉</a></li> <li><a href="http://blog.duoday.com/2009/285.html">别把你的他送给潜在第三者</a></li> <li><a href="http://blog.duoday.com/2009/283.html">日本军人如此看中国:对解放军从敬佩到轻视</a></li> <li><a href="http://blog.duoday.com/2009/282.html">电脑桌面图标出现阴影怎么办??</a></li> <li><a href="http://blog.duoday.com/2009/281.html">灰色天空下的心情</a></li> </ul> </li> <li><h2>最新评论</h2> <ul> <li>灰机:<a href="http://blog.duoday.com/2010/330.html#comment-123" title="on 和女朋友分手,她却拿做 爱来说事,我打了她">看你的博客很久了 。呵呵</a></li> <li>低碳:<a href="http://blog.duoday.com/2010/330.html#comment-122" title="on 和女朋友分手,她却拿做 爱来说事,我打了她">呵呵,强悍。。</a></li> <li>笑:<a href="http://blog.duoday.com/2010/330.html#comment-121" title="on 和女朋友分手,她却拿做 爱来说事,我打了她">搞笑。。。</a></li> <li>心归零:<a href="http://blog.duoday.com/2010/330.html#comment-93" title="on 和女朋友分手,她却拿做 爱来说事,我打了她">这样子的女人,该!</a></li> <li>Eagle:<a href="http://blog.duoday.com/2010/330.html#comment-92" title="on 和女朋友分手,她却拿做 爱来说事,我打了她">女人嘛,唉</a></li> <li>八步学习网:<a href="http://blog.duoday.com/2010/330.html#comment-89" title="on 和女朋友分手,她却拿做 爱来说事,我打了她">谷歌也不能上了,原来都是GG搜你站的,郁闷。。。</a></li> <li>高中学习方法:<a href="http://blog.duoday.com/2010/330.html#comment-87" title="on 和女朋友分手,她却拿做 爱来说事,我打了她">今天心情不好,留个言发泄下^_^不好意思哦</a></li> <li>支持你:<a href="http://blog.duoday.com/2010/330.html#comment-63" title="on 和女朋友分手,她却拿做 爱来说事,我打了她">无意中看到你这篇日志,觉得兄弟你没错,这样的女人早丢早好!</a></li> <li>chenxu:<a href="http://blog.duoday.com/2010/330.html#comment-47" title="on 和女朋友分手,她却拿做 爱来说事,我打了她">这是真的,是你发生的是吗?感觉很悲剧。可是看开了就好了。不知道是不是我</a></li> <li>伊娃:<a href="http://blog.duoday.com/2009/303.html#comment-40" title="on 女人因为寂寞而出轨">放屁,放你的狗臭批[angry]</a></li> </ul> </li> <li><h2>热门日志</h2> <ul> <li><a href="http://blog.duoday.com/2006/194.html" title="美国之音在线收听,绝对地址">美国之音在线收听,绝对地址</a> - 816 views</li><li><a href="http://blog.duoday.com/2009/274.html" title="GFW是什么意思?">GFW是什么意思?</a> - 252 views</li><li><a href="http://blog.duoday.com/2008/247.html" title="delphi虚拟点击过360安全卫士">delphi虚拟点击过360安全卫士</a> - 231 views</li><li><a href="http://blog.duoday.com/2008/259.html" title="干掉360主进程和360保险箱">干掉360主进程和360保险箱</a> - 222 views</li><li><a href="http://blog.duoday.com/2009/279.html" title="最新免费H球空间">最新免费H球空间</a> - 196 views</li><li><a href="http://blog.duoday.com/2006/185.html" title="大话西游-插曲-芦苇荡那场景">大话西游-插曲-芦苇荡那场景</a> - 195 views</li><li><a href="http://blog.duoday.com/2006/189.html" title="Exchange Server2003下载地址">Exchange Server2003下载地址</a> - 182 views</li><li><a href="http://blog.duoday.com/2005/43.html" title="灰鸽子2.0爱儿破解">灰鸽子2.0爱儿破解</a> - 180 views</li><li><a href="http://blog.duoday.com/2009/305.html" title="元旦来了,祝自己新年快乐每一天!">元旦来了,祝自己新年快乐每一天!</a> - 176 views</li><li><a href="http://blog.duoday.com/2005/41.html" title="一些条值得珍藏的搞笑短信">一些条值得珍藏的搞笑短信</a> - 154 views</li> </ul> </li> <li><h2>日志存档</h2> <form class="tags" id="archiveform" action=""> <select name="archive_chrono" onchange="window.location = (document.forms.archiveform.archive_chrono[ document.forms.archiveform.archive_chrono.selectedIndex].value);"> <option value=''>请选择月份查看</option> <option value='http://blog.duoday.com/date/2010/01'> 2010年一月  (1)</option> <option value='http://blog.duoday.com/date/2009/12'> 2009年十二月  (1)</option> <option value='http://blog.duoday.com/date/2009/07'> 2009年七月  (2)</option> <option value='http://blog.duoday.com/date/2009/04'> 2009年四月  (2)</option> <option value='http://blog.duoday.com/date/2009/03'> 2009年三月  (4)</option> <option value='http://blog.duoday.com/date/2009/02'> 2009年二月  (4)</option> <option value='http://blog.duoday.com/date/2009/01'> 2009年一月  (3)</option> <option value='http://blog.duoday.com/date/2008/12'> 2008年十二月  (4)</option> <option value='http://blog.duoday.com/date/2008/11'> 2008年十一月  (2)</option> <option value='http://blog.duoday.com/date/2008/10'> 2008年十月  (8)</option> <option value='http://blog.duoday.com/date/2008/09'> 2008年九月  (16)</option> <option value='http://blog.duoday.com/date/2008/08'> 2008年八月  (9)</option> <option value='http://blog.duoday.com/date/2008/06'> 2008年六月  (6)</option> <option value='http://blog.duoday.com/date/2008/05'> 2008年五月  (1)</option> <option value='http://blog.duoday.com/date/2008/04'> 2008年四月  (2)</option> <option value='http://blog.duoday.com/date/2008/03'> 2008年三月  (2)</option> <option value='http://blog.duoday.com/date/2007/11'> 2007年十一月  (1)</option> <option value='http://blog.duoday.com/date/2007/07'> 2007年七月  (1)</option> <option value='http://blog.duoday.com/date/2007/05'> 2007年五月  (1)</option> <option value='http://blog.duoday.com/date/2007/04'> 2007年四月  (1)</option> <option value='http://blog.duoday.com/date/2007/01'> 2007年一月  (7)</option> <option value='http://blog.duoday.com/date/2006/12'> 2006年十二月  (3)</option> <option value='http://blog.duoday.com/date/2006/11'> 2006年十一月  (1)</option> <option value='http://blog.duoday.com/date/2006/10'> 2006年十月  (5)</option> <option value='http://blog.duoday.com/date/2006/09'> 2006年九月  (6)</option> <option value='http://blog.duoday.com/date/2006/08'> 2006年八月  (37)</option> <option value='http://blog.duoday.com/date/2006/07'> 2006年七月  (9)</option> <option value='http://blog.duoday.com/date/2006/06'> 2006年六月  (4)</option> <option value='http://blog.duoday.com/date/2006/05'> 2006年五月  (2)</option> <option value='http://blog.duoday.com/date/2006/02'> 2006年二月  (1)</option> <option value='http://blog.duoday.com/date/2006/01'> 2006年一月  (5)</option> <option value='http://blog.duoday.com/date/2005/12'> 2005年十二月  (2)</option> <option value='http://blog.duoday.com/date/2005/11'> 2005年十一月  (3)</option> <option value='http://blog.duoday.com/date/2005/09'> 2005年九月  (1)</option> <option value='http://blog.duoday.com/date/2005/08'> 2005年八月  (17)</option> <option value='http://blog.duoday.com/date/2005/07'> 2005年七月  (20)</option> <option value='http://blog.duoday.com/date/1008/12'> 1008年十二月  (2)</option> </select> </form> </li> <li><h2>标签云</h2> <div class="tags"> <a href='http://blog.duoday.com/tag/%e4%b8%8a%e7%bd%91' class='tag-link-40' title='1个主题' style='font-size: 12px;'>上网</a> <a href='http://blog.duoday.com/tag/%e5%8a%a8%e7%bd%91' class='tag-link-13' title='1个主题' style='font-size: 12px;'>动网</a> <a href='http://blog.duoday.com/tag/%e5%8f%8c%e5%ad%90%e5%ba%a7' class='tag-link-24' title='1个主题' style='font-size: 12px;'>双子座</a> <a href='http://blog.duoday.com/tag/%e5%9b%be%e6%a0%87' class='tag-link-35' title='1个主题' style='font-size: 12px;'>图标</a> <a href='http://blog.duoday.com/tag/%e5%a5%b3%e4%ba%ba' class='tag-link-18' title='1个主题' style='font-size: 12px;'>女人</a> <a href='http://blog.duoday.com/tag/%e5%af%82%e5%af%9e' class='tag-link-19' title='1个主题' style='font-size: 12px;'>寂寞</a> <a href='http://blog.duoday.com/tag/%e5%b0%8f%e7%a0%b4%e5%ad%a9' class='tag-link-47' title='1个主题' style='font-size: 12px;'>小破孩</a> <a href='http://blog.duoday.com/tag/%e5%b9%b8%e7%a6%8f' class='tag-link-45' title='1个主题' style='font-size: 12px;'>幸福</a> <a href='http://blog.duoday.com/tag/%e5%bf%83%e6%83%85' class='tag-link-41' title='1个主题' style='font-size: 12px;'>心情</a> <a href='http://blog.duoday.com/tag/%e6%82%b2%e4%bc%a4' class='tag-link-43' title='1个主题' style='font-size: 12px;'>悲伤</a> <a href='http://blog.duoday.com/tag/%e6%96%b0%e5%b9%b4' class='tag-link-16' title='1个主题' style='font-size: 12px;'>新年</a> <a href='http://blog.duoday.com/tag/%e6%ba%ba%e7%88%b1' class='tag-link-28' title='1个主题' style='font-size: 12px;'>溺爱</a> <a href='http://blog.duoday.com/tag/%e7%88%b1%e6%83%85' class='tag-link-48' title='1个主题' style='font-size: 12px;'>爱情</a> <a href='http://blog.duoday.com/tag/%e7%88%b8%e7%88%b8' class='tag-link-21' title='1个主题' style='font-size: 12px;'>爸爸</a> <a href='http://blog.duoday.com/tag/%e7%94%b5%e4%bf%a1' class='tag-link-30' title='1个主题' style='font-size: 12px;'>电信</a> <a href='http://blog.duoday.com/tag/%e7%94%b7%e4%ba%ba' class='tag-link-25' title='1个主题' style='font-size: 12px;'>男人</a> <a href='http://blog.duoday.com/tag/%e7%9b%b8%e5%86%8c' class='tag-link-39' title='1个主题' style='font-size: 12px;'>相册</a> <a href='http://blog.duoday.com/tag/%e7%9f%ad%e4%bf%a1' class='tag-link-22' title='1个主题' style='font-size: 12px;'>短信</a> <a href='http://blog.duoday.com/tag/%e7%ac%91%e8%af%9d' class='tag-link-26' title='1个主题' style='font-size: 12px;'>笑话</a> <a href='http://blog.duoday.com/tag/%e7%ac%ac%e4%b8%89%e8%80%85' class='tag-link-38' title='1个主题' style='font-size: 12px;'>第三者</a> <a href='http://blog.duoday.com/tag/%e8%83%a1%e6%89%af' class='tag-link-31' title='1个主题' style='font-size: 12px;'>胡扯</a> <a href='http://blog.duoday.com/tag/%e8%89%b2%e6%83%85' class='tag-link-27' title='1个主题' style='font-size: 12px;'>色情</a> <a href='http://blog.duoday.com/tag/%e8%a7%a3%e6%94%be%e5%86%9b' class='tag-link-37' title='1个主题' style='font-size: 12px;'>解放军</a> <a href='http://blog.duoday.com/tag/%e8%b0%8e%e8%a8%80' class='tag-link-29' title='1个主题' style='font-size: 12px;'>谎言</a> <a href='http://blog.duoday.com/tag/%e9%98%b4%e5%bd%b1' class='tag-link-36' title='1个主题' style='font-size: 12px;'>阴影</a> <a href='http://blog.duoday.com/tag/80%e5%90%8e' class='tag-link-46' title='1个主题' style='font-size: 12px;'>80后</a> <a href='http://blog.duoday.com/tag/access' class='tag-link-14' title='1个主题' style='font-size: 12px;'>Access</a> <a href='http://blog.duoday.com/tag/environ' class='tag-link-33' title='1个主题' style='font-size: 12px;'>Environ</a> <a href='http://blog.duoday.com/tag/flash' class='tag-link-49' title='1个主题' style='font-size: 12px;'>flash</a> <a href='http://blog.duoday.com/tag/gfw' class='tag-link-42' title='1个主题' style='font-size: 12px;'>GFW</a> <a href='http://blog.duoday.com/tag/h%e7%90%83' class='tag-link-34' title='1个主题' style='font-size: 12px;'>H球</a> <a href='http://blog.duoday.com/tag/phpnow' class='tag-link-44' title='1个主题' style='font-size: 12px;'>PHPNOW</a> <a href='http://blog.duoday.com/tag/real-player' class='tag-link-51' title='1个主题' style='font-size: 12px;'>Real Player</a> <a href='http://blog.duoday.com/tag/reg' class='tag-link-32' title='1个主题' style='font-size: 12px;'>reg</a> <a href='http://blog.duoday.com/tag/spy-net' class='tag-link-50' title='1个主题' style='font-size: 12px;'>Spy-Net</a> <a href='http://blog.duoday.com/tag/sql-server2000' class='tag-link-15' title='1个主题' style='font-size: 12px;'>SQL Server2000</a> </div> </li> <li id="linkcat-2" class="linkcat"><h2>链接表</h2> <ul class='xoxo blogroll'> <li><a href="http://wordpress.org/development/">Development Blog</a></li> <li><a href="http://codex.wordpress.org/">Documentation</a></li> <li><a href="http://wordpress.org/extend/plugins/">Plugins</a></li> <li><a href="http://wordpress.org/extend/ideas/">Suggest Ideas</a></li> <li><a href="http://wordpress.org/support/">Support Forum</a></li> <li><a href="http://wordpress.org/extend/themes/http://www.tukela.org/seo/671">Themes</a></li> <li><a href="http://planet.wordpress.org/">WordPress Planet</a></li> </ul> </li> <li><h2>博客管理</h2> <ul> <li><a href="http://blog.duoday.com/wp-login.php">登录</a></li> </ul> </li> </ul> </div> </div> <div id="footer"> <div class="w970"> ©2008-2009 奇风's Blog All Rights Reservied<br /> Powered by <a href="http://wordpress.org/" target="_blank">WordPress</a>. Theme by <a href="http://www.prower.cn">Prower</a> </div> </div> <div id="go_top"><em></em><a href="#">返回顶部</a></div> </body> </html>