<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>Rabbit's Blog--我的blog我做主</title>
<link>http://blogger.org.cn/blog/blog.asp?name=yuanqingtao</link>
<description>开心兔子的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[LINUX服务器配置大餐（视频演示）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yuanqingtao&amp;id=28589</link>
<author>yuanqingtao</author>
<pubDate>2007/10/10 10:17:44</pubDate>
<description><![CDATA[<A href="ftp://FTP_hllinux:123456@211.95.73.26/redlib/DHCP服务器配置.EXE" target=_blank><FONT color=#22229c>ftp://FTP_hllinux:123456@211.95.73.26/redlib/DHCP服务器配置.EXE</FONT></A><BR><A href="ftp://FTP_hllinux:123456@211.95.73.26/redlib/Apache服务器配置.EXE" target=_blank><FONT color=#22229c>ftp://FTP_hllinux:123456@211.95.73.26/redlib/Apache服务器配置.EXE</FONT></A><BR><A href="ftp://FTP_hllinux:123456@211.95.73.26/redlib/主DNS服务器配置.EXE" target=_blank><FONT color=#22229c>ftp://FTP_hllinux:123456@211.95.73.26/redlib/主DNS服务器配置.EXE</FONT></A><BR><A href="ftp://FTP_hllinux:123456@211.95.73.26/redlib/一块网卡绑定多个IP地址.EXE" target=_blank><FONT color=#22229c>ftp://FTP_hllinux:123456@211.95.73.26/redlib/一块网卡绑定多个IP地址.EXE</FONT></A><BR><A href="ftp://FTP_hllinux:123456@211.95.73.26/redlib/Sendmail发信认证.EXE" target=_blank><FONT color=#22229c>ftp://FTP_hllinux:123456@211.95.73.26/redlib/Sendmail发信认证.EXE</FONT></A><BR><A href="ftp://FTP_hllinux:123456@211.95.73.26/redlib/Sendmail服务器配置.EXE" target=_blank><FONT color=#22229c>ftp://FTP_hllinux:123456@211.95.73.26/redlib/Sendmail服务器配置.EXE</FONT></A><BR><A href="ftp://FTP_hllinux:123456@211.95.73.26/redlib/Samba服务器配置.EXE" target=_blank><FONT color=#22229c>ftp://FTP_hllinux:123456@211.95.73.26/redlib/Samba服务器配置.EXE</FONT></A><BR><A href="ftp://FTP_hllinux:123456@211.95.73.26/redlib/POP3和IMAP4配置.EXE" target=_blank><FONT color=#22229c>ftp://FTP_hllinux:123456@211.95.73.26/redlib/POP3和IMAP4配置.EXE</FONT></A><BR><A href="ftp://FTP_hllinux:123456@211.95.73.26/redlib/Mysql服务器配置.EXE" target=_blank><FONT color=#22229c>ftp://FTP_hllinux:123456@211.95.73.26/redlib/Mysql服务器配置.EXE</FONT></A><BR><A href="ftp://FTP_hllinux:123456@211.95.73.26/redlib/NFS服务器配置.EXE" target=_blank><FONT color=#22229c>ftp://FTP_hllinux:123456@211.95.73.26/redlib/NFS服务器配置.EXE</FONT></A><BR><A href="ftp://FTP_hllinux:123456@211.95.73.26/redlib/PHP配置.EXE" target=_blank><FONT color=#22229c>ftp://FTP_hllinux:123456@211.95.73.26/redlib/PHP配置.EXE</FONT></A><BR><A href="ftp://FTP_hllinux:123456@211.95.73.26/redlib/Sendmail服务器相关配置.EXE" target=_blank><FONT color=#22229c>ftp://FTP_hllinux:123456@211.95.73.26/redlib/Sendmail服务器相关配置.EXE</FONT></A><BR><A href="ftp://FTP_hllinux:123456@211.95.73.26/redlib/vsftpd服务器配置.EXE" target=_blank><FONT color=#22229c>ftp://FTP_hllinux:123456@211.95.73.26/redlib/vsftpd服务器配置.EXE</FONT></A><BR><A href="ftp://FTP_hllinux:123456@211.95.73.26/redlib/纯缓存DNS服务器配置.EXE" target=_blank><FONT color=#22229c>ftp://FTP_hllinux:123456@211.95.73.26/redlib/纯缓存DNS服务器配置.EXE</FONT></A><BR><A href="ftp://FTP_hllinux:123456@211.95.73.26/redlib/磁盘配额配置.EXE" target=_blank><FONT color=#22229c>ftp://FTP_hllinux:123456@211.95.73.26/redlib/磁盘配额配置.EXE</FONT></A><BR><A href="ftp://FTP_hllinux:123456@211.95.73.26/redlib/辅助DNS服务器配置.EXE" target=_blank><FONT color=#22229c>ftp://FTP_hllinux:123456@211.95.73.26/redlib/辅助DNS服务器配置.EXE</FONT></A>]]></description>
</item><item>
<title><![CDATA[ubuntu使用nfs共享文件]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yuanqingtao&amp;id=24840</link>
<author>yuanqingtao</author>
<pubDate>2007/5/19 15:28:07</pubDate>
<description><![CDATA[关键字：linux ubuntu nfs 共享<BR>1.安装nfs服务器端和客户端<BR>sudo apt-get install portmap nfs-kernel-server<BR>sudo apt-get install portmap nfs-common<BR>2.配置共享文件<BR>编辑/etc/exports，在其中增加要共享的目录<BR>/home是要共享的目录，192.168.1.0/24代表共享给哪个子网，rw是可读写权限<BR>Edit /etc/exports and add the shares: <BR>/home 192.168.1.0/24(rw,sync)<BR>After setting up /etc/exports, export the shares: <BR>sudo exportfs -ra<BR>3.重启服务<BR>sudo /etc/init.d/portmap restart<BR>sudo /etc/init.d/nfs-kernel-server restart<BR>4.客户就可以加载了<BR>sudo mount 192.168.1.15:/home ~/xxx<BR><BR>命令showmount可以查看NFS server的mount信息<BR>命令df可以查看文件系统的信息，也就是可以看mount的情况]]></description>
</item><item>
<title><![CDATA[iptables+NAT+端口映射]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yuanqingtao&amp;id=24617</link>
<author>yuanqingtao</author>
<pubDate>2007/5/11 8:52:08</pubDate>
<description><![CDATA[<FONT size=2>实现目标： <BR>&nbsp; &nbsp;利用iptabels给局域网做NAT透明代理，比如网吧或公司企业的上网代理服务器！同时实现了内网WEB服务器的端口映射！并且解决了WEB服务器访问者IP都为代理服务器IP的问题！同时内外网皆可正常通过公网IP访问内网的WEB服务器！</FONT> 
<P><FONT size=2>实现目标： <BR>&nbsp; &nbsp;利用iptabels给局域网做NAT透明代理，比如网吧或公司企业的上网代理服务器！同时实现了内网WEB服务器的端口映射！并且解决了WEB服务器访问者IP都为代理服务器IP的问题！同时内外网皆可正常通过公网IP访问内网的WEB服务器！（加了SQUID后还没有成功，努力中！） <BR><BR>软硬件环境如下： <BR>&nbsp; &nbsp;操作系统为 RHEL 4 ，3COM网卡两张，eth0为外网网卡，IP为：221.222.111.10; &nbsp; eth1为内网网卡，IP为：192.168.0.1; &nbsp;内网WEB服务器IP为：192.168.0.200 。网络环境为：中国电信10M光纤，固定IP！ <BR><BR>方法为如下： <BR>&nbsp; &nbsp;首先我注释掉了iptables文件原始的全部内容，然后在iptables文件中写入如下内容！ <BR><BR>##################################### Nat段开始 ######################################### <BR>*nat <BR>:PREROUTING ACCEPT [0:0] <BR>:OUTPUT ACCEPT [0:0] <BR>:POSTROUTING ACCEPT [0:0] <BR># <BR>#------------------------------ Web Server 端口映射 ------------------------------ <BR># 192.168.0.200 端口80 <BR>###################### <BR># 用DNAT作端口映射！注意以下指令一定要在NAT透明代理的前面，否则无效！ <BR>-A PREROUTING -i eth1 -p tcp -d 221.222.111.10 --dport 80 -j DNAT --to-destination 192.168.0.200:80 <BR>-A PREROUTING -i eth0 -p tcp -d 221.222.111.10 --dport 80 -j DNAT --to-destination 192.168.0.200:80 <BR># <BR>#------------------------------ Iptables NAT 透明代理 ------------------------------ <BR># <BR>-A POSTROUTING -s 192.168.0.0/255.255.255.0 -j SNAT --to 221.222.111.10 <BR># <BR>COMMIT <BR>##################################### Nat段结束 ######################################### <BR><BR>###################################### Filter段开始 ##################################### <BR># <BR>*filter <BR>:INPUT ACCEPT [0:0] <BR>:FORWARD ACCEPT [0:0] <BR>:OUTPUT ACCEPT [0:0] <BR># <BR>#防止网络上其它计算机使用Ping命令探测本机： <BR>-A INPUT -p icmp --icmp-type echo-request -i eth0 -j DROP <BR># <BR># 防止广播包从IP代理服务器进入局域网： <BR>-A INPUT -s 255.255.255.255 -i eth0 -j DROP <BR>-A INPUT -s 224.0.0.0/224.0.0.0 -i eth0 -j DROP <BR>-A INPUT -d 0.0.0.0 -i eth0 -j DROP <BR># 屏蔽掉以下的TCP和UDP端口： <BR>-A INPUT -i eth1 -p udp -m udp --dport 3 -j DROP <BR>-A INPUT -i eth1 -p tcp -m tcp --dport 3 -j DROP <BR>-A INPUT -i eth1 -p tcp -m tcp --dport 111 -j DROP <BR>-A INPUT -i eth1 -p udp -m udp --dport 111 -j DROP <BR>-A INPUT -i eth1 -p udp -m udp --dport 587 -j DROP <BR>-A INPUT -i eth1 -p tcp -m tcp --dport 587 -j DROP <BR># <BR>COMMIT <BR>###################################### Filter段结束 ##################################### <BR><BR>修改完以上的文件后，再将/etc/sysctl.conf 文件里面修改成 net.ipv4.ip_forward = 1 ，这个很重要，不然NAT代理不能生效的！ <BR><BR>然后用#: service iptables restart 这个指令重起iptables 服务！！OK，你再试试看代理服务和WEB能否则正常访问，我想一定可以的！ <BR><BR><BR>附： <BR>&nbsp; &nbsp;Web Server 端口映射一定要在 Iptables NAT透明代理指令前面，否则内网用户将无法通过公网IP或域名访问内网的Web服务器！ <BR>&nbsp; &nbsp;如果有需要做一些过协议过滤，比如公司的要过滤掉QQ等，请搜索CU论坛的其它帖子，这就不在本帖的讨论范围了</FONT></P>]]></description>
</item><item>
<title><![CDATA[linux 懒人]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yuanqingtao&amp;id=23103</link>
<author>yuanqingtao</author>
<pubDate>2007/3/8 11:04:26</pubDate>
<description><![CDATA[<a>　<span class="postbody"> ［懒人须知］可传送文件和截屏幕的 QQ （EVA）在默认安装FC6的最简易安装成功！！ <br>
1.下载EVA的fc6 rpm文件到你的桌面 <br>
说明：这个eva安装包fedora-cn小组在fc6测试版本的时候做的打包，经过测试在fc6正式版正常使用，现在还在ftp的开发中目录里面，还没有挪到正式发布的目录) <br>
下载地址： <br>
<a target="_blank" href="ftp://ftp.fedora.cn/pub/fedora-cn/li...c6.y1.i386.rpm">ftp://ftp.fedora.cn/pub/fedora-cn/li...c6.y1.i386.rpm</a> <br>
以后可能挪动到这个目录里面： <br>
<a target="_blank" href="ftp://ftp.fedora.cn/pub/fedora-cn/linux/6/i386/">ftp://ftp.fedora.cn/pub/fedora-cn/linux/6/i386/</a> <br>
<br>
2.双击下载下来的桌面上面的 eva-0.4.1-4.fc6.y1.i386.rpm 软件包图标， 然后一步一步安装就行！！ 特别说明：
这里如果你电脑是标准安装fc6
没kde的一些内核支持，安装程序会自动检查依赖关系，并自动在服务器下载所需要的依赖文件（据说好像意思是调用yum的api），这样太事了！不再烦恼
依赖关系了！自动下载来解决！ <br>
<br>
3.安装完成之后，点菜单 应用程序-&gt;internet-&gt;eva 就启动QQ了， 我们的fedora群号：125150，赶紧加入吧 <br>
<br>
别话：当然希望fedora-cn的yum的fc6源尽快能供大家使用，那时候我们yum -y install eva 一条命令就可以享用eva qq了，更加爽 <br>
<br>
enjoy！！！！ <br>
<br>
［懒人必备］之2，两步让系统自带的音乐播放器和电影播放器播放mp3，终于自由高歌了 <br>
<a target="_blank" href="http://www.linuxsir.org/bbs/showthread.php?p=1574086">http://www.linuxsir.org/bbs/showthread.php?p=1574086</a> <br>
1.安装livna 的源 <br>
在终端运行 ： <br>
代码: <br>
<br>
#rpm -ivh <a target="_blank" href="http://rpm.livna.org/fedora/6/i386/livna-release-6-1.noarch.rpm">http://rpm.livna.org/fedora/6/i386/livna-release-6-1.noarch.rpm</a> <br>
<br>
2.安装 gstreamer-plugins-ugly 播放mp3的插件 <br>
在终端运行：#yum-y install gstreamer-plugins-ugly gstreamer-ffmpeg <br>
<br>
听歌吧！！想要播放mp4，divx，最好用mplayer， #yum -y install mplayer <br>
<br>
奉送一些linux extras的不错的游戏给大家吧有类似的泡泡龙哦 <br>
#yum -y install supertux tuxkart ppracer frozen-bubble monkey-bubble <br>
<br>
图形化的yum客户端，有了他就更加方便了 <br>
#yum -y install yumex <br>
菜单－》系统工具-&gt;yum extender <br>
<br>
如果你需要刻录软件用k3b吧，不会让你失望，而且还中文的(其实系统内置的刻录也不错，iso文件刻到光盘，直接右键点iso文件，选写入到光盘就行，) <br>
#yum -y install k3b <br>
<br>
<br>
<br>
ftp的客户端软件，推荐使用gftp， <br>
安装方法： #yum-y install gftp <br>
<br>
如果你登录服务器显示中文乱码解决方法如下,编辑/usr/bin/gftp文件， <br>
命令：# vi /usr/bin/gftp <br>
在#!/bin/sh之后加上 <br>
export LANG=zh_CN <br>
然后保存退出，就可以显示中文了 <br>
<br>
另外一个很棒的选择：Filezilla-3.0.0.beta2 <br>
rpm -ivh <a target="_blank" href="http://auvtech.com/%7Exinzhen/download...ta2-1.i386.rpm">http://auvtech.com/~xinzhen/download...ta2-1.i386.rpm</a> <br>
安装后运行程序（或终端运行filezilla, 站点管理器－》字符集使用自定义字符集 填入：cp936 即可！ <br>
<br>
启动3D桌面效果 系统菜单－》系统－》首选项－》Desktop Effects <br>
<br>
[懒人须知4]linux下面看电视,CCTV5等，sopcast 的rpm包，一点都不比pplive等差哦。还可以即使截取成文件 <br>
<a target="_blank" href="http://www.linuxsir.org/bbs/showthread.php?t=280097">http://www.linuxsir.org/bbs/showthread.php?t=280097</a> <br>
1.安装：（使用终端命令行,有root权限） <br>
代码: <br>
<br>
rpm -ivh <a target="_blank" href="ftp://ftp.fedora.cn/pub/fedora-cn/linux/development/i386/sopcast-client-0.9.8-3.fc6.y1.i386.rpm">ftp://ftp.fedora.cn/pub/fedora-cn/linux/development/i386/sopcast-client-0.9.8-3.fc6.y1.i386.rpm</a> <br>
rpm -ivh <a target="_blank" href="ftp://ftp.fedora.cn/pub/fedora-cn/linux/development/i386/gsopcast-0.2.7-3.fc6.y1.i386.rpm">ftp://ftp.fedora.cn/pub/fedora-cn/linux/development/i386/gsopcast-0.2.7-3.fc6.y1.i386.rpm</a> <br>
<br>
<br>
<br>
<br>
启动：系统菜单－》应用程序－》internet-&gt;gsopcast <br>
<br>
<br>
<br>
官方 ：http://www.sopcast.com/cn/ <br>
<br>
2.由于使用mplayer 播放，所以需要安装mplayer(需要设置liva.org等源), 如果已经装好，跳过此步 <br>
代码: <br>
<br>
yum -y install mplayer mplayer-gui <br>
<br>
<br>
<br>
3. 注意：fc6下面，如果按palyer没有弹出播放窗口，可能需要vi /etc/hosts添加下面这行： (或者把原来的::1 改成127.0.0.1 ) <br>
代码: <br>
<br>
vi /etc/hosts <br>
127.0.0.1 localhost.localdomain localhost <br>
<br>
4.安装就绪后，使用方法，启动gsopcast，弹出频道选择框，例如要看cctv5，双击CCTV5，然后窗口最底下就会有缓冲百分比，到
100%自动弹出mplayer播放器开始播放，或者手动按一下［player］来启动（如果已安装 mplayer不能启动请看前面第3点） <br>
<br>
［懒人须知5］BT官方客户端！yum -y install bittorrent-gui 或ktorrenthttp://www.linuxsir.org/bbs/showthread.php?t=282275 <br>
一般都推荐Azureus 可是如果你还没弄明白linix的java运行环境怎么配置，最简单方法就是使用BT官方的客户端的图形界面，已经收录在extras里面，yum安装bittorrent-gui即可 <br>
<br>
代码: <br>
<br>
[root@localhost ~]# yum -y install bittorrent-gui <br>
<br>
启动： 系统菜单－》应用程序－》internet-&gt;BitTorrent File Transfer <br>
<br>
另一个选择： <br>
如果有安装kde的内核或者不怕安装慢点，还可以用这个很好的界面的ktorrent <br>
代码: <br>
<br>
[root@localhost ~]# yum -y install ktorrent <br>
<br>
<br>
<br>
<br>
<br>
标题: [懒人须知6]SSH，telnet，网络拷贝文件，putty，连接windows远程桌面终端，远程控制linux桌面 <br>
<a target="_blank" href="http://www.linuxsir.org/bbs/showthre...33#post1596633">http://www.linuxsir.org/bbs/showthre...33#post1596633</a> <br>
<br>
<br>
1.最简单命令行连接到linux的服务器(在fc6里ssh服务是默认启动的) <br>
#ssh 192.168.0.1 <br>
如果想用user用户登录 ssh， <br>
#ssh <a href="mailto:user@192.168.0.1">user@192.168.0.1</a> <br>
<br>
<br>
2.图形界面通过网络拷贝文件（Gnome下，超强） <br>
系统菜单－》位置－》连接到服务器 <br>
服务类型：ftp，ssh，windows共享，http 应有尽有！！！ <br>
<br>
<br>
3.如果很多服务器要连接，顶替一下SecureCRT的putty（还没有找到linux版本的secureCRT,找到的说一声) <br>
<br>
yum -y install putty <br>
<br>
系统菜单－》应用程序－》internet－》putty <br>
<br>
<br>
3.1（如果很多服务器要连接，临时替代的方法：在桌面创建启动器-&gt;类型－》终端中的应用程序－》名称ssh 192.168.0.1,命令ssh 192.168.0.1－》确定，双击这个连接就自动ssh了，呵呵） <br>
<br>
<br>
<br>
4.连接到win2000server和windows xp的远程桌面的tsclient, <br>
<br>
yum -y install tsclinet <br>
<br>
<br>
<br>
系统菜单－》应用程序－》internet－》终端服务器客户端 <br>
<br>
5.让其他linux桌面（或windows ）远程控制连接linux的桌面 用vnc-server.， <br>
yum -y install vnc-server <br>
<br>
客户端还需要装vnc的查看器 <br>
yum -y install vnc <br>
系统菜单－》应用程序－》internet－》终端服务器客户端，协议里面选vnc <br>
<br>
另外：fc6如果想让人telnet进来，默认安装之外还需要安装telnet服务 <br>
＃yum -y install telnet-server <br>
#system-config-services －》on demand services －》 选上telnet <br>
或者：setup -&gt;系统服务－》点选telent－&gt;确定 <br>
#service xinetd restart <br>
#telnet localhost 就可以登录自己了 <br>
<br>
enjoy!</span></a>]]></description>
</item><item>
<title><![CDATA[redhat linux 下实现 squid的透明代理]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yuanqingtao&amp;id=22198</link>
<author>yuanqingtao</author>
<pubDate>2007/1/28 16:53:45</pubDate>
<description><![CDATA[<P>关于在LINUX下实现SQUID的透明代理，相信大家也看过不少文章，可大家在架设它时一定遇到过不少问题！</P>
<P>先解释为什么要配置透明代理。 <BR>其实只配置squid就可以实现代理功能，但是对于客户端，就必须在浏览器中设置proxy server，对于其他的工具，比如FlashGet, CuteFTP等等，也必须一一设置，这一点非常麻烦。但是如果设置了透明代理，那么在客户端只需要在网络配置中设置一个网关就可以了，其他的任何程序都不用另行设置。这是设置透明代理最大的诱惑，当然这只是对我而言，其实iptables有更强大的防火墙功能，这才是它最大的用处。但是，此次配置不涉及防火墙，如果有兴趣的请查找iptables howto,了解更多。 </P>
<P>1。假设我们的linux内已经将防火墙支持选项编译进去，这一点可以进入kernel source目录，用make menuconfig确认。 </P>
<P>2。安装squid，一般对于各个Linux发行版，完全安装的话应该已经安装过了，当然也可以从以下网址下载安装： <BR><A href="http://www.squid-cache.org/">http://www.squid-cache.org/</A> </P>
<P>3。无论是重新安装的还是系统中原来就有的，因为对于各个发行版可能squid的配置文件所在的位置各不相同，用find命令确认squid.conf文件的确切位置。如果是rpm安装，也可以用rpm命令来确认：rpm -ql [squidrpmname.rpm] | grep squid.conf </P>
<P>4。在这之前，你有件事不要忘了做件事，你最好把/etc/squid/squid.conf.default CP 到/etc/squid/squid.conf，不然可能会不成功的！ 编辑squid.conf文件，确保以下内容存在： <BR>httpd_accel_host virtual <BR>httpd_accel_port 80 <BR>httpd_accel_with_proxy on <BR>httpd_accel_uses_host_header on <BR>cache_effective_user nobody <BR>cache_effective_group nobody <BR>http_access allow all <BR>cache_dir ufs /usr/local/squid/cache 100 16 256 <BR>注：最后一句为cache目录，需要在下面创建，可以改为你本机squid的所在目录。倒数第二句，表示我们允许所有的请求，这是很不安全的，可以自己创建一个组，然后allow这个组，并且deny all，具体的设置仔细看一下squid.conf就可以了，有很详细的解释和例子 </P>
<P>5。创建cache目录（如果没有的话），修改该目录所有者为nobody <BR>chown nobody:nobody /pathname/cache </P>
<P>6。查看配置文件中默认的log目录，将那个目录的所有者修改为nobody，以确保log可以写入 </P>
<P>7。创建cache： squid -z </P>
<P>8。启动squid： service squid start <BR>squid的站点维护了一份很详细的FAQ，基本上你需要问的问题都有答案，比如你可以先用squid -NCd1来以debug模式启动，这样如果有错误会报出来，一般如果是ADSL拨号的，那么在没有拨号之前就启动squid的话是会出错的(FATAL: ipcache_init: DNS name lookup tests failed)，因为squid启动时会去检查一些常用的DNS，但是这时候你并没有接入internet，自然就出错了，所以我们需要在启动的时候不检查DNS，这就需要用加上-D选项来启动squid </P>
<P>9。启动成功之后，我们就可以去客户端的浏览器里面设置proxy来测试一下了，如果可以接入internet，那么squid就算设置成功了 </P>
<P>10。还有一个后续工作，就是确认squid是不是开机就自动启动了，一般在/etc/init.d中已经有了squid脚本，我们需要做的就是将它ln到适当的rc.d目录中，比如我默认是runlevel5启动的，那么我执行: <BR>ln -s /etc/init.d/squid /etc/init.d/rc5.d/S99squid <BR>ln -s /etc/init.d/squid /etc/init.d/rc5.d/K01squid <BR>这是在SuSE下面，如果是RedHat，那么rc.d目录是在/etc下面，而不是在/etc/init.d下面。 </P>
<P>OK，squid设置结束了，下面我们开始配置iptables<BR>可以用前面所提到的配置工具，但是我没有试过，所以是直接用iptables命令来做的。 <BR>可以man iptables来查看帮助 </P>
<P>我们把iptables的设置命令存在一个脚本文件中，假设脚本文件名为firewall，然后将此文件存放在/etc/init.d中，并且在启动文件中运行此脚本。以下为操作步骤 </P>
<P>1。touch /etc/init.d </P>
<P>2。vi /etc/init.d <BR>加入以下内容：<BR>#!/bin/sh<BR>echo "Enabling IP Forwarding..."<BR>echo 1 &gt; /proc/sys/net/ipv4/ip_forward<BR>echo "Starting iptables rules..."<BR>#Refresh all chains<BR>/sbin/iptables -F -t nat<BR>iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp<BR>--dport 80 -j REDIRECT --to-ports 3128</P>
<P>iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o <BR>ppp0 -j MASQUERADE</P>
<P>对于以上命令的解释如下： <BR>/proc/sys/net/ipv4/ip_forward必须设置为1（默认是0）才可以使用路由功能。 <BR>/sbin/iptables -F -t nat将nat table中的所有现存规则清空。 <BR>eth0：为Linux机器中的网卡。 <BR>3128：为squid中默认的监听端口。 <BR>ppp0：为linux中的ADSL设备（在SuSE中为ppp0，在redhat中可能是dsl0）。 <BR>MASQUERADE：适用于拨号上网的服务器，因为没有静态IP地址，对于有静态IP的服务器，可以用SNAT --to-source ipadress来替代。 </P>
<P>注：以上的命令没有涉及防火墙，请自行参考配置，以上命令也没有删除filter table中的规则，也就是如果以前设置过防火墙，那么不会受到影响。 </P>
<P>3。chmod u+x firewall，更改文件属性，使其可以被执行 </P>
<P>4。编辑/etc/init.d/boot.local文件，在最后加上/etc/init.d/firewall这一句，确保开机就执行此脚本。 <BR>注：SuSE中是boot.local，对于redhat，则需要编辑/etc/rc.d/rc.local文件。 </P>
<P>5。运行firewall，规则立刻生效。 </P>
<P>到此为止，所有配置结束<BR><A></A></P>]]></description>
</item><item>
<title><![CDATA[如何用iptables实现NAT]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yuanqingtao&amp;id=22197</link>
<author>yuanqingtao</author>
<pubDate>2007/1/28 16:35:03</pubDate>
<description><![CDATA[<P>本文主要介绍如何使用iptbales实现linux2.4下的强大的NAT功能。关于iptables的详细语法请参考“用iptales实现包过虑型防火墙”一文。需要申明的是，本文绝对不是 NAT-HOWTO的简单重复或是中文版，在整个的叙述过程中，作者都在试图用自己的语言来表达自己的理解，自己的思想。 <BR>　　一、概述</P>
<P>　　1. 什么是NAT</P>
<P>　　在传统的标准的TCP/IP通信过程中，所有的路由器仅仅是充当一个中间人的角色，也就是通常所说的存储转发，路由器并不会对转发的数据包进行修改，更为确切的说，除了将源MAC地址换成自己的MAC地址以外，路由器不会对转发的数据包做任何修改。NAT(Network Address Translation网络地址翻译)恰恰是出于某种特殊需要而对数据包的源ip地址、目的ip地址、源端口、目的端口进行改写的操作。</P>
<P>　　2. 为什么要进行NAT</P>
<P>　　我们来看看再什么情况下我们需要做NAT。</P>
<P>　　假设有一家ISP提供园区Internet接入服务，为了方便管理，该ISP分配给园区用户的IP地址都是伪IP，但是部分用户要求建立自己的WWW服务器对外发布信息，这时候我们就可以通过NAT来提供这种服务了。我们可以在防火墙的外部网卡上绑定多个合法IP地址，然后通过NAT技术使发给其中某一个IP地址的包转发至内部某一用户的WWW服务器上，然后再将该内部WWW服务器响应包伪装成该合法IP发出的包。</P>
<P>　　再比如使用拨号上网的网吧，因为只有一个合法的IP地址，必须采用某种手段让其他机器也可以上网，通常是采用代理服务器的方式，但是代理服务器，尤其是应用层代理服务器，只能支持有限的协议，如果过了一段时间后又有新的服务出来，则只能等待代理服务器支持该新应用的升级版本。如果采用NAT来解决这个问题，</P>
<P>　　因为是在应用层以下进行处理，NAT不但可以获得很高的访问速度，而且可以无缝的支持任何新的服务或应用。</P>
<P>　　还有一个方面的应用就是重定向，也就是当接收到一个包后，不是转发这个包，而是将其重定向到系统上的某一个应用程序。最常见的应用就是和squid配合使用成为透明代理，在对http流量进行缓存的同时，可以提供对Internet的无缝访问。</P>
<P>　　3. NAT的类型</P>
<P>　　在linux2.4的NAT-HOWTO中，作者从原理的角度将NAT分成了两种类型，即源NAT(SNAT)和目的NAT(DNAT)，顾名思义，所谓SNAT就是改变转发数据包的源地址，所谓DNAT就是改变转发数据包的目的地址。&nbsp; </P>
<P><BR>　　二、原理</P>
<P>　　在“用iptales实现包过虑型防火墙”一文中我们说过，netfilter是Linux 核心中一个通用架构，它提供了一系列的"表"(tables)，每个表由若干"链"(chains)组成，而每条链中可以有一条或数条规则(rule)组成。并且系统缺省的表是"filter"。但是在使用NAT的时候，我们所使用的表不再是"filter"，而是"nat"表，所以我们必须使用"-t nat"选项来显式地指明这一点。因为系统缺省的表是"filter"，所以在使用filter功能时，我们没有必要显式的指明"-t filter"。</P>
<P>　　同filter表一样，nat表也有三条缺省的"链"(chains)，这三条链也是规则的容器，它们分别是:</P>
<P>　　PREROUTING:可以在这里定义进行目的NAT的规则，因为路由器进行路由时只检查数据包的目的ip地址，所以为了使数据包得以正确路由，我们必须在路由之前就进行目的NAT;</P>
<P>　　POSTROUTING:可以在这里定义进行源NAT的规则，系统在决定了数据包的路由以后在执行该链中的规则。</P>
<P>　　OUTPUT:定义对本地产生的数据包的目的NAT规则。</P>
<P>&nbsp;&nbsp;&nbsp; 三、操作语法</P>
<P>　　如前所述，在使用iptables的NAT功能时，我们必须在每一条规则中使用"-t nat"显示的指明使用nat表。然后使用以下的选项:</P>
<P>　　1. 对规则的操作</P>
<P>　　加入(append) 一个新规则到一个链 (-A)的最后。</P>
<P>　　在链内某个位置插入(insert) 一个新规则(-I)，通常是插在最前面。</P>
<P>　　在链内某个位置替换(replace) 一条规则 (-R)。</P>
<P>　　在链内某个位置删除(delete) 一条规则 (-D)。</P>
<P>　　删除(delete) 链内第一条规则 (-D)。</P>
<P>　　2. 指定源地址和目的地址</P>
<P>　　通过--source/--src/-s来指定源地址(这里的/表示或者的意思，下同)，通过--destination/--dst/-s来指定目的地址。可以使用以下四中方法来指定ip地址:</P>
<P>　　a. 使用完整的域名，如“www.linuxaid.com.cn”;</P>
<P>　　b. 使用ip地址，如“192.168.1.1”;</P>
<P>　　c. 用x.x.x.x/x.x.x.x指定一个网络地址，如“192.168.1.0/255.255.255.0”;</P>
<P>　　d. 用x.x.x.x/x指定一个网络地址，如“192.168.1.0/24”这里的24表明了子网掩码的有效位数，这是 UNIX环境中通常使用的表示方法。</P>
<P>　　缺省的子网掩码数是32，也就是说指定192.168.1.1等效于192.168.1.1/32。</P>
<P>　　3. 指定网络接口</P>
<P>　　可以使用--in-interface/-i或--out-interface/-o来指定网络接口。从NAT的原理可以看出，对于PREROUTING链，我们只能用-i指定进来的网络接口;而对于POSTROUTING和OUTPUT我们只能用-o指定出去的网络接口。</P>
<P>　　4. 指定协议及端口</P>
<P>　　可以通过--protocol/-p选项来指定协议，如果是udp和tcp协议，还可--source-port/--sport和 --destination-port/--dport来指明端口。<BR>四、准备工作</P>
<P>　　1. 编译内核，编译时选中以下选项，具体可参看“用iptales实现包过虑型防火墙”一文:</P>
<P>　　 Full NAT</P>
<P>　　 MASQUERADE target support</P>
<P>　　 REDIRECT target support</P>
<P>　　2. 要使用NAT表时，必须首先载入相关模块:</P>
<P>　　modprobe ip_tables</P>
<P>　　modprobe ip_nat_ftp</P>
<P>　　iptable_nat 模块会在运行时自动载入。</P>
<P>&nbsp;&nbsp;&nbsp; 五、使用实例</P>
<P>　　1. 源NAT(SNAT)</P>
<P>　　比如，更改所有来自192.168.1.0/24的数据包的源ip地址为1.2.3.4:</P>
<P>　　iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 1.2.3.4</P>
<P>　　这里需要注意的是，系统在路由及过虑等处理直到数据包要被送出时才进行SNAT。</P>
<P>　　有一种SNAT的特殊情况是ip欺骗，也就是所谓的Masquerading，通常建议在使用拨号上网的时候使用，或者说在合法ip地址不固定的情况下使用。比如</P>
<P>　　# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE</P>
<P>　　可以看出，这时候我们没有必要显式的指定源ip地址等信息。</P>
<P>　　2. 目的SNAT(DNAT)</P>
<P>　　比如，更改所有来自192.168.1.0/24的数据包的目的ip地址为1.2.3.4:</P>
<P>　　iptables -t nat -A PREROUTING -s 192.168.1.0/24 -i eth1 -j DNAT --to 1.2.3.4</P>
<P>　　这里需要注意的是，系统是先进行DNAT，然后才进行路由及过虑等操作。</P>
<P>　　有一种DNAT的特殊情况是重定向，也就是所谓的Redirection，这时候就相当于将符合条件的数据包的目的ip地址改为数据包进入系统时的网络接口的ip地址。通常是在与squid配置形成透明代理时使用，假设squid的监听端口是3128，我 们可以通过以下语句来将来自192.168.1.0/24，目的端口为80的数据包重定向到squid监听</P>
<P>　　端口:</P>
<P>　　iptables -t nat -A PREROUTING -i eth1 -p tcp -s 192.168.1.0/24 --dport 80</P>
<P>　　-j REDIRECT --to-port 3128</P>
<P>&nbsp; 　　六、综合例子</P>
<P>　　1. 使用拨号带动局域网上网</P>
<P>　　小型企业、网吧等多使用拨号网络上网，通常可能使用代理，但是考虑到成本、对协议的支持等因素，建议使用ip欺骗方式带动区域网上网。</P>
<P>　　成功升级内核后安装iptables，然后执行以下脚本:</P>
<P>　　#载入相关模块</P>
<P>　　modprobe ip_tables</P>
<P>　　modprobe ip_nat_ftp</P>
<P>　　#进行ip伪装</P>
<P>　　iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE</P>
<P>　　2. ip映射</P>
<P>　　假设有一家ISP提供园区Internet接入服务，为了方便管理，该ISP分配给园区用户的IP地址都是伪IP，但是部分用户要求建立自己的WWW服务器对外发布信息。我们可以再防火墙的外部网卡上绑定多个合法IP地址，然后通过ip映射使发给其中某一 个IP地址的包转发至内部某一用户的WWW服务器上，然后再将该内部WWW服务器响应包伪装成该合法IP发出的包。</P>
<P>　　我们假设以下情景:</P>
<P>　　该ISP分配给A单位www服务器的ip为:</P>
<P>　　伪ip:192.168.1.100</P>
<P>　　真实ip:202.110.123.100</P>
<P>　　该ISP分配给B单位www服务器的ip为:</P>
<P>　　伪ip:192.168.1.200</P>
<P>　　真实ip:202.110.123.200</P>
<P>　　linux防火墙的ip地址分别为:</P>
<P>　　内网接口eth1:192.168.1.1</P>
<P>　　外网接口eth0:202.110.123.1</P>
<P>　　然后我们将分配给A、B单位的真实ip绑定到防火墙的外网接口，以root权限执行以下命令:</P>
<P>　　ifconfig eth0 add 202.110.123.100 netmask 255.255.255.0</P>
<P>　　ifconfig eth0 add 202.110.123.200 netmask 255.255.255.0</P>
<P>　　成功升级内核后安装iptables，然后执行以下脚本:</P>
<P>　　#载入相关模块</P>
<P>　　modprobe ip_tables</P>
<P>　　modprobe ip_nat_ftp</P>
<P>　　首先，对防火墙接收到的目的ip为202.110.123.100和202.110.123.200的所有数据包进行目的NAT(DNAT):</P>
<P>　　iptables -A PREROUTING -i eth0 -d 202.110.123.100 -j DNAT --to 192.168.1.100</P>
<P>　　iptables -A PREROUTING -i eth0 -d 202.110.123.200 -j DNAT --to 192.168.1.200</P>
<P>　　其次，对防火墙接收到的源ip地址为192.168.1.100和192.168.1.200的数据包进行源NAT(SNAT):</P>
<P>　　iptables -A POSTROUTING -o eth0 -s 192.168.1.100 -j SNAT --to 202.110.123.100</P>
<P>　　iptables -A POSTROUTING -o eth0 -s 192.168.1.200 -j SNAT --to 202.110.123.200</P>
<P>　　这样，所有目的ip为202.110.123.100和202.110.123.200的数据包都将分别被转发给192.168.1.100和192.168.1.200;而所有来自192.168.1.100和192.168.1.200的数据包都将分 别被伪装成由202.110.123.100和202.110.123.200，从而也就实现了ip映射。</P>]]></description>
</item><item>
<title><![CDATA[使用 FireStarter 实现共享 Internet 上网]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yuanqingtao&amp;id=22196</link>
<author>yuanqingtao</author>
<pubDate>2007/1/28 16:27:59</pubDate>
<description><![CDATA[<P>详细见：<A href="http://www.unix-cd.com/unixcd12/article_view.asp?id=3278">http://www.unix-cd.com/unixcd12/article_view.asp?id=3278</A><A></A></P>]]></description>
</item><item>
<title><![CDATA[ASP程序调用验证码]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yuanqingtao&amp;id=20420</link>
<author>yuanqingtao</author>
<pubDate>2006/11/30 14:15:53</pubDate>
<description><![CDATA[<P>调用方法&lt;img src="getcode.asp"&gt;&lt;input name="vcode" type="input"&gt;<BR>在服务器验证的时候Session("GetCode") = Request.Form("vcode")</P>
<P><BR>文件GetCode.asp<BR>&lt;%<BR>Const nMaxSaturation = 100&nbsp;&nbsp; ' 最大色彩饱和度<BR>Const nBlankNoisyDotOdds = 0.2&nbsp; ' 空白处噪点率<BR>Const nColorNoisyDotOdds = 0.1 ' 有色处噪点率<BR>Const nCharCount = 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 产生的字符个数<BR>Const nPixelWidth = 20&nbsp;&nbsp;&nbsp;&nbsp; ' 单个字符位图的宽度<BR>Const nPixelHeight = 20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 单个字符位图的高度<BR>Const nColorHue = 220&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 显示验证码的色调(-1表示随机色调, -2表示灰度色调)<BR>Const nAngleRandom = 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 角度随机量<BR>Const nLengthRandom = 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 长度随机量(百分比)<BR>Const cCharSet = "0123456789"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 构成验证码的字符集<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 如果扩充了下边的字母矢量库，则可以相应扩充这个字符集</P>
<P>Dim Buf(), DigtalStr<BR>Dim Lines(), LineCount<BR>Dim CursorX, CursorY, DirX, DirY</P>
<P>Randomize<BR>Call CreatValidCode("GetCode")</P>
<P>Sub CDGen_Reset()<BR>&nbsp;' 复位矢量笔和环境变量<BR>&nbsp;LineCount = 0<BR>&nbsp;CursorX = 0<BR>&nbsp;CursorY = 0<BR>&nbsp;' 初始的光笔方向是垂直向下<BR>&nbsp;DirX = 0<BR>&nbsp;DirY = 1<BR>End Sub</P>
<P>Sub CDGen_Clear()<BR>&nbsp;' 清空位图阵列<BR>&nbsp;Dim i, j<BR>&nbsp;ReDim Buf(nPixelHeight - 1, nCharCount * nPixelWidth - 1)</P>
<P>&nbsp;For j = 0 To nPixelHeight - 1<BR>&nbsp; For i = 0 To nCharCount * nPixelWidth - 1<BR>&nbsp;&nbsp; Buf(j, i) = 0<BR>&nbsp; Next<BR>&nbsp;Next<BR>End Sub</P>
<P>Sub CDGen_PSet(X, Y)<BR>&nbsp;' 在位图阵列上画点<BR>&nbsp;Buf(Y, X) = 1<BR>End Sub</P>
<P>Sub CDGen_Line(X1, Y1, X2, Y2)<BR>&nbsp;' 在位图阵列上画线<BR>&nbsp;Dim DX, DY, DeltaT, i<BR>&nbsp;<BR>&nbsp;DX = X2 - X1<BR>&nbsp;DY = Y2 - Y1<BR>&nbsp;If Abs(DX) &gt; Abs(DY) Then DeltaT = Abs(DX) Else DeltaT = Abs(DY)<BR>&nbsp;For i = 0 To DeltaT<BR>&nbsp; CDGen_PSet X1 + DX * i / DeltaT, Y1 + DY * i / DeltaT<BR>&nbsp;Next<BR>End Sub</P>
<P>Sub CDGen_FowardDraw(nLength)<BR>&nbsp;' 按当前光笔方向绘制指定长度并移动光笔，正数表示从左向右/从上向下绘制，负数表示从右向左/从下向上绘制<BR>&nbsp;nLength = Sgn(nLength) * Abs(nLength) * (1 - nLengthRandom / 100 + Rnd * nLenghtRandom * 2 / 100)<BR>&nbsp;ReDim Preserve Lines(3, LineCount)<BR>&nbsp;Lines(0, LineCount) = CursorX<BR>&nbsp;Lines(1, LineCount) = CursorY<BR>&nbsp;CursorX = CursorX + DirX * nLength<BR>&nbsp;CursorY = CursorY + DirY * nLength<BR>&nbsp;Lines(2, LineCount) = CursorX<BR>&nbsp;Lines(3, LineCount) = CursorY<BR>&nbsp;LineCount = LineCount + 1<BR>End Sub</P>
<P>Sub CDGen_SetDirection(nAngle)<BR>&nbsp;' 按指定角度设定画笔方向, 正数表示相对当前方向顺时针改变方向，负数表示相对当前方向逆时针改变方向<BR>&nbsp;Dim DX, DY<BR>&nbsp;<BR>&nbsp;nAngle = Sgn(nAngle) * (Abs(nAngle) - nAngleRandom + Rnd * nAngleRandom * 2) / 180 * 3.1415926<BR>&nbsp;DX = DirX<BR>&nbsp;DY = DirY<BR>&nbsp;DirX = DX * Cos(nAngle) - DY * Sin(nAngle)<BR>&nbsp;DirY = DX * Sin(nAngle) + DY * Cos(nAngle)<BR>End Sub</P>
<P>Sub CDGen_MoveToMiddle(nActionIndex, nPercent)<BR>&nbsp;' 将画笔光标移动到指定动作的中间点上，nPercent为中间位置的百分比<BR>&nbsp;Dim DeltaX, DeltaY<BR>&nbsp;<BR>&nbsp;DeltaX = Lines(2, nActionIndex) - Lines(0, nActionIndex)<BR>&nbsp;DeltaY = Lines(3, nActionIndex) - Lines(1, nActionIndex)<BR>&nbsp;CursorX = Lines(0, nActionIndex) + Sgn(DeltaX) * Abs(DeltaX) * nPercent / 100<BR>&nbsp;CursorY = Lines(1, nActionIndex) + Sgn(DeltaY) * Abs(DeltaY) * nPercent / 100<BR>End Sub</P>
<P>Sub CDGen_MoveCursor(nActionIndex)<BR>&nbsp;' 将画笔光标移动到指定动作的起始点上<BR>&nbsp;CursorX = Lines(0, nActionIndex)<BR>&nbsp;CursorY = Lines(1, nActionIndex)<BR>End Sub</P>
<P>Sub CDGen_Close(nActionIndex)<BR>&nbsp;' 将当前光笔位置与指定动作的起始点闭合并移动光笔<BR>&nbsp;ReDim Preserve Lines(3, LineCount)<BR>&nbsp;Lines(0, LineCount) = CursorX<BR>&nbsp;Lines(1, LineCount) = CursorY<BR>&nbsp;CursorX = Lines(0, nActionIndex)<BR>&nbsp;CursorY = Lines(1, nActionIndex)<BR>&nbsp;Lines(2, LineCount) = CursorX<BR>&nbsp;Lines(3, LineCount) = CursorY<BR>&nbsp;LineCount = LineCount + 1<BR>End Sub</P>
<P>Sub CDGen_CloseToMiddle(nActionIndex, nPercent)<BR>&nbsp;' 将当前光笔位置与指定动作的中间点闭合并移动光笔，nPercent为中间位置的百分比<BR>&nbsp;Dim DeltaX, DeltaY<BR>&nbsp;<BR>&nbsp;ReDim Preserve Lines(3, LineCount)<BR>&nbsp;Lines(0, LineCount) = CursorX<BR>&nbsp;Lines(1, LineCount) = CursorY<BR>&nbsp;DeltaX = Lines(2, nActionIndex) - Lines(0, nActionIndex)<BR>&nbsp;DeltaY = Lines(3, nActionIndex) - Lines(1, nActionIndex)<BR>&nbsp;CursorX = Lines(0, nActionIndex) + Sgn(DeltaX) * Abs(DeltaX) * nPercent / 100<BR>&nbsp;CursorY = Lines(1, nActionIndex) + Sgn(DeltaY) * Abs(DeltaY) * nPercent / 100<BR>&nbsp;Lines(2, LineCount) = CursorX<BR>&nbsp;Lines(3, LineCount) = CursorY<BR>&nbsp;LineCount = LineCount + 1<BR>End Sub</P>
<P>Sub CDGen_Flush(X0, Y0)<BR>&nbsp;' 按照当前的画笔动作序列绘制位图点阵<BR>&nbsp;Dim MaxX, MinX, MaxY, MinY<BR>&nbsp;Dim DeltaX, DeltaY, StepX, StepY, OffsetX, OffsetY<BR>&nbsp;Dim i</P>
<P>&nbsp;MaxX = MinX = MaxY = MinY = 0<BR>&nbsp;For i = 0 To LineCount - 1<BR>&nbsp; If MaxX &lt; Lines(0, i) Then MaxX = Lines(0, i)<BR>&nbsp; If MaxX &lt; Lines(2, i) Then MaxX = Lines(2, i)<BR>&nbsp; If MinX &gt; Lines(0, i) Then MinX = Lines(0, i)<BR>&nbsp; If MinX &gt; Lines(2, i) Then MinX = Lines(2, i)<BR>&nbsp; If MaxY &lt; Lines(1, i) Then MaxY = Lines(1, i)<BR>&nbsp; If MaxY &lt; Lines(3, i) Then MaxY = Lines(3, i)<BR>&nbsp; If MinY &gt; Lines(1, i) Then MinY = Lines(1, i)<BR>&nbsp; If MinY &gt; Lines(3, i) Then MinY = Lines(3, i)<BR>&nbsp;Next<BR>&nbsp;DeltaX = MaxX - MinX<BR>&nbsp;DeltaY = MaxY - MinY<BR>&nbsp;If DeltaX = 0 Then DeltaX = 1<BR>&nbsp;If DeltaY = 0 Then DeltaY = 1<BR>&nbsp;MaxX = MinX<BR>&nbsp;MaxY = MinY<BR>&nbsp;If DeltaX &gt; DeltaY Then<BR>&nbsp; StepX = (nPixelWidth - 2) / DeltaX<BR>&nbsp; StepY = (nPixelHeight - 2) / DeltaX<BR>&nbsp; OffsetX = 0<BR>&nbsp; OffsetY = (DeltaX - DeltaY) / 2<BR>&nbsp;Else<BR>&nbsp; StepX = (nPixelWidth - 2) / DeltaY<BR>&nbsp; StepY = (nPixelHeight - 2) / DeltaY<BR>&nbsp; OffsetX = (DeltaY - DeltaX) / 2<BR>&nbsp; OffsetY = 0<BR>&nbsp;End If<BR>&nbsp;For i = 0 To LineCount - 1<BR>&nbsp; Lines(0, i) = Round((Lines(0, i) - MaxX + OffsetX) * StepX, 0)<BR>&nbsp; If Lines(0, i) &lt; 0 Then Lines(0, i) = 0<BR>&nbsp; If Lines(0, i) &gt;= nPixelWidth - 2 Then Lines(0, i) = nPixelWidth - 3<BR>&nbsp; Lines(1, i) = Round((Lines(1, i) - MaxY + OffsetY) * StepY, 0)<BR>&nbsp; If Lines(1, i) &lt; 0 Then Lines(1, i) = 0<BR>&nbsp; If Lines(1, i) &gt;= nPixelHeight - 2 Then Lines(1, i) = nPixelHeight - 3<BR>&nbsp; Lines(2, i) = Round((Lines(2, i) - MinX + OffsetX) * StepX, 0)<BR>&nbsp; If Lines(2, i) &lt; 0 Then Lines(2, i) = 0<BR>&nbsp; If Lines(2, i) &gt;= nPixelWidth - 2 Then Lines(2, i) = nPixelWidth - 3<BR>&nbsp; Lines(3, i) = Round((Lines(3, i) - MinY + OffsetY) * StepY, 0)<BR>&nbsp; If Lines(3, i) &lt; 0 Then Lines(3, i) = 0<BR>&nbsp; If Lines(3, i) &gt;= nPixelHeight - 2 Then Lines(3, i) = nPixelHeight - 3<BR>&nbsp; CDGen_Line Lines(0, i) + X0 + 1, Lines(1, i) + Y0 + 1, Lines(2, i) + X0 + 1, Lines(3, i) + Y0 + 1<BR>&nbsp;Next<BR>End Sub</P>
<P>Sub CDGen_Char(cChar, X0, Y0)<BR>&nbsp;' 在指定坐标处生成指定字符的位图阵列<BR>&nbsp;CDGen_Reset<BR>&nbsp;Select Case cChar<BR>&nbsp;Case "0"<BR>&nbsp; CDGen_SetDirection -60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 逆时针60度(相对于垂直线)<BR>&nbsp; CDGen_FowardDraw -0.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 反方向绘制0.7个单位<BR>&nbsp; CDGen_SetDirection -60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 逆时针60度<BR>&nbsp; CDGen_FowardDraw -0.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 反方向绘制0.7个单位<BR>&nbsp; CDGen_SetDirection 120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针120度<BR>&nbsp; CDGen_FowardDraw 1.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制1.5个单位<BR>&nbsp; CDGen_SetDirection -60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 逆时针60度<BR>&nbsp; CDGen_FowardDraw 0.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.7个单位<BR>&nbsp; CDGen_SetDirection -60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针120度<BR>&nbsp; CDGen_FowardDraw 0.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.7个单位<BR>&nbsp; CDGen_Close 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 封闭当前笔与第0笔(0开始)<BR>&nbsp;Case "1"<BR>&nbsp; CDGen_SetDirection -90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 逆时针90度(相对于垂直线)<BR>&nbsp; CDGen_FowardDraw 0.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.5个单位<BR>&nbsp; CDGen_MoveToMiddle 0, 50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 移动画笔的位置到第0笔(0开始)的50%处<BR>&nbsp; CDGen_SetDirection 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 逆时针90度<BR>&nbsp; CDGen_FowardDraw -1.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 反方向绘制1.4个单位<BR>&nbsp; CDGen_SetDirection 30&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 逆时针30度<BR>&nbsp; CDGen_FowardDraw 0.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.4个单位<BR>&nbsp;Case "2"<BR>&nbsp; CDGen_SetDirection 45&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针45度(相对于垂直线)<BR>&nbsp; CDGen_FowardDraw -0.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 反方向绘制0.7个单位<BR>&nbsp; CDGen_SetDirection -120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 逆时针120度<BR>&nbsp; CDGen_FowardDraw 0.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.4个单位<BR>&nbsp; CDGen_SetDirection 60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针60度<BR>&nbsp; CDGen_FowardDraw 0.6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.6个单位<BR>&nbsp; CDGen_SetDirection 60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针60度<BR>&nbsp; CDGen_FowardDraw 1.6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制1.6个单位<BR>&nbsp; CDGen_SetDirection -135&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 逆时针135度<BR>&nbsp; CDGen_FowardDraw 1.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制1.0个单位<BR>&nbsp;Case "3"<BR>&nbsp; CDGen_SetDirection -90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 逆时针90度(相对于垂直线)<BR>&nbsp; CDGen_FowardDraw 0.8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.8个单位<BR>&nbsp; CDGen_SetDirection 135&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针135度<BR>&nbsp; CDGen_FowardDraw 0.8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.8个单位<BR>&nbsp; CDGen_SetDirection -120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 逆时针120度<BR>&nbsp; CDGen_FowardDraw 0.6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.6个单位<BR>&nbsp; CDGen_SetDirection 80&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针80度<BR>&nbsp; CDGen_FowardDraw 0.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.5个单位<BR>&nbsp; CDGen_SetDirection 60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针60度<BR>&nbsp; CDGen_FowardDraw 0.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.5个单位<BR>&nbsp; CDGen_SetDirection 60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针60度<BR>&nbsp; CDGen_FowardDraw 0.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.5个单位<BR>&nbsp;Case "4"<BR>&nbsp; CDGen_SetDirection 20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针20度(相对于垂直线)<BR>&nbsp; CDGen_FowardDraw 0.8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.8个单位<BR>&nbsp; CDGen_SetDirection -110&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 逆时针110度<BR>&nbsp; CDGen_FowardDraw 1.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制1.2个单位<BR>&nbsp; CDGen_MoveToMiddle 1, 60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 移动画笔的位置到第1笔(0开始)的60%处<BR>&nbsp; CDGen_SetDirection 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针90度<BR>&nbsp; CDGen_FowardDraw 0.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.7个单位<BR>&nbsp; CDGen_MoveCursor 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 移动画笔到第2笔(0开始)的开始处<BR>&nbsp; CDGen_FowardDraw -1.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 反方向绘制1.5个单位<BR>&nbsp;Case "5"<BR>&nbsp; CDGen_SetDirection 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针90度(相对于垂直线)<BR>&nbsp; CDGen_FowardDraw 1.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制1.0个单位<BR>&nbsp; CDGen_SetDirection -90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 逆时针90度<BR>&nbsp; CDGen_FowardDraw 0.8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.8个单位<BR>&nbsp; CDGen_SetDirection -90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 逆时针90度<BR>&nbsp; CDGen_FowardDraw 0.8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.8个单位<BR>&nbsp; CDGen_SetDirection 30&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针30度<BR>&nbsp; CDGen_FowardDraw 0.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.4个单位<BR>&nbsp; CDGen_SetDirection 60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针60度<BR>&nbsp; CDGen_FowardDraw 0.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.4个单位<BR>&nbsp; CDGen_SetDirection 30&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针30度<BR>&nbsp; CDGen_FowardDraw 0.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.5个单位<BR>&nbsp; CDGen_SetDirection 60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针60度<BR>&nbsp; CDGen_FowardDraw 0.8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.8个单位<BR>&nbsp;Case "6"<BR>&nbsp; CDGen_SetDirection -60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 逆时针60度(相对于垂直线)<BR>&nbsp; CDGen_FowardDraw -0.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 反方向绘制0.7个单位<BR>&nbsp; CDGen_SetDirection -60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 逆时针60度<BR>&nbsp; CDGen_FowardDraw -0.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 反方向绘制0.7个单位<BR>&nbsp; CDGen_SetDirection 120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针120度<BR>&nbsp; CDGen_FowardDraw 1.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制1.5个单位<BR>&nbsp; CDGen_SetDirection 120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针120度<BR>&nbsp; CDGen_FowardDraw -0.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 反方向绘制0.7个单位<BR>&nbsp; CDGen_SetDirection 120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针120度<BR>&nbsp; CDGen_FowardDraw 0.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.7个单位<BR>&nbsp; CDGen_SetDirection 120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针120度<BR>&nbsp; CDGen_FowardDraw -0.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 反方向绘制0.7个单位<BR>&nbsp; CDGen_SetDirection 120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针120度<BR>&nbsp; CDGen_FowardDraw 0.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.5个单位<BR>&nbsp; CDGen_CloseToMiddle 2, 50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 将当前画笔位置与第2笔(0开始)的50%处封闭<BR>&nbsp;Case "7"<BR>&nbsp; CDGen_SetDirection 180&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针180度(相对于垂直线)<BR>&nbsp; CDGen_FowardDraw 0.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.3个单位<BR>&nbsp; CDGen_SetDirection 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针90度<BR>&nbsp; CDGen_FowardDraw 0.9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.9个单位<BR>&nbsp; CDGen_SetDirection 120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针120度<BR>&nbsp; CDGen_FowardDraw 1.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制1.3个单位<BR>&nbsp;Case "8"<BR>&nbsp; CDGen_SetDirection -60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 逆时针60度(相对于垂直线)<BR>&nbsp; CDGen_FowardDraw -0.8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 反方向绘制0.8个单位<BR>&nbsp; CDGen_SetDirection -60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 逆时针60度<BR>&nbsp; CDGen_FowardDraw -0.8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 反方向绘制0.8个单位<BR>&nbsp; CDGen_SetDirection 120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针120度<BR>&nbsp; CDGen_FowardDraw 0.8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.8个单位<BR>&nbsp; CDGen_SetDirection 110&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针110度<BR>&nbsp; CDGen_FowardDraw -1.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 反方向绘制1.5个单位<BR>&nbsp; CDGen_SetDirection -110&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 逆时针110度<BR>&nbsp; CDGen_FowardDraw 0.9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.9个单位<BR>&nbsp; CDGen_SetDirection 60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针60度<BR>&nbsp; CDGen_FowardDraw 0.8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.8个单位<BR>&nbsp; CDGen_SetDirection 60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针60度<BR>&nbsp; CDGen_FowardDraw 0.8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.8个单位<BR>&nbsp; CDGen_SetDirection 60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针60度<BR>&nbsp; CDGen_FowardDraw 0.9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.9个单位<BR>&nbsp; CDGen_SetDirection 70&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针70度<BR>&nbsp; CDGen_FowardDraw 1.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制1.5个单位<BR>&nbsp; CDGen_Close 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 封闭当前笔与第0笔(0开始)<BR>&nbsp;Case "9"<BR>&nbsp; CDGen_SetDirection 120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 逆时针60度(相对于垂直线)<BR>&nbsp; CDGen_FowardDraw -0.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 反方向绘制0.7个单位<BR>&nbsp; CDGen_SetDirection -60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 逆时针60度<BR>&nbsp; CDGen_FowardDraw -0.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 反方向绘制0.7个单位<BR>&nbsp; CDGen_SetDirection -60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针120度<BR>&nbsp; CDGen_FowardDraw -1.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制1.5个单位<BR>&nbsp; CDGen_SetDirection -60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针120度<BR>&nbsp; CDGen_FowardDraw -0.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 反方向绘制0.7个单位<BR>&nbsp; CDGen_SetDirection -60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针120度<BR>&nbsp; CDGen_FowardDraw -0.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.7个单位<BR>&nbsp; CDGen_SetDirection 120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针120度<BR>&nbsp; CDGen_FowardDraw 0.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 反方向绘制0.7个单位<BR>&nbsp; CDGen_SetDirection -60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针120度<BR>&nbsp; CDGen_FowardDraw 0.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.5个单位<BR>&nbsp; CDGen_CloseToMiddle 2, 50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 将当前画笔位置与第2笔(0开始)的50%处封闭<BR>&nbsp;' 以下为字母的矢量动作，有兴趣的可以继续<BR>&nbsp;Case "A"<BR>&nbsp; CDGen_SetDirection -(Rnd * 20 + 150)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 逆时针150-170度(相对于垂直线)<BR>&nbsp; CDGen_FowardDraw Rnd * 0.2 + 1.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制1.1-1.3个单位<BR>&nbsp; CDGen_SetDirection Rnd * 20 + 140&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针140-160度<BR>&nbsp; CDGen_FowardDraw Rnd * 0.2 + 1.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制1.1-1.3个单位<BR>&nbsp; CDGen_MoveToMiddle 0, 30&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 移动画笔的位置到第1笔(0开始)的30%处<BR>&nbsp; CDGen_CloseToMiddle 1, 70&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 将当前画笔位置与第1笔(0开始)的70%处封闭<BR>&nbsp;Case "B"<BR>&nbsp; CDGen_SetDirection -(Rnd * 20 + 50)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 逆时针50-70度(相对于垂直线)<BR>&nbsp; CDGen_FowardDraw Rnd * 0.4 + 0.8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.8-1.2个单位<BR>&nbsp; CDGen_SetDirection Rnd * 20 + 110&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针110-130度<BR>&nbsp; CDGen_FowardDraw Rnd * 0.2 + 0.6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.6-0.8个单位<BR>&nbsp; CDGen_SetDirection -(Rnd * 20 + 110)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 逆时针110-130度<BR>&nbsp; CDGen_FowardDraw Rnd * 0.2 + 0.6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.6-0.8个单位<BR>&nbsp; CDGen_SetDirection Rnd * 20 + 110&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针110-130度<BR>&nbsp; CDGen_FowardDraw Rnd * 0.4 + 0.8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.8-1.2个单位<BR>&nbsp; CDGen_Close 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 封闭当前笔与第1笔(0开始)<BR>&nbsp;Case "C"<BR>&nbsp; CDGen_SetDirection -60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 逆时针60度(相对于垂直线)<BR>&nbsp; CDGen_FowardDraw -0.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 反方向绘制0.7个单位<BR>&nbsp; CDGen_SetDirection -60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 逆时针60度<BR>&nbsp; CDGen_FowardDraw -0.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 反方向绘制0.7个单位<BR>&nbsp; CDGen_SetDirection 120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针120度<BR>&nbsp; CDGen_FowardDraw 1.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制1.5个单位<BR>&nbsp; CDGen_SetDirection 120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针120度<BR>&nbsp; CDGen_FowardDraw -0.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 反方向绘制0.7个单位<BR>&nbsp; CDGen_SetDirection 120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 顺时针120度<BR>&nbsp; CDGen_FowardDraw 0.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 绘制0.7个单位<BR>&nbsp;End Select<BR>&nbsp;CDGen_Flush X0, Y0<BR>End Sub</P>
<P>Sub CDGen_Blur()<BR>&nbsp;' 对产生的位图进行柔化处理<BR>&nbsp;Dim i, j<BR>&nbsp;<BR>&nbsp;For j = 1 To nPixelHeight - 2<BR>&nbsp; For i = 1 To nCharCount * nPixelWidth - 2<BR>&nbsp;&nbsp; If Buf(j, i) = 0 Then<BR>&nbsp;&nbsp;&nbsp; If ((Buf(j, i - 1) Or Buf(j + 1, i)) And 1) &lt;&gt; 0 Then<BR>&nbsp;&nbsp;&nbsp;&nbsp; ' 如果当前点是空白点，且上下左右四个点中有一个点是有色点，则该点做柔化处理<BR>&nbsp;&nbsp;&nbsp;&nbsp; Buf(j, i) = 2<BR>&nbsp;&nbsp;&nbsp; End If<BR>&nbsp;&nbsp; End If<BR>&nbsp; Next<BR>&nbsp;Next<BR>End Sub</P>
<P>Sub CDGen_NoisyDot()<BR>&nbsp;' 对产生的位图进行噪点处理<BR>&nbsp;Dim i, j, NoisyDot, CurDot<BR>&nbsp;<BR>&nbsp;For j = 0 To nPixelHeight - 1<BR>&nbsp; For i = 0 To nCharCount * nPixelWidth - 1<BR>&nbsp;&nbsp; If Buf(j, i) &lt;&gt; 0 Then<BR>&nbsp;&nbsp;&nbsp; NoisyDot = Int(Rnd * Rnd * nMaxSaturation)<BR>&nbsp;&nbsp;&nbsp; Select Case nColorNoisyDotOdds<BR>&nbsp;&nbsp;&nbsp; Case 0<BR>&nbsp;&nbsp;&nbsp;&nbsp; CurDot = nMaxSaturation<BR>&nbsp;&nbsp;&nbsp; Case 1<BR>&nbsp;&nbsp;&nbsp;&nbsp; CurDot = 0<BR>&nbsp;&nbsp;&nbsp; Case Else<BR>&nbsp;&nbsp;&nbsp;&nbsp; CurDot = NoisyDot<BR>&nbsp;&nbsp;&nbsp; End Select<BR>&nbsp;&nbsp;&nbsp; If Rnd &lt; nColorNoisyDotOdds Then Buf(j, i) = CurDot Else Buf(j, i) = nMaxSaturation<BR>&nbsp;&nbsp; Else<BR>&nbsp;&nbsp;&nbsp; NoisyDot = Int(Rnd * nMaxSaturation)<BR>&nbsp;&nbsp;&nbsp; Select Case nBlankNoisyDotOdds<BR>&nbsp;&nbsp;&nbsp; Case 0<BR>&nbsp;&nbsp;&nbsp;&nbsp; CurDot = 0<BR>&nbsp;&nbsp;&nbsp; Case 1<BR>&nbsp;&nbsp;&nbsp;&nbsp; CurDot = nMaxSaturation<BR>&nbsp;&nbsp;&nbsp; Case Else<BR>&nbsp;&nbsp;&nbsp;&nbsp; CurDot = NoisyDot<BR>&nbsp;&nbsp;&nbsp; End Select<BR>&nbsp;&nbsp;&nbsp; If Rnd &lt; nBlankNoisyDotOdds Then Buf(j, i) = CurDot Else Buf(j, i) = 0<BR>&nbsp;&nbsp; End If<BR>&nbsp; Next<BR>&nbsp;Next<BR>End Sub</P>
<P>Sub CDGen()<BR>&nbsp;' 生成位图阵列<BR>&nbsp;Dim i, Ch<BR>&nbsp;<BR>&nbsp;DigtalStr = ""<BR>&nbsp;CDGen_Clear<BR>&nbsp;For i = 0 To nCharCount - 1<BR>&nbsp; Ch = Mid(cCharSet, Int(Rnd * Len(cCharSet)) + 1, 1)<BR>&nbsp; DigtalStr = DigtalStr + Ch<BR>&nbsp; CDGen_Char Ch, i * nPixelWidth, 0<BR>&nbsp;Next<BR>&nbsp;CDGen_Blur<BR>&nbsp;CDGen_NoisyDot<BR>End Sub</P>
<P>Function HSBToRGB(vH, vS, vB)<BR>&nbsp;' 将颜色值由HSB转换为RGB<BR>&nbsp;Dim aRGB(3), RGB1st, RGB2nd, RGB3rd<BR>&nbsp;Dim nH, nS, nB<BR>&nbsp;Dim lH, nF, nP, nQ, nT</P>
<P>&nbsp;vH = (vH Mod 360)<BR>&nbsp;If vS &gt; 100 Then<BR>&nbsp; vS = 100<BR>&nbsp;ElseIf vS &lt; 0 Then<BR>&nbsp; vS = 0<BR>&nbsp;End If<BR>&nbsp;If vB &gt; 100 Then<BR>&nbsp; vB = 100<BR>&nbsp;ElseIf vB &lt; 0 Then<BR>&nbsp; vB = 0<BR>&nbsp;End If<BR>&nbsp;If vS &gt; 0 Then<BR>&nbsp; nH = vH / 60<BR>&nbsp; nS = vS / 100<BR>&nbsp; nB = vB / 100<BR>&nbsp; lH = Int(nH)<BR>&nbsp; nF = nH - lH<BR>&nbsp; nP = nB * (1 - nS)<BR>&nbsp; nQ = nB * (1 - nS * nF)<BR>&nbsp; nT = nB * (1 - nS * (1 - nF))<BR>&nbsp; Select Case lH<BR>&nbsp; Case 0<BR>&nbsp;&nbsp; aRGB(0) = nB * 255<BR>&nbsp;&nbsp; aRGB(1) = nT * 255<BR>&nbsp;&nbsp; aRGB(2) = nP * 255<BR>&nbsp; Case 1<BR>&nbsp;&nbsp; aRGB(0) = nQ * 255<BR>&nbsp;&nbsp; aRGB(1) = nB * 255<BR>&nbsp;&nbsp; aRGB(2) = nP * 255<BR>&nbsp; Case 2<BR>&nbsp;&nbsp; aRGB(0) = nP * 255<BR>&nbsp;&nbsp; aRGB(1) = nB * 255&nbsp; <BR>&nbsp;&nbsp; aRGB(2) = nT * 255<BR>&nbsp; Case 3<BR>&nbsp;&nbsp; aRGB(0) = nP * 255<BR>&nbsp;&nbsp; aRGB(1) = nQ * 255<BR>&nbsp;&nbsp; aRGB(2) = nB * 255<BR>&nbsp; Case 4<BR>&nbsp;&nbsp; aRGB(0) = nT * 255<BR>&nbsp;&nbsp; aRGB(1) = nP * 255<BR>&nbsp;&nbsp; aRGB(2) = nB * 255<BR>&nbsp; Case 5<BR>&nbsp;&nbsp; aRGB(0) = nB * 255<BR>&nbsp;&nbsp; aRGB(1) = nP * 255<BR>&nbsp;&nbsp; aRGB(2) = nQ * 255<BR>&nbsp; End Select&nbsp;&nbsp; <BR>&nbsp;Else<BR>&nbsp; aRGB(0) = (vB * 255) / 100<BR>&nbsp; aRGB(1) = aRGB(0)<BR>&nbsp; aRGB(2) = aRGB(0)<BR>&nbsp;End If<BR>&nbsp;HSBToRGB = ChrB(Round(aRGB(2), 0)) &amp; ChrB(Round(aRGB(1), 0)) &amp; ChrB(Round(aRGB(0), 0))<BR>End Function</P>
<P>Sub CreatValidCode(pSN)<BR>&nbsp;Dim i, j, CurColorHue<BR>&nbsp;<BR>&nbsp;' 禁止缓存<BR>&nbsp;Response.Expires = -9999<BR>&nbsp;Response.AddHeader "pragma", "no-cache"<BR>&nbsp;Response.AddHeader "cache-ctrol", "no-cache"<BR>&nbsp;Response.ContentType = "image/bmp"<BR>&nbsp;<BR>&nbsp;Call CDGen<BR>&nbsp;Session(pSN) = DigtalStr '记录入Session</P>
<P>&nbsp;Dim PicWidth, PicHeight, FileSize, PicDataSize<BR>&nbsp;PicWidth = nCharCount * nPixelWidth<BR>&nbsp;PicHeight = nPixelHeight<BR>&nbsp;PicDataSize = PicWidth * PicHeight * 3<BR>&nbsp;FileSize = PicDataSize + 54</P>
<P>&nbsp;' 输出BMP文件信息头<BR>&nbsp;Response.BinaryWrite ChrB(66) &amp; ChrB(77) &amp; _<BR>&nbsp; ChrB(FileSize Mod 256) &amp; ChrB((FileSize \ 256) Mod 256) &amp; ChrB((FileSize \ 256 \ 256) Mod 256) &amp; ChrB(FileSize \ 256 \ 256 \ 256) &amp; _<BR>&nbsp; ChrB(0) &amp; ChrB(0) &amp; ChrB(0) &amp; ChrB(0) &amp; _<BR>&nbsp; ChrB(54) &amp; ChrB(0) &amp; ChrB(0) &amp; ChrB(0)</P>
<P>&nbsp;' 输出BMP位图信息头<BR>&nbsp;Response.BinaryWrite ChrB(40) &amp; ChrB(0) &amp; ChrB(0) &amp; ChrB(0) &amp; _<BR>&nbsp; ChrB(PicWidth Mod 256) &amp; ChrB((PicWidth \ 256) Mod 256) &amp; ChrB((PicWidth \ 256 \ 256) Mod 256) &amp; ChrB(PicWidth \ 256 \ 256 \ 256) &amp; _<BR>&nbsp; ChrB(PicHeight Mod 256) &amp; ChrB((PicHeight \ 256) Mod 256) &amp; ChrB((PicHeight \ 256 \ 256) Mod 256) &amp; ChrB(PicHeight \ 256 \ 256 \ 256) &amp; _<BR>&nbsp; ChrB(1) &amp; ChrB(0) &amp; _<BR>&nbsp; ChrB(24) &amp; ChrB(0) &amp; _<BR>&nbsp; ChrB(0) &amp; ChrB(0) &amp; ChrB(0) &amp; ChrB(0) &amp; _<BR>&nbsp; ChrB(PicDataSize Mod 256) &amp; ChrB((PicDataSize \ 256) Mod 256) &amp; ChrB((PicDataSize \ 256 \ 256) Mod 256) &amp; ChrB(PicDataSize \ 256 \ 256 \ 256) &amp; _<BR>&nbsp; ChrB(18) &amp; ChrB(11) &amp; ChrB(0) &amp; ChrB(0) &amp; _<BR>&nbsp; ChrB(18) &amp; ChrB(11) &amp; ChrB(0) &amp; ChrB(0) &amp; _<BR>&nbsp; ChrB(0) &amp; ChrB(0) &amp; ChrB(0) &amp; ChrB(0) &amp; _<BR>&nbsp; ChrB(0) &amp; ChrB(0) &amp; ChrB(0) &amp; ChrB(0)</P>
<P>&nbsp;' 逐点输出位图阵列<BR>&nbsp;If nColorHue = -1 Then<BR>&nbsp; CurColorHue = Int(Rnd * 360)<BR>&nbsp;ElseIf nColorHue = -2 Then<BR>&nbsp; CurColorHue = 0<BR>&nbsp;Else<BR>&nbsp; CurColorHue = nColorHue<BR>&nbsp;End If<BR>&nbsp;For j = 0 To nPixelHeight - 1<BR>&nbsp; For i = 0 To Len(DigtalStr) * nPixelWidth - 1<BR>&nbsp;&nbsp; If nColorHue = -2 Then<BR>&nbsp;&nbsp;&nbsp; Response.BinaryWrite HSBToRGB(CurColorHue, 0, 100 - Buf(nPixelHeight - 1 - j, i))<BR>&nbsp;&nbsp; Else<BR>&nbsp;&nbsp;&nbsp; Response.BinaryWrite HSBToRGB(CurColorHue, Buf(nPixelHeight - 1 - j, i), 100)<BR>&nbsp;&nbsp; End If<BR>&nbsp; Next<BR>&nbsp;Next<BR>End Sub<BR>%&gt;</P>]]></description>
</item><item>
<title><![CDATA[40种网页常用小技巧(javascript)]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yuanqingtao&amp;id=20339</link>
<author>yuanqingtao</author>
<pubDate>2006/11/27 9:46:06</pubDate>
<description><![CDATA[<P>1. oncontextmenu="window.event.returnValue=false" <BR>将彻底屏蔽鼠标右键<BR>&lt;table border oncontextmenu=return(false)&gt;&lt;td&gt;no&lt;/table&gt;<BR>可用于Table <BR>2. &lt;body onselectstart="return false"&gt; <BR>取消选取、防止复制<BR>3. onpaste="return false"<BR>不准粘贴<BR>4. oncopy="return false;" oncut="return false;" <BR>防止复制<BR>5. &lt;link rel="Shortcut Icon" href="favicon.ico"&gt; <BR>IE地址栏前换成自己的图标<BR>6. &lt;link rel="Bookmark" href="favicon.ico"&gt; <BR>可以在收藏夹中显示出你的图标<BR>7. &lt;input style="ime-mode:disabled"&gt; <BR>关闭输入法<BR>8. 永远都会带着框架&lt;script language="JavaScript"&gt;&lt;!--<BR>if (window == top)top.location.href = "frames.htm"; //frames.htm为框架网页<BR>// --&gt;&lt;/script&gt;<BR>9. 防止被人frame<BR>&lt;SCRIPT LANGUAGE=JAVASCRIPT&gt;&lt;!-- <BR>if (top.location != self.location)top.location=self.location;<BR>// --&gt;&lt;/SCRIPT&gt;<BR>10. 网页将不能被另存为<BR>&lt;noscript&gt;&lt;iframe src=*.html&gt;&lt;/iframe&gt;&lt;/noscript&gt; </P>
<P>11. &lt;input type=button value=查看网页源代码 <BR>onclick="window.location = "view-source:"+ "<A href="http://www.pconline.com.cn">http://www.pconline.com.cn</A>""&gt;<BR>12. 删除时确认<BR>&lt;a href="javascript:if(confirm("确实要删除吗?"))location="boos.asp?&amp;areyou=删除&amp;page=1""&gt;删除&lt;/a&gt; <BR>13. 取得控件的绝对位置<BR>//Javascript<BR>&lt;script language="Javascript"&gt;<BR>function getIE(e){<BR>var t=e.offsetTop;<BR>var l=e.offsetLeft;<BR>while(e=e.offsetParent){<BR>t+=e.offsetTop;<BR>l+=e.offsetLeft;<BR>}<BR>alert("top="+t+"/nleft="+l);<BR>}<BR>&lt;/script&gt;</P>
<P>//VBScript<BR>&lt;script language="VBScript"&gt;&lt;!--<BR>function getIE()<BR>dim t,l,a,b<BR>set a=document.all.img1<BR>t=document.all.img1.offsetTop<BR>l=document.all.img1.offsetLeft<BR>while a.tagName&lt;&gt;"BODY"<BR>set a = a.offsetParent<BR>t=t+a.offsetTop<BR>l=l+a.offsetLeft<BR>wend<BR>msgbox "top="&amp;t&amp;chr(13)&amp;"left="&amp;l,64,"得到控件的位置"<BR>end function<BR>--&gt;&lt;/script&gt;</P>
<P>14. 光标是停在文本框文字的最后<BR>&lt;script language="javascript"&gt;<BR>function cc()<BR>{<BR>var e = event.srcElement;<BR>var r =e.createTextRange();<BR>r.moveStart("character",e.value.length);<BR>r.collapse(true);<BR>r.select();<BR>}<BR>&lt;/script&gt;<BR>&lt;input type=text name=text1 value="123" onfocus="cc()"&gt;<BR>15. 判断上一页的来源<BR>javascript:<BR>document.referrer<BR>16. 最小化、最大化、关闭窗口<BR>&lt;object id=hh1 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11"&gt; <BR>&lt;param name="Command" value="Minimize"&gt;&lt;/object&gt;<BR>&lt;object id=hh2 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11"&gt; <BR>&lt;param name="Command" value="Maximize"&gt;&lt;/object&gt;<BR>&lt;OBJECT id=hh3 classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"&gt;<BR>&lt;PARAM NAME="Command" VALUE="Close"&gt;&lt;/OBJECT&gt;<BR>&lt;input type=button value=最小化 onclick=hh1.Click()&gt;<BR>&lt;input type=button value=最大化 onclick=hh2.Click()&gt;<BR>&lt;input type=button value=关闭 onclick=hh3.Click()&gt;<BR>本例适用于IE</P>
<P>17. 屏蔽功能键Shift,Alt,Ctrl<BR>&lt;script&gt;<BR>function look(){ <BR>if(event.shiftKey) <BR>alert("禁止按Shift键!"); //可以换成ALT　CTRL<BR>} <BR>document.onkeydown=look; <BR>&lt;/script&gt;<BR>18. 网页不会被缓存<BR>&lt;META HTTP-EQUIV="pragma" CONTENT="no-cache"&gt;<BR>&lt;META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate"&gt;<BR>&lt;META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT"&gt;</P>
<P>或者</P>
<P>&lt;META HTTP-EQUIV="expires" CONTENT="0"&gt;</P>
<P>19. 怎样让表单没有凹凸感？<BR>&lt;input type=text style="border:1 solid #000000"&gt; <BR>或&lt;input type=text style="border-left:none; border-right:none; border-top:none; border-bottom:1 solid #000000"&gt;&lt;/textarea&gt;<BR>20. <BR>&lt;div&gt;&lt;span&gt;&amp;&lt;layer&gt;<BR>的区别？ <BR>(division)用来定义大段的页面元素，会产生转行 <BR>用来定义同一行内的元素，跟<BR>的唯一区别是不产生转行 <BR>是ns的标记，ie不支持，相当于<BR>21. 让弹出窗口总是在最上面:<BR>&lt;body onblur="this.focus();"&gt;<BR>22. 不要滚动条? <BR>让竖条没有: <BR>&lt;body style="overflow:scroll;overflow-y:hidden"&gt; <BR>&lt;/body&gt; <BR>让横条没有: <BR>&lt;body style="overflow:scroll;overflow-x:hidden"&gt; <BR>&lt;/body&gt; <BR>两个都去掉？更简单了 <BR>&lt;body scroll="no"&gt; <BR>&lt;/body&gt; </P>
<P>23. 怎样去掉图片链接点击后，图片周围的虚线？<BR>&lt;a href="#" onFocus="this.blur()"&gt;&lt;img src="logo.jpg" border=0&gt;&lt;/a&gt;</P>
<P>24. 电子邮件处理提交表单<BR>&lt;form name="form1" method="post" action="<A href="mailto:****@***.com">mailto:****@***.com</A>" enctype="text/plain"&gt; <BR>&lt;input type=submit&gt;<BR>&lt;/form&gt;</P>
<P>25. 在打开的子窗口刷新父窗口的代码里如何写？<BR>window.opener.location.reload()</P>
<P>26. 如何设定打开页面的大小<BR>&lt;body onload="top.resizeTo(300,200);"&gt;<BR>打开页面的位置<BR>&lt;body onload="top.moveBy(300,200);"&gt;</P>
<P>27. 在页面中如何加入不是满铺的背景图片,拉动页面时背景图不动 <BR>&lt;STYLE&gt; <BR>body <BR>{background-image:url(logo.gif); background-repeat:no-repeat; <BR>background-position:center;background-attachment: fixed} <BR>&lt;/STYLE&gt;</P>
<P>28. 检查一段字符串是否全由数字组成<BR>&lt;script language="Javascript"&gt;&lt;!--<BR>function checkNum(str){return str.match(//D/)==null}<BR>alert(checkNum("1232142141"))<BR>alert(checkNum("123214214a1"))<BR>// --&gt;&lt;/script&gt;</P>
<P>29. 获得一个窗口的大小<BR>document.body.clientWidth; document.body.clientHeight</P>
<P>30. 怎么判断是否是字符<BR>if (/[^/x00-/xff]/g.test(s)) alert("含有汉字");<BR>else alert("全是字符");</P>
<P>31. TEXTAREA自适应文字行数的多少<BR>&lt;textarea rows=1 name=s1 cols=27 onpropertychange="this.style.posHeight=this.scrollHeight"&gt;<BR>&lt;/textarea&gt;</P>
<P>32. 日期减去天数等于第二个日期<BR>&lt;script language=Javascript&gt;<BR>function cc(dd,dadd)<BR>{<BR>//可以加上错误处理<BR>var a = new Date(dd)<BR>a = a.valueOf()<BR>a = a - dadd * 24 * 60 * 60 * 1000<BR>a = new Date(a)<BR>alert(a.getFullYear() + "年" + (a.getMonth() + 1) + "月" + a.getDate() + "日")<BR>}<BR>cc("12/23/2002",2)<BR>&lt;/script&gt;</P>
<P>33. 选择了哪一个Radio<BR>&lt;HTML&gt;&lt;script language="vbscript"&gt;<BR>function checkme()<BR>for each ob in radio1<BR>if ob.checked then window.alert ob.value<BR>next<BR>end function<BR>&lt;/script&gt;&lt;BODY&gt;<BR>&lt;INPUT name="radio1" type="radio" value="style" checked&gt;Style<BR>&lt;INPUT name="radio1" type="radio" value="barcode"&gt;Barcode<BR>&lt;INPUT type="button" value="check" onclick="checkme()"&gt;<BR>&lt;/BODY&gt;&lt;/HTML&gt;</P>
<P>34. 脚本永不出错<BR>&lt;SCRIPT LANGUAGE="JavaScript"&gt; <BR>&lt;!-- Hide <BR>function killErrors() { <BR>return true; <BR>} <BR>window.onerror = killErrors; <BR>// --&gt; <BR>&lt;/SCRIPT&gt;</P>
<P>35. ENTER键可以让光标移到下一个输入框<BR>&lt;input onkeydown="if(event.keyCode==13)event.keyCode=9"&gt;</P>
<P>36. 检测某个网站的链接速度：<BR>把如下代码加入<BR>&lt;body&gt;<BR>区域中:<BR>&lt;script language=Javascript&gt;<BR>tim=1<BR>setInterval("tim++",100)<BR>b=1<BR>var autourl=new Array()<BR>autourl[1]="<A href="http://www.njcatv.net">www.njcatv.net</A>"<BR>autourl[2]="javacool.3322.net"<BR>autourl[3]="<A href="http://www.sina.com.cn">www.sina.com.cn</A>"<BR>autourl[4]="<A href="http://www.nuaa.edu.cn">www.nuaa.edu.cn</A>"<BR>autourl[5]="<A href="http://www.cctv.com">www.cctv.com</A>"<BR>function butt(){<BR>document.write("&lt;form name=autof&gt;")<BR>for(var i=1;i&lt;autourl.length;i++)<BR>document.write("&lt;input type=text name=txt"+i+" size=10 value=测试中……&gt; =》&lt;input type=text <BR>name=url"+i+" size=40&gt; =》&lt;input type=button value=GO </P>
<P>onclick=window.open(this.form.url"+i+".value)&gt;&lt;br&gt;")<BR>document.write("&lt;input type=submit value=刷新&gt;&lt;/form&gt;")<BR>}<BR>butt()<BR>function auto(url){<BR>document.forms[0]["url"+b].value=url<BR>if(tim&gt;200)<BR>{document.forms[0]["txt"+b].value="链接超时"}<BR>else<BR>{document.forms[0]["txt"+b].value="时间"+tim/10+"秒"}<BR>b++<BR>}<BR>function run(){for(var i=1;i&lt;autourl.length;i++)document.write("&lt;img src=http://"+autourl+"/"+Math.random()+" width=1 height=1 </P>
<P>onerror=auto("<A href='http://"+autourl'>http://"+autourl</A>+"")&gt;")}<BR>run()&lt;/script&gt;</P>
<P>37. 各种样式的光标<BR>auto ：标准光标<BR>default ：标准箭头<BR>hand ：手形光标<BR>wait ：等待光标<BR>text ：I形光标<BR>vertical-text ：水平I形光标<BR>no-drop ：不可拖动光标<BR>not-allowed ：无效光标<BR>help ：?帮助光标<BR>all-scroll ：三角方向标<BR>move ：移动标<BR>crosshair ：十字标<BR>e-resize<BR>n-resize<BR>nw-resize<BR>w-resize<BR>s-resize<BR>se-resize<BR>sw-resize</P>
<P>38. 页面进入和退出的特效<BR>进入页面</P>
<P>&lt;meta http-equiv="Page-Enter" content="revealTrans(duration=x, transition=y)"&gt;</P>
<P>推出页面</P>
<P>&lt;meta http-equiv="Page-Exit" content="revealTrans(duration=x, transition=y)"&gt;&nbsp; </P>
<P>这个是页面被载入和调出时的一些特效。duration表示特效的持续时间，以秒为单位。transition表示使用哪种特效，取值为1-23:<BR>　　0 矩形缩小 <BR>　　1 矩形扩大 <BR>　　2 圆形缩小<BR>　　3 圆形扩大 <BR>　　4 下到上刷新 <BR>　　5 上到下刷新<BR>　　6 左到右刷新 <BR>　　7 右到左刷新 <BR>　　8 竖百叶窗<BR>　　9 横百叶窗 <BR>　　10 错位横百叶窗 <BR>　　11 错位竖百叶窗<BR>　　12 点扩散 <BR>　　13 左右到中间刷新 <BR>　　14 中间到左右刷新<BR>　　15 中间到上下<BR>　　16 上下到中间 <BR>　　17 右下到左上<BR>　　18 右上到左下 <BR>　　19 左上到右下 <BR>　　20 左下到右上<BR>　　21 横条 <BR>　　22 竖条 <BR>　　23 以上22种随机选择一种</P>
<P>39. 在规定时间内跳转<BR>&lt;META http-equiv=V="REFRESH" content="5;URL=http://www.51js.com"&gt; </P>
<P>40. 网页是否被检索<BR>&lt;meta name="ROBOTS" content="属性值"&gt;<BR>　　其中属性值有以下一些:<BR>　　属性值为"all": 文件将被检索，且页上链接可被查询；<BR>　　属性值为"none": 文件不被检索，而且不查询页上的链接；<BR>　　属性值为"index": 文件将被检索；<BR>　　属性值为"follow": 查询页上的链接；<BR>　　属性值为"noindex": 文件不检索，但可被查询链接；<BR>　　属性值为"nofollow": 文件不被检索，但可查询页上的链接。 <BR></P>]]></description>
</item><item>
<title><![CDATA[几种所见所得的在线编辑器的分析]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yuanqingtao&amp;id=20335</link>
<author>yuanqingtao</author>
<pubDate>2006/11/27 9:41:55</pubDate>
<description><![CDATA[1.FCKeditor 编辑器 <BR><BR>FCKeditor is compatible with most internet browsers which include: IE 5.5+ (Windows), Firefox 1.0+, Mozilla 1.3+ and Netscape 7+. <BR>最新版本:FCKeditor 2.0 <BR>语言环境:多国语言<BR>特性功能:所见所得,支持平台众多,支持XHTML 1.0,文本格式设置,常见的编辑,复制,粘贴,撤销,文件上传等功能<BR>授权方式:Open Source &amp; Free<BR>官方地址:http://www.fckeditor.net/<BR>下载地址:http://www.fckeditor.net/download/default.html<BR>演示:http://www.fckeditor.net/demo/default.html<BR>小节:FCKeditor的2.0版比1.6版有了许多的改进。首先是FCKeditor的文件结构更加清晰，<BR>可以更方便地将其部署在自己的系统中。另外2.0版开始支持了Firefox浏览器<BR><BR>2.WebEditor <BR>WebEditor系列文档控件，采用了ESS专业电子签名和电子盖章的技术，除继续支持手写签名，电子印章，痕迹保留外，<BR>该版本采用了我们强大的B/S通讯技术，能够自由的将服务器数据库<BR><BR>最新版本:WebEditor[V4.3.0.0 OCX版]<BR>语言环境:简体中文<BR>技术特性<BR>采用IE5.0以上版本内置的传输协议，通讯性能稳定，高效。 <BR>采用标准HTTP通讯端口80，使用方便，无需特别配置、安全性好、更无需特别设置防火墙。 <BR>采用插件技术，可以完全融入IE浏览器中，方便系统维护、方便用户操作。 <BR>采用自定义协议包进行数据的组装和分析，系统开放性好，便于二次开发。 <BR>采用了Com组件和JavaBean组件技术，很好的实现了跨平台系统，便于开发。 <BR>官方地址:http://www.dragongod.com/<BR>演示:http://www.dragongod.com/WebEditor/Demo.asp<BR>下载:http://www.dragongod.com/download/index.asp#item1<BR>小节:这个编辑器很具有中国特色的,但必须支持安装WebEditor插件，才能正常运行<BR>对于很多用户来说,,这个是无法接收的.<BR><BR>3.InnovaStudio WYSIWYG Editor在线编辑器WYSIWYG 英文：What You See Is What You Get(所见所得)<BR>一款基于web的WYSIWYG（所见即所得）的HTML编辑器，支持ASP, PHP, ASP.NET<BR>最新版本:InnovaStudio WYSIWYG Editor version 2.9 <BR>功能特性:快速加载,融合所有的HTML标签,全屏编辑模式,所见所得预览,拼写检查.<BR>特有的嵌入式WEB编辑.<BR>官方:http://www.innovastudio.com/<BR>演示:http://www.innovastudio.com/editor_tutorial.asp<BR>下载:官方好像都是收费的,,自己去网上搜索找找,好像有人已经做过有2.0的汉化版<BR><BR><BR>小节:采用DHTML, JavaScript 构件的WYSIWYG也有很多不足之处，由于代码放在远程服务器，<BR>一些控件事先没有下载到客户端，使得一些操作速度变慢，那些加入了ActiveX 控件的更慢，<BR>另外它无法在网页里直接调用CSS，所以在操作框里的界面效果和尺寸和实际上的界面有差距。<BR>有很多WYSIWYG对各种浏览器还不兼容,而且有的也要在IE的高版本下才能正常运行(此段出自老鬼的blog).<BR><BR><BR>4.eWebEditor在线编辑器<BR><BR>eWebEditor是基于网页的、所见即所得的在线HTML编辑器。她能够在网页上实现许多桌面编辑软件<BR>（如：Word）所具有的强大可视编辑功能；她是一个真正的绿色软件，不需要在计算机上安装<BR>任何的客户端软件；她的易用使得WEB开发人员只要一行代码即可完成调用。<BR>最新版本:Version 3.6 (ASP版、PHP版、JSP版、ASP.NET版)<BR>官方:http://www.ewebsoft.com/<BR>演示:http://ewebeditor.webasp.net/demo.asp<BR>下载:http://ewebeditor.webasp.net/download.asp<BR>功能特性:<BR>纯静态：大大提高了效率，最佳的融入您的产品； <BR>多样式支持：您只需要在您的整个网站中使用一个eWebEditor； <BR>自动提交：无需在提交按钮中加入脚本进行处理； <BR>自动获取远程文件：把别人服务器上的图片等文件自动传到自己的服务器； <BR>相对或绝对路径：完全摆脱了站点或系统或目录迁移而带来的路径问题； <BR>图形热点链接：始创能够在线编辑实现图形的热点链接功能； <BR>多种编辑模式：HTML代码模式、可视设计模式、纯文本模式、预览模式； <BR>大小自适应：可以按你调用的宽度和高度自适应编辑器的大小； <BR>内附文件上传功能：自带有从客户端直接上传到服务器端的功能； <BR>完善的接口：您可以通过接口实时控制或者获取编辑器的内容或者状态；<BR><BR><BR>小节:我个人比较推荐这个编辑器,为什么呢?除了他是国产的外,比较符合国人的习惯,另外也可能是众多编辑器,<BR>唯一还带后台管理模式,可以直接在后台管理编辑模式,<BR>另外接口定制非常容易,具体的自己可以去官方下载回来看看.<BR><BR><BR>5.htmlarea<BR>htmlarea.com is a directory of browser based wysiwyg editor components for use<BR>in CMS (content management software) and other web software. <BR>htmlArea是一款非常优秀的所见即所得编辑器,被使用在CMS系统或其他的WEB系统中..<BR>语言环境:多国语言版<BR>版本:version 3.0<BR>官方:http://www.htmlarea.com/<BR>演示:没找到,<BR>下载:官方没找到下载地址,我自己找了个3.0的版本 http://www.92key.com/mp3/chinahtml@_HTMLArea3.rar<BR>小节:这个编辑器调用也非常方便,<BR>已经广泛用在各种CMS和blog系统里,记得bo-blog,phpArticle里整合了这个编辑器.<BR><BR><BR>6.XStandard XHTML (Strict or 1.1) WYSIWYG Editor 也是所见所得,比起前几个,,它已经完全支持XHTML 1.1的严格验证,<BR>这个非常厉害 @@<BR>版本:XStandard Version 1.6.2<BR>官方:http://xstandard.com/<BR>下载:http://xstandard.com/download.asp<BR>演示:<BR>小节:这个编辑器,我也很少在国内的CMS,blog上见到有人使用,当然一个原因就是它是一个共享软件.<BR>XStandard Lite是免费的<BR>XStandard Pro是30天的试用期,而且价格还不菲$179<BR><BR><BR>7.Cross-Browser Rich Text Editor<BR>The cross-browser rich-text editor (RTE) is based on the designMode() functionality introduced in Internet Explorer 5, and implemented in Mozilla 1.3+ using the Mozilla Rich Text Editing API. The cross-browser rich-text editor now includes table support (as of 2/10/2005) as well as an option to generate xhtml-compliant code<BR><BR>官方:http://www.kevinroth.com<BR>演示:http://www.kevinroth.com/rte/demo.htm<BR>下载:http://www.kevinroth.com/rte/demo.htm<BR><BR>小节:这个编辑器更少看到有人用,可能是我自己孤陋寡闻..<BR><BR><BR>以上的几种编辑器总体都不错,有心去找找,网上还有不少不错的编辑器,,找到一个合适自己的就行了,,<BR>对于那些大型的CMS开发者,一个好的编辑器能省了使用者很多不必要的操作,<BR>而且使web代码更为规范,清晰<BR>以上内容均属于一家之言,如有纰漏,请指出,欢迎大家讨论..<BR>
<DIV class=tags style="DISPLAY: none"></DIV>]]></description>
</item><item>
<title><![CDATA[ASP.NET中上传文件到数据库]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yuanqingtao&amp;id=16778</link>
<author>yuanqingtao</author>
<pubDate>2006/7/20 16:43:55</pubDate>
<description><![CDATA[<P>介绍</P>
<P>为什么要将文件保存到数据库呢？理由很多，最直接的就是，将文件放入数据库以后，可以对文件进行更好的管理，特别是文本文件、图片等，如果不使用数据库，数量巨大的时候，很难做到有效的管理和区别。特别是需要作一些与文字密切相关的应用的时候，将文件全部放入数据库是最好的选择，对文字的处理、检索等，都可以直接利用数据库的一些功能，可以做到真正的有效管理。本文举例主要针对以文字为基础的文件，比如WORD等，但是，实际上对程序稍微修改，就可以上传所有文件类型。</P>
<P>数据表结构 </P>
<P>　　现在，我们来看存放文件的数据库表结构，这里，我们给出建立表的标准SQL语句： </P>
<P>　　CREATE TABLE tblBooksUpload </P>
<P>　　( </P>
<P>　　DocID int NOT NULL IDENTITY Primary Key , </P>
<P>　　DocTitle varchar (200) , </P>
<P>　　Doc image, </P>
<P>　　DocType varchar (50) , </P>
<P>　　Entrydate datetime Default GetDate() </P>
<P>　　) </P>
<P>　　以上的语句中，我们看到数据表tblBooksUpload包含五个字段： </P>
<P>　　字段DocID是表的关键字段，数据记录编号； </P>
<P>　　字段DocTitle是用来简单说明上传文件的，如果上传文本文件，我们一般将其设置为文件标题，图像、程序等，就设置为图像、程序的简单介绍； </P>
<P>　　字段Doc是用来存放我们上传的文件的字段，注意，这里将Doc字段的设置为Image类别； </P>
<P>　　字段DocType用来保存我们上传文件的类型，可能我们奇怪为什么要这个字段呢？其实，这个字段是很重要的，在用户从数据库取得数据的时候，这个字段将用来指定数据字段Doc中数据的类别，然后，浏览器根据这个字段来决定呈现给用户的数据； </P>
<P>　　字段DateTime是一个时间字段，我们可以看到该字段的值取自服务器的当前日期。 </P>
<P>　　下面是插入数据的存储过程，我们来看具体代码： </P>
<P>　　CREATE PROCEDURE uSP_BooksUploadFile </P>
<P>　　@Title varchar(200), </P>
<P>　　@Doc image, </P>
<P>　　@DocType varchar(4) </P>
<P>　　AS </P>
<P>　　INSERT tblBooksUpload(DocTitle,Doc,DocType) </P>
<P>　　VALUES (@Title,@Doc,@DocType) </P>
<P>　　GO </P>
<P>　　上传文件的步骤 </P>
<P>　　现在，我们先从文字上了解一下上传文件到数据库的具体步骤，再从代码上来实现： </P>
<P>　　首先，从客户端取得上传的文件，然后，我们将它放入数据流； </P>
<P>　　第二，服务器端读取数据流，然后将其保存到缓存； </P>
<P>　　第三，将缓存数据保存到数据库； </P>
<P>　　现在，我们一步步来看怎样在程序中实现这些功能。 </P>
<P>　　第一步 </P>
<P>　　当然，首先我们要实现用户在浏览器端自由选择文件，然后上传，这里用户选择文件，当然是要求标准的Windows方式，所以，我们在这里使用Form的File文件组件来给用户选择文件。注意，因为上传文件，所以，在Form的属性设置的时候，我们应该设置为：multipart/form-data，这样，才可以正确上传文件。 </P>
<P>第二步 </P>
<P>　　我们可以将上传的文件通过数据流保存到缓存，缓存的大小和文件的具体大小相同，我们可以使用以下的代码来取得文件的具体大小： </P>
<P>　　int intDocLen = txtFileContents.PostedFile.ContentLength; </P>
<P>　　然后，我们可以设置缓存的具体大小了： </P>
<P>　　byte[] Docbuffer = new byte[intDoclen]; </P>
<P>　　这样设置以后，我们可以将上传文件的内容保存到缓存中： </P>
<P>　　Stream objStream; </P>
<P>　　objStream = txtFileContents.PostedFile.InputStream; </P>
<P>　　objStream.Read(Docbuffer,0,intDocLen); </P>
<P>　　在以上代码中，读取缓存的时候，从缓存的0位置开始，直到整个文件的长度，其实，这就是整个文件或者整个缓存的大小。 </P>
<P>　　第三步 </P>
<P>　　现在我们需要做的就是将缓存数据保存到数据库，我们已经直到数据表结构，这样，我们通过编写简单的SQL语句就可以实现这个功能。在上面的内容中，我们编写了一个存储过程，在程序中，我们只要建立SqlCommand对象并且将这个存储过程传递给它，并设置<A href="mailto:“@Doc">“@Doc</A>”参数取得缓存数据就可以了： </P>
<P>　　cmdUploadDoc = new SqlCommand("uSP_BooksUploadFile",BooksConn); </P>
<P>　　cmdUploadDoc.CommandType = CommandType.StoredProcedure; </P>
<P>　　cmdUploadDoc.Parameters.Add("@Title ",SqlDbType.VarChar,200); </P>
<P>　　cmdUploadDoc.Parameters.Add("@Doc",SqlDbType.Image); </P>
<P>　　cmdUploadDoc.Parameters.Add("@DocType",SqlDbType.VarChar,4); </P>
<P>　　cmdUploadDoc.Parameters[0].Value = txtTitle.Text; </P>
<P>　　cmdUploadDoc.Parameters[1].Value = Docbuffer; </P>
<P>　　cmdUploadDoc.Parameters[2].Value = strDocType; </P>
<P>　　点击按钮处理代码 </P>
<P>　　private void btnSubmit_Click(object sender, System.EventArgs e) </P>
<P>　　{ </P>
<P>　　string strDocExt; </P>
<P>　　//strDocType用于保存上传文件的类型 </P>
<P>　　string strDocType; </P>
<P>　　//用于保存文件大小 </P>
<P>　　int intDocLen; </P>
<P>　　//Stream用于读取上传数据 </P>
<P>　　Stream objStream; </P>
<P>　　SqlConnection BooksConn; </P>
<P>　　SqlCommand cmdUploadDoc; </P>
<P>　　if(IsValid) </P>
<P>　　{ </P>
<P>　　if(txtFileContents.PostedFile != null) </P>
<P>　　{ </P>
<P>　　//文件类型 </P>
<P>　　strDocExt = CString.Right </P>
<P>　　(txtFileContents.PostedFile.FileName,4).ToLower(); </P>
<P>　　switch(strDocExt) </P>
<P>　{ </P>
<P>　　case ".doc": </P>
<P>　　strDocType = "doc"; </P>
<P>　　break; </P>
<P>　　case ".ppt": </P>
<P>　　strDocType = "ppt"; </P>
<P>　　break; </P>
<P>　　case ".htm": </P>
<P>　　strDocType = "htm"; </P>
<P>　　break; </P>
<P>　　case ".html": </P>
<P>　　strDocType = "htm"; </P>
<P>　　break; </P>
<P>　　case ".jpg": </P>
<P>　　strDocType = "jpg"; </P>
<P>　　break; </P>
<P>　　case ".gif": </P>
<P>　　strDocType = "gif"; </P>
<P>　　break; </P>
<P>　　default: </P>
<P>　　strDocType = "txt"; </P>
<P>　　break; </P>
<P>　　} </P>
<P>　　//上传文件具体内容 </P>
<P>　　intDocLen = txtFileContents.PostedFile.ContentLength; </P>
<P>　　byte[] Docbuffer = new byte[intDocLen]; </P>
<P>　　objStream = txtFileContents.PostedFile.InputStream; </P>
<P>　　//文件保存到缓存 </P>
<P>　　//缓存将保存到数据库 </P>
<P>　　objStream.Read(Docbuffer ,0,intDocLen); </P>
<P>　　BooksConn = new&nbsp; </P>
<P>　　SqlConnection("Server=Server;UID=sa;Database=Books"); </P>
<P>　　cmdUploadDoc = new&nbsp; </P>
<P>　　SqlCommand("uSP_BooksUploadFile",BooksConn); </P>
<P>　　cmdUploadDoc.CommandType = CommandType.StoredProcedure; </P>
<P>　　cmdUploadDoc.Parameters.Add("@Title ",SqlDbType.VarChar,200); </P>
<P>　　cmdUploadDoc.Parameters.Add("@Doc",SqlDbType.Image); </P>
<P>　　cmdUploadDoc.Parameters.Add("@DocType",SqlDbType.VarChar,4); </P>
<P>　　cmdUploadDoc.Parameters[0].Value = txtTitle.Text; </P>
<P>　　cmdUploadDoc.Parameters[1].Value = Docbuffer ; </P>
<P>　　cmdUploadDoc.Parameters[2].Value = strDocType; </P>
<P>　　BooksConn.Open(); </P>
<P>　　cmdUploadDoc.ExecuteNonQuery(); </P>
<P>　　BooksConn.Close(); </P>
<P>　　} </P>
<P>　　} </P>
<P>　　} </P>
<P>　　总结 </P>
<P>　　以上我们提到的方法，适合所有类型的文件，对以上代码作适当修改，我们就可以建立一个完全基于数据库的文件管理系统。</P>]]></description>
</item><item>
<title><![CDATA[小写转大写金额[SQL SERVER]]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yuanqingtao&amp;id=16541</link>
<author>yuanqingtao</author>
<pubDate>2006/7/12 14:23:10</pubDate>
<description><![CDATA[<P>CREATE PROCEDURE dbo.L2U <BR>( <BR>@n_LowerMoney numeric(15,2), <BR>@v_TransType int, <BR>@RET VARCHAR(200) output <BR>) <BR>&nbsp;AS <BR>&nbsp; <BR>Declare @v_LowerStr VARCHAR(200) -- 小写金额 <BR>Declare @v_UpperPart VARCHAR(200) <BR>Declare @v_UpperStr VARCHAR(200) -- 大写金额 <BR>Declare @i_I int </P>
<P>set nocount on </P>
<P>select @v_LowerStr = LTRIM(RTRIM(STR(@n_LowerMoney,20,2))) --四舍五入为指定的 <BR>精 <BR>度并删除数据左右空格 </P>
<P>select @i_I = 1 <BR>select @v_UpperStr = '' </P>
<P>while ( @i_I &lt;= len(@v_LowerStr)) <BR>begin <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select @v_UpperPart = case substring(@v_LowerStr,len(@v_LowerStr) - <BR>@i_I <BR>&nbsp;+ 1,1) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; '.' THEN&nbsp; '元' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; '0' THEN&nbsp; '零' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; '1' THEN&nbsp; '壹' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; '2' THEN&nbsp; '贰' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; '3' THEN&nbsp; '叁' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; '4' THEN&nbsp; '肆' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; '5' THEN&nbsp; '伍' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; '6' THEN&nbsp; '陆' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; '7' THEN&nbsp; '柒' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; '8' THEN&nbsp; '捌' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; '9' THEN&nbsp; '玖' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case @i_I <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; 1&nbsp; THEN&nbsp; '分' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; 2&nbsp; THEN&nbsp; '角' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; 3&nbsp; THEN&nbsp; '' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; 4&nbsp; THEN&nbsp; '' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; 5&nbsp; THEN&nbsp; '拾' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; 6&nbsp; THEN&nbsp; '佰' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; 7&nbsp; THEN&nbsp; '仟' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; 8&nbsp; THEN&nbsp; '万' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; 9&nbsp; THEN&nbsp; '拾' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; 10&nbsp; THEN&nbsp; '佰' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; 11&nbsp; THEN&nbsp; '仟' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; 12&nbsp; THEN&nbsp; '亿' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; 13&nbsp; THEN&nbsp; '拾' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; 14&nbsp; THEN&nbsp; '佰' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; 15&nbsp; THEN&nbsp; '仟' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; 16&nbsp; THEN&nbsp; '万' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ELSE '' <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END <BR>select @v_UpperStr = @v_UpperPart + @v_UpperStr <BR>select @i_I = @i_I + 1 <BR>end </P>
<P>--------print&nbsp; '//v_UpperStr <A href="mailto:='+@v_UpperStr">='+@v_UpperStr</A> +'//' </P>
<P>if ( @v_TransType=0 ) <BR>begin <BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零拾','零') <BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零佰','零') <BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零仟','零') <BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零零零','零') <BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零零','零') <BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零角零分','整') <BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零分','整') <BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零角','零') <BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零亿零万零元','亿元') <BR>select @v_UpperStr = REPLACE(@v_UpperStr,'亿零万零元','亿元') <BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零亿零万','亿') <BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零万零元','万元') <BR>select @v_UpperStr = REPLACE(@v_UpperStr,'万零元','万元') <BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零亿','亿') <BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零万','万') <BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零元','元') <BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零零','零') <BR>end </P>
<P>-- 对壹元以下的金额的处理 <BR>if ( substring(@v_UpperStr,1,1)='元' ) <BR>begin <BR>&nbsp;&nbsp;&nbsp;&nbsp; select @v_UpperStr = substring(@v_UpperStr,2,(len(@v_UpperStr) - 1)) <BR>end </P>
<P>if (substring(@v_UpperStr,1,1)= '零') <BR>begin <BR>&nbsp;&nbsp;&nbsp;&nbsp; select @v_UpperStr = substring(@v_UpperStr,2,(len(@v_UpperStr) - 1)) <BR>end </P>
<P>if (substring(@v_UpperStr,1,1)='角') <BR>begin <BR>&nbsp;&nbsp;&nbsp;&nbsp; select @v_UpperStr = substring(@v_UpperStr,2,(len(@v_UpperStr) - 1)) <BR>end </P>
<P>if ( substring(@v_UpperStr,1,1)='分') <BR>begin <BR>&nbsp;&nbsp;&nbsp;&nbsp; select @v_UpperStr = substring(@v_UpperStr,2,(len(@v_UpperStr) - 1)) <BR>end </P>
<P>if (substring(@v_UpperStr,1,1)='整') <BR>begin <BR>&nbsp;&nbsp;&nbsp;&nbsp; select @v_UpperStr = '零元整' <BR>end </P>
<P>select @ret=@v_UpperStr </P>
<P>GO </P>
<P>调用过程： </P>
<P>declare @ret varchar(200) </P>
<P>exec L2U 567983.897,1,@ret output </P>
<P>select @ret</P>]]></description>
</item><item>
<title><![CDATA[在SQL Server中保存和输出图片]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yuanqingtao&amp;id=16540</link>
<author>yuanqingtao</author>
<pubDate>2006/7/12 14:17:22</pubDate>
<description><![CDATA[介绍&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp; 有时候我们需要保存一些binary data进数据库。SQL Server提供一个叫做image的 <BR>特殊数据类型供我们保存binary data。Binary data可以是图片、文档等。在这篇文章 <BR>中我们将看到如何在SQL Server中保存和输出图片。 <BR><BR><BR>建表<BR><BR>&nbsp;&nbsp;&nbsp;为了试验这个例子你需要一个含有数据的table(你可以在现在的库中创建它，也可以 <BR>创建一个新的数据库)，下面是它的结构： <BR><BR><BR>Column Name <BR>Datatype <BR>Purpose <BR><BR>ID <BR>Integer <BR>identity column Primary key <BR><BR>IMGTITLE <BR>Varchar(50) <BR>Stores some user friendly title to identity the image <BR><BR>IMGTYPE <BR>Varchar(50) <BR>Stores image content type. This will be same as recognized content types of <BR>ASP.NET <BR><BR>IMGDATA <BR>Image <BR>Stores actual image or binary data. <BR><BR><BR>保存images进SQL Server数据库&nbsp;<BR><BR><BR>&nbsp;&nbsp;&nbsp; 为了保存图片到table你首先得从客户端上传它们到你的web服务器。你可以创建一 <BR>个web form，用TextBox得到图片的标题，用HTML File Server Control得到图片文件。 <BR>确信你设定了Form的encType属性为multipart/form-data。 <BR><BR>Stream imgdatastream = File1.PostedFile.InputStream; <BR><BR>int imgdatalen = File1.PostedFile.ContentLength; <BR><BR>string imgtype = File1.PostedFile.ContentType; <BR><BR>string imgtitle = TextBox1.Text; <BR><BR>byte[] imgdata = new byte[imgdatalen]; <BR><BR>int n = imgdatastream.Read(imgdata,0,imgdatalen); <BR><BR>string connstr= <BR><BR>((NameValueCollection)Context.GetConfig <BR><BR>("appSettings"))["connstr"]; <BR><BR>SqlConnection connection = new SqlConnection(connstr); <BR><BR>SqlCommand command = new SqlCommand <BR><BR>("INSERT INTO ImageStore(imgtitle,imgtype,imgdata) <BR><BR>VALUES ( @imgtitle, @imgtype,@imgdata )", connection ); <BR><BR>SqlParameter paramTitle = new SqlParameter <BR><BR>("@imgtitle", SqlDbType.VarChar,50 ); <BR><BR>paramTitle.Value = imgtitle; <BR><BR>command.Parameters.Add( paramTitle); <BR><BR>SqlParameter paramData = new SqlParameter <BR><BR>( "@imgdata", SqlDbType.Image ); <BR><BR>paramData.Value = imgdata; <BR><BR>command.Parameters.Add( paramData ); <BR><BR>SqlParameter paramType = new SqlParameter <BR><BR>( "@imgtype", SqlDbType.VarChar,50 ); <BR><BR>paramType.Value = imgtype; <BR><BR>command.Parameters.Add( paramType ); <BR><BR>connection.Open(); <BR><BR>int numRowsAffected = command.ExecuteNonQuery(); <BR><BR>connection.Close(); <BR><BR><BR>从数据库中输出图片&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp; 现在让我们从数据库中取出我们刚刚保存的图片，在这儿，我们将直接将图片输出 <BR>至浏览器。你也可以将它保存为一个文件或做任何你想做的。 <BR><BR><BR>private void Page_Load(object sender, System.EventArgs e) <BR><BR>{ <BR><BR>string imgid =Request.QueryString["imgid"]; <BR><BR>string connstr=((NameValueCollection) <BR><BR>Context.GetConfig("appSettings"))["connstr"]; <BR><BR>string sql="SELECT imgdata, imgtype FROM ImageStore WHERE id = " <BR><BR>+ imgid; <BR><BR>SqlConnection connection = new SqlConnection(connstr); <BR><BR>SqlCommand command = new SqlCommand(sql, connection); <BR><BR>connection.Open(); <BR><BR>SqlDataReader dr = command.ExecuteReader(); <BR><BR>if(dr.Read()) <BR><BR>{ <BR><BR>&nbsp; &nbsp; &nbsp; &nbsp; Response.ContentType = dr["imgtype"].ToString(); <BR><BR>&nbsp; &nbsp; &nbsp; &nbsp; Response.BinaryWrite( (byte[]) dr["imgdata"] ); <BR><BR>} <BR><BR>connection.Close(); <BR><BR>}&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp; 在上面的代码中我们使用了一个已经打开的数据库，通过datareader选择images。 <BR>接着用Response.BinaryWrite代替Response.Write来显示image文件。]]></description>
</item><item>
<title><![CDATA[在ASP.net中使用OWC绘制统计图表]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yuanqingtao&amp;id=16497</link>
<author>yuanqingtao</author>
<pubDate>2006/7/11 17:12:07</pubDate>
<description><![CDATA[<P>在使用ASP.net进行Web开发中，经常需要将各种统计数据以图形的方式显示出来。如果仅仅是柱状图，可以采用画表格或者将某种特定颜色的GIF图像缩放宽度和高度的方法来表示，许多投票程序多采用这种方法。但如果要求输出结果是饼状图或者是连续的波形图，就有些困难了。本文特向大家介绍使用OWC图形组件轻松实现绘制统计图表的方法。 </P>
<P>　　OWC（Microsoft Office Web Components）是 Microsoft Office 使用的数据绑定 ActiveX 控件，用于向 Web 页添加图表功能。OWC支持Microsoft Excel 2000中大部分的二维图表(如折线图、柱形图、股价图等)和极坐标图表(如饼图和雷达图)，并支持组合图表，如两轴线-柱图，数据表会随同图表发布，图表随着数据的变化而改变。OWC能将处理结果做为标准GIF输出并下载到浏览器中显示。 </P>
<P>　　首先，使用ADODB.Recordset读出数据集合，并与OWC组件进行数据绑定： </P>
<P>Dim owcChartSpace As OWC.ChartSpace = New OWC.ChartSpace()<BR>Dim owcChart As OWC.WCChart = owcChartSpace.Charts.Add<BR>Dim ConnADO As New ADODB.Connection()<BR>Dim RecordsetADO As New ADODB.Recordset()<BR>Dim connectionString As String<BR>connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" &amp; _<BR>"Data Source=" &amp; Server.MapPath("Grades.mdb")<BR>ConnADO.Open(connectionString)</P>
<P>RecordsetADO.ActiveConnection = ConnADO<BR>RecordsetADO.CursorType = ADODB.CursorTypeEnum.adOpenStatic<BR>RecordsetADO.CursorLocation = ADODB.CursorLocationEnum.adUseClient<BR>Dim strSQL As String<BR>strSQL = "Select city, month, temperature From test order by city,ids"<BR>RecordsetADO.Open(strSQL, ConnADO)<BR>owcChartSpace.DataSource = RecordsetADO</P>
<P>&nbsp;</P>
<P>　　然后，指定OWC的显示类型： </P>
<P>owcChart.Type = OWC.ChartChartTypeEnum.chChartTypeSmoothLineMarkers</P>
<P>&nbsp;</P>
<P>　　在运行时向OWC中输入数据有多种方法。所有这些方法都要用到 SetData 方法来真正将数据写入 Chart 组件，因此将详细介绍此方法。SetData 方法应用于 WCChart、WCErrorBars 和 WCSeries 对象并能向这三种对象输入数据。 </P>
<P>　　SetData 方法有三个参数：Dimension、DataSourceIndex 和 DataReference。Dimension 参数引用图表中被填充数据的一部分。可用的维度常数为 SeriesNames、Categories、Values、YValues、XValues、OpenValues、CloseValues、HighValues、LowValues、BubbleValues、RValues 和 ThetaValues。这些常数每一种都引用了图表的一部分；例如，SeriesNames 常数引用了每个序列名，OpenValues 和 CloseValues 常数引用股票图的开盘价和收盘价等等。每个常数都是作为诸如 chDimSeriesNames、chDimCategories、chDimValues等窗体中的枚举常数而传递给该方法的。 </P>
<P>　　这里，我们使用SetData 方法给OWC赋值： </P>
<P>owcChart.SetData(OWC.ChartDimensionsEnum.chDimSeriesNames, 0, "city")<BR>Dim owcSeries As OWC.WCSeries<BR>For Each owcSeries In owcChart.SeriesCollection<BR>owcSeries.SetData(OWC.ChartDimensionsEnum.chDimCategories, 0, "month")<BR>owcSeries.SetData(OWC.ChartDimensionsEnum.chDimValues, 0, "temperature")<BR>Next</P>
<P>&nbsp;</P>
<P>　　最后，将OWC处理结果转换成Gif图象输出到浏览器中显示： </P>
<P>Randomize()<BR>Dim nfilenameSuffix As Integer<BR>Dim sfilenamesuffix As String<BR>nfilenameSuffix = 100000 * Rnd()<BR>sfilenamesuffix = System.Convert.ToString(nfilenameSuffix)<BR>owcChartSpace.ExportPicture(MapPath("owc/price_") <BR>　　　　+ sfilenamesuffix + ".gif", "gif", 800, 600)<BR>Image1.ImageUrl = "owc/price_" + sfilenamesuffix + ".gif"</P>
<P><BR>　　如果变换OWC的显示类型，即修改一下owcChart.Type，使之变成： </P>
<P>owcChart.Type = OWC.ChartChartTypeEnum.chChartTypeColumnClustered</P>
<P>　　<BR>　　在ASP.net中使用OWC可以帮助我们快速构造统计图表，而且由于OWC生成的结果是Gif图象，可以兼容客户端所有版本的浏览器，适用范围很广。本程序在Windows 2000 server、IIS5.0和IE6.0环境下运行成功。</P>]]></description>
</item><item>
<title><![CDATA[Javascript实现窗口最大化的严格定义]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yuanqingtao&amp;id=16141</link>
<author>yuanqingtao</author>
<pubDate>2006/6/30 16:32:14</pubDate>
<description><![CDATA[<P>&lt;SCRIPT LANGUAGE="JavaScript"&gt;<BR>&lt;!-- <BR>var str = "left=0,screenX=0,top=0,screenY=0,fullscreen=yes";//fullscreen=yes只对IE有效！ </P>
<P>if (window.screen) {<BR>var ah = screen.availHeight - 30;<BR>var aw = screen.availWidth - 10;<BR>str += ",height=" + ah;<BR>str += ",innerHeight=" + ah;<BR>str += ",width=" + aw;<BR>str += ",innerWidth=" + aw;<BR>} else {<BR>str += ",resizable"; // 对于不支持screen属性的浏览器，可以手工进行最大化。 manually<BR>}</P>
<P>function launchFull(url, name) {<BR>return window.open(url, name, str);<BR>}</P>
<P>var win = launchFull("", "full");</P>
<P>// --&gt;<BR>&lt;/SCRIPT&gt;<BR></P>]]></description>
</item><item>
<title><![CDATA[asp.net中md5加密码的方法]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yuanqingtao&amp;id=16020</link>
<author>yuanqingtao</author>
<pubDate>2006/6/29 17:03:34</pubDate>
<description><![CDATA[<DIV style="COLOR: #333333">&lt;%@ Page Language="C#" ContentType="text/html"%&gt; <BR>&lt;%@ Import Namespace="System"%&gt; <BR>&lt;script language="C#" runat="server"&gt; <BR>void Page_Load(Object sender,EventArgs e){ <BR>//获取要加密的字段，并转化为Byte[]数组 <BR>byte[] data=System.Text.Encoding.Unicode.GetBytes(source.Text.ToCharArray()); <BR>//建立加密服务 <BR>System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); <BR>//加密Byte[]数组 <BR>byte[] result= md5.ComputeHash(data); <BR>//将加密后的数组转化为字段 <BR>string sResult=System.Text.Encoding.Unicode.GetString(result); <BR>//显示出来 <BR>sha1_1.Text="MD5普通加密："+sResult.ToString()+"&lt;br/&gt;"; <BR>//作为密码方式加密 <BR>string EnPswdStr=System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(source.Text.ToString(),"MD5"); <BR>//显示出来 <BR>sha1_2.Text="MD5密码加密："+EnPswdStr+"&lt;br/&gt;"; <BR>} <BR>&lt;/script&gt; <BR>&lt;html&gt; <BR>&lt;head&gt; <BR>&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt; <BR>&lt;title&gt;测试&lt;/title&gt; <BR>&lt;/head&gt; <BR>&lt;body&gt; <BR>&lt;h3&gt;SHA1加密&lt;/h3&gt; <BR>&lt;form runat="server"&gt; <BR>&lt;asp:label id="sha1_1" runat="server"&gt;&lt;/asp:label&gt; <BR>&lt;asp:label id="sha1_2" runat="server"&gt;&lt;/asp:label&gt; <BR>&lt;asp:textbox ID="source" runat="server" TextMode="SingleLine" Text="test" AutoPostBack="true" /&gt; <BR>（回车） <BR>&lt;/form&gt; <BR>&lt;/body&gt; <BR>&lt;/html&gt; <BR></DIV>]]></description>
</item><item>
<title><![CDATA[如何读取Excel表格中的数据]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yuanqingtao&amp;id=14204</link>
<author>yuanqingtao</author>
<pubDate>2006/5/9 11:00:06</pubDate>
<description><![CDATA[<P>源代码</P>
<P>&lt;% @Import Namespace="System.Data" %&gt;<BR>&lt;% @Import Namespace="System.Data.OleDb" %&gt;<BR>&lt;HTML&gt;<BR>&nbsp;&lt;HEAD&gt;<BR>&nbsp; &lt;title&gt;如何读取Excel表格中的数据&lt;/title&gt;<BR>&nbsp; &lt;script language="C#" runat="server"&gt;<BR>&nbsp; <BR>&nbsp;&nbsp; void SubmitBtn_Click(object sender, System.EventArgs e)<BR>&nbsp;&nbsp; { <BR>&nbsp;&nbsp;&nbsp; // 获取Excep文件的完整路径<BR>&nbsp;&nbsp;&nbsp; string source = File1.Value;</P>
<P>&nbsp;&nbsp;&nbsp; string ConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + source + ";Extended Properties=Excel 8.0";<BR>&nbsp;&nbsp;&nbsp; string query = "SELECT * FROM [Sheet1$]";</P>
<P>&nbsp;&nbsp;&nbsp; OleDbCommand oleCommand = new OleDbCommand(query, new OleDbConnection(ConnStr));<BR>&nbsp;&nbsp;&nbsp; OleDbDataAdapter oleAdapter = new OleDbDataAdapter(oleCommand);<BR>&nbsp;&nbsp;&nbsp; DataSet myDataSet = new DataSet();</P>
<P>&nbsp;&nbsp;&nbsp; // 将 Excel 的[Sheet1]表内容填充到 DataSet 对象<BR>&nbsp;&nbsp;&nbsp; oleAdapter.Fill(myDataSet, "[Sheet1$]");</P>
<P>&nbsp;&nbsp;&nbsp; // 数据绑定<BR>&nbsp;&nbsp;&nbsp; DataGrid1.DataSource = myDataSet;<BR>&nbsp;&nbsp;&nbsp; DataGrid1.DataMember = "[Sheet1$]";<BR>&nbsp;&nbsp;&nbsp; DataGrid1.DataBind();<BR>&nbsp;&nbsp; }<BR>&nbsp; <BR>&nbsp; &lt;/script&gt;<BR>&nbsp;&lt;/HEAD&gt;<BR>&nbsp;&lt;body&gt;<BR>&nbsp; &lt;form id="Form1" method="post" runat="server"&gt;<BR>&nbsp;&nbsp; &lt;H3&gt;如何读取Excel表格中的数据&lt;/H3&gt;<BR>&nbsp;&nbsp; 请选择Excel表格：&lt;BR&gt;<BR>&nbsp;&nbsp; &lt;INPUT type="file" id="File1" name="File1" runat="server" size="26"&gt;&lt;br&gt;<BR>&nbsp;&nbsp; &lt;asp:Button <BR>&nbsp;&nbsp;&nbsp; id="SubmitBtn" <BR>&nbsp;&nbsp;&nbsp; runat="server" <BR>&nbsp;&nbsp;&nbsp; Text="开始显示" <BR>&nbsp;&nbsp;&nbsp; OnClick="SubmitBtn_Click"&gt;<BR>&nbsp;&nbsp; &lt;/asp:Button&gt;&lt;br&gt;<BR>&nbsp;&nbsp; &lt;br&gt;<BR>&nbsp;&nbsp; &lt;asp:DataGrid id="DataGrid1" runat="server"&gt;&lt;/asp:DataGrid&gt;<BR>&nbsp; &lt;/form&gt;<BR>&nbsp;&lt;/body&gt;<BR>&lt;/HTML&gt;</P>]]></description>
</item><item>
<title><![CDATA[ACCESS改为SQL需要注意哪几个地方]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yuanqingtao&amp;id=13952</link>
<author>yuanqingtao</author>
<pubDate>2006/4/29 8:16:01</pubDate>
<description><![CDATA[<P>结合自己工作的经验写成：</P>
<P>数据库导入以后，自动增加字段需要重写，所有的数字类型需要增加长度，最好用decimal。</P>
<P>所有的默认值都丢失了。主要是数字类型和日期类型。</P>
<P>所有now()，time()，date()要改成getdate()。</P>
<P>所有datediff('d', time1, time2)要改成datediff(day, time1, time2)</P>
<P>有可能一些true/false类型不能使用，要变为1/0。</P>
<P>备注类型要通过cast(column as varchar)来使用。</P>
<P>CursorType要改成1,也就是打开数据库时要给出第一个数字参数为1，否则记录可能显示不完整。</P>
<P>isnull(rowname)要改成rowname = null</P>
<P>ACCESS的数据库中的自动编号类型在转化时，sql server并没有将它设为自动编号型，我们需在SQL创建语句中加上identity，表示自动编号！</P>
<P>转化时，跟日期有关的字段，SQL SERVER默认为smalldatetime型，我们最好将它变为datetime型，因为datetime型的范围比smalldatetime型大。有时用smalldatetime型时，转化失败，而用datetime型时，转化成功。</P>
<P>对此两种数据库进行操作的sql语句不全相同，例如：在对ACCESS数据库进行删除纪录时用："delete * from user where id=10",而对SQL SERVER数据库进行删除是用："delete user where id=10".</P>
<P>日期函数不相同，在对ACCESS数据库处理中，可用date()、time()等函数，但对SQL SERVER数据库处理中，只能用datediff,dateadd等函数，而不能用date()、time()等函数。</P>
<P>在对ACCESS数据库处理中,sql语句中直接可以用一些VB的函数，像cstr()函数，而对SQL SERVER数据库处理中，却不能用。</P>]]></description>
</item><item>
<title><![CDATA[SQL Server 2000 触发器的使用实例]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yuanqingtao&amp;id=12641</link>
<author>yuanqingtao</author>
<pubDate>2006/3/17 11:54:17</pubDate>
<description><![CDATA[<SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">/*<BR>建立虚拟测试环境，包含：表[卷烟库存表]，表[卷烟销售表]。<BR>请大家注意跟踪这两个表的数据，体会触发器到底执行了什么业务逻辑，对数据有什么影响。<BR>为了能更清晰的表述触发器的作用，表结构存在数据冗余，且不符合第三范式，这里特此说明。<BR>*/<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; BACKGROUND: #ccffcc; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">USE Master<BR>GO</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma"><o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; BACKGROUND: #ccffcc; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'U' AND NAME = '卷烟库存表')<BR>&nbsp;&nbsp;&nbsp; DROP TABLE 卷烟库存表<BR>GO<BR>IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'U' AND NAME = '卷烟销售表')<BR>&nbsp;&nbsp;&nbsp; DROP TABLE 卷烟销售表<BR>GO</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma"><o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">--业务规则：销售金额 = 销售数量 * 销售单价 业务规则。<o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; BACKGROUND: #ccffcc; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">CREATE TABLE 卷烟销售表<BR>(<BR>&nbsp;&nbsp;&nbsp; 卷烟品牌&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR(40) PRIMARY KEY NOT NULL,<BR>&nbsp;&nbsp;&nbsp; 购货商&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR(40) NULL,<BR>&nbsp;&nbsp;&nbsp; 销售数量&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INT NULL,<BR>&nbsp;&nbsp;&nbsp; 销售单价&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MONEY NULL,<BR>&nbsp;&nbsp;&nbsp; 销售金额&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MONEY NULL<BR>)<BR>GO</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma"><o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">--业务规则：库存金额 = 库存数量 * 库存单价 业务规则。<o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; BACKGROUND: #ccffcc; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">CREATE TABLE 卷烟库存表<BR>(<BR>&nbsp;&nbsp;&nbsp; 卷烟品牌&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR(40) PRIMARY KEY NOT NULL,<BR>&nbsp;&nbsp;&nbsp; 库存数量&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INT NULL,<BR>&nbsp;&nbsp;&nbsp; 库存单价&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MONEY NULL,<BR>&nbsp;&nbsp;&nbsp; 库存金额&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MONEY NULL<BR>)<BR>GO</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma"><o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">--创建触发器，示例1<o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">/*<BR>创建触发器[T_INSERT_卷烟库存表]，这个触发器较简单。<BR>说明：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每当[卷烟库存表]发生 INSERT 动作，则引发该触发器。<BR>触发器功能：&nbsp;&nbsp;&nbsp; 强制执行业务规则，保证插入的数据中，库存金额 = 库存数量 * 库存单价。<BR>注意：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [INSERTED]、[DELETED]为系统表，不可创建、修改、删除，但可以调用。<BR>重要：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这两个系统表的结构同插入数据的表的结构。<BR>*/<BR><SPAN style="BACKGROUND: #ccffff">IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'TR' AND NAME = 'T_INSERT_卷烟库存表')<BR>&nbsp;&nbsp;&nbsp; DROP TRIGGER T_INSERT_卷烟库存表<BR>GO</SPAN><o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; BACKGROUND: #ccffff; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">CREATE TRIGGER T_INSERT_卷烟库存表<BR>ON 卷烟库存表<BR>FOR INSERT<BR>AS<BR>--提交事务处理<BR>BEGIN TRANSACTION<BR>&nbsp;&nbsp;&nbsp; --强制执行下列语句，保证业务规则<BR>&nbsp;&nbsp;&nbsp; UPDATE 卷烟库存表<BR>&nbsp;&nbsp;&nbsp; SET 库存金额 = 库存数量 * 库存单价<BR>&nbsp;&nbsp;&nbsp; WHERE 卷烟品牌 IN (SELECT 卷烟品牌 from INSERTED)<BR>COMMIT TRANSACTION<BR>GO</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma"><o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">/*&nbsp; <BR>针对[卷烟库存表]，插入测试数据：<BR>注意，第一条数据（红塔山新势力）中的数据符合业务规则，<BR>第二条数据（红塔山人为峰）中，[库存金额]空，不符合业务规则，<BR>第三条数据（云南映像）中，[库存金额]不等于[库存数量]乘以[库存单价]，不符合业务规则。<BR>第四条数据库存数量为0。<BR>请注意在插入数据后，检查[卷烟库存表]中的数据是否 库存金额 = 库存数量 * 库存单价。<BR>*/<o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; BACKGROUND: #ccffcc; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">INSERT INTO 卷烟库存表(卷烟品牌,库存数量,库存单价,库存金额)<BR>&nbsp;&nbsp;&nbsp; SELECT '红塔山新势力',100,12,1200 UNION ALL<BR>&nbsp;&nbsp;&nbsp; SELECT '红塔山人为峰',100,22,NULL UNION ALL<BR>&nbsp;&nbsp;&nbsp; SELECT '云南映像',100,60,500&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UNION ALL<BR>&nbsp;&nbsp;&nbsp; SELECT '玉溪',0,30,0<BR>GO</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma"><o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">--查询数据<o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; BACKGROUND: #ccffcc; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">SELECT * FROM 卷烟库存表<BR>GO</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma"><BR>/*<o:p></o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">结果集<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">RecordId&nbsp; 卷烟品牌&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 库存数量&nbsp; 库存单价&nbsp; 库存金额<BR>--------&nbsp; ------------&nbsp; --------&nbsp; -------&nbsp; ---------<BR>1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 红塔山新势力&nbsp;&nbsp; 100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12.0000&nbsp; 1200.0000<BR>2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 红塔山人为峰&nbsp;&nbsp; 100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 22.0000&nbsp; 2200.0000<BR>3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 云南映像&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 60.0000&nbsp; 6000.0000<BR>4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 玉溪&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30.0000&nbsp; .0000<o:p></o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">（所影响的行数为<SPAN lang=EN-US> 4 行）<o:p></o:p></SPAN></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">*/<o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma"><BR>--触发器示例2<o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">/*<BR>创建触发器[T_INSERT_卷烟销售表]，该触发器较复杂。<BR>说明:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每当[卷烟库存表]发生 INSERT 动作，则引发该触发器。<BR>触发器功能：&nbsp;&nbsp;&nbsp; 实现业务规则。<BR>业务规则:&nbsp;&nbsp; 如果销售的卷烟品牌不存在库存或者库存为零，则返回错误。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 否则则自动减少[卷烟库存表]中对应品牌卷烟的库存数量和库存金额。<BR>*/<BR><SPAN style="BACKGROUND: #ccffff">IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'TR' AND NAME = 'T_INSERT_卷烟销售表')<BR>&nbsp;&nbsp;&nbsp; DROP TRIGGER T_INSERT_卷烟销售表<BR>GO</SPAN><o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; BACKGROUND: #ccffff; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">CREATE TRIGGER T_INSERT_卷烟销售表<BR>ON 卷烟销售表<BR>FOR INSERT<BR>AS<BR>BEGIN TRANSACTION<BR>&nbsp;&nbsp;&nbsp; --检查数据的合法性：销售的卷烟是否有库存，或者库存是否大于零<BR>&nbsp;&nbsp;&nbsp; IF NOT EXISTS (<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT 库存数量<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM 卷烟库存表<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE 卷烟品牌 IN (SELECT 卷烟品牌 FROM INSERTED)<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BEGIN<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --返回错误提示<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RAISERROR('错误！该卷烟不存在库存，不能销售。',16,1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --回滚事务<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ROLLBACK<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma"><o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; BACKGROUND: #ccffff; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">&nbsp;&nbsp;&nbsp; IF EXISTS (<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT 库存数量<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM 卷烟库存表<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE 卷烟品牌 IN (SELECT 卷烟品牌 FROM INSERTED) AND<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 库存数量 &lt;= 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BEGIN<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --返回错误提示<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RAISERROR('错误！该卷烟库存小于等于0，不能销售。',16,1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --回滚事务<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ROLLBACK<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; --对合法的数据进行处理</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma"><o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; BACKGROUND: #ccffff; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">&nbsp;&nbsp;&nbsp; --强制执行下列语句，保证业务规则<BR>&nbsp;&nbsp;&nbsp; UPDATE 卷烟销售表<BR>&nbsp;&nbsp;&nbsp; SET 销售金额 = 销售数量 * 销售单价<BR>&nbsp;&nbsp;&nbsp; WHERE 卷烟品牌 IN (SELECT 卷烟品牌 FROM INSERTED)</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma"><o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; BACKGROUND: #ccffff; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">&nbsp;&nbsp;&nbsp; DECLARE @卷烟品牌 VARCHAR(40)<BR>&nbsp;&nbsp;&nbsp; SET @卷烟品牌 = (SELECT 卷烟品牌 FROM INSERTED)</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma"><o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; BACKGROUND: #ccffff; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">&nbsp;&nbsp;&nbsp; DECLARE @销售数量 MONEY<BR>&nbsp;&nbsp;&nbsp; SET @销售数量 = (SELECT 销售数量 FROM INSERTED)</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma"><o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; BACKGROUND: #ccffff; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">&nbsp;&nbsp;&nbsp; UPDATE 卷烟库存表<BR>&nbsp;&nbsp;&nbsp; SET 库存数量 = 库存数量 - @销售数量,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 库存金额 = (库存数量 - @销售数量)*库存单价<BR>&nbsp;&nbsp;&nbsp; WHERE 卷烟品牌 = @卷烟品牌<BR>COMMIT TRANSACTION<BR>GO</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma"><o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">--请大家自行跟踪[卷烟库存表]和[卷烟销售表]的数据变化。<BR>--针对[卷烟销售表]，插入第一条测试数据，该数据是正常的。<o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; BACKGROUND: #ccffcc; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)<BR>&nbsp;&nbsp;&nbsp; SELECT '红塔山新势力','某购货商',10,12,1200<BR>GO</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma"><o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">--针对[卷烟销售表]，插入第二条测试数据，该数据 销售金额 不等于 销售单价 * 销售数量。<BR>--触发器将自动更正数据，使 销售金额 等于 销售单价 * 销售数量。<o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; BACKGROUND: #ccffcc; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)<BR>&nbsp;&nbsp;&nbsp; SELECT '红塔山人为峰','某购货商',10,22,2000<BR>GO</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma"><o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">--针对[卷烟销售表]，插入第三条测试数据，该数据中的卷烟品牌在 卷烟库存表中找不到对应。<BR>--触发器将报错。<o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; BACKGROUND: #ccffcc; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)<BR>&nbsp;&nbsp;&nbsp; SELECT '红河V8','某购货商',10,60,600<BR>GO</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma"><o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">/*<BR>结果集<BR>服务器: 消息 50000，级别 16，状态 1，过程 T_INSERT_卷烟销售表，行 15<BR>错误！该卷烟不存在库存，不能销售。<BR>*/<o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">--针对[卷烟销售表]，插入第三条测试数据，该数据中的卷烟品牌在 卷烟库存表中库存为0。<BR>--触发器将报错。<o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; BACKGROUND: #ccffcc; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)<BR>&nbsp;&nbsp;&nbsp; SELECT '玉溪','某购货商',10,30,300<BR>GO</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma"><o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">/*<BR>结果集<BR>服务器: 消息 50000，级别 16，状态 1，过程 T_INSERT_卷烟销售表，行 29<BR>错误！该卷烟库存小于等于0，不能销售。<BR>*/<BR>--查询数据<BR><SPAN style="BACKGROUND: #ccffcc">SELECT * FROM 卷烟库存表</SPAN><o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; BACKGROUND: #ccffcc; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">SELECT * FROM 卷烟销售表<BR>GO</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma"><o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">/*<BR>补充：<BR>1、本示例主要通过一个简单的业务规则实现来进行触发器使用的说明，具体的要根据需要灵活处理；<BR>2、关于触发器要理解并运用好 INSERTED ，DELETED 两个系统表；<BR>3、本示例创建的触发器都是 FOR INSERT ,具体的语法可参考：<o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">&nbsp;&nbsp;&nbsp; Trigger语法<o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">&nbsp;&nbsp;&nbsp; CREATE TRIGGER trigger_name <BR>&nbsp;&nbsp;&nbsp; ON { table | view } <BR>&nbsp;&nbsp;&nbsp; [ WITH ENCRYPTION ] --用于加密触发器<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ WITH APPEND ]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ NOT FOR REPLICATION ]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AS<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ { IF UPDATE ( column )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ { AND | OR } UPDATE ( column ) ]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ ...n ]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { comparison_operator } column_bitmask [ ...n ]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } ] <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sql_statement [ ...n ] <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <BR>&nbsp;&nbsp;&nbsp; } <o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">4、关于触发器，还应该注意<BR>(1)、DELETE 触发器不能捕获 TRUNCATE TABLE 语句。<BR>(2)、触发器中不允许以下 Transact-SQL 语句：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ALTER DATABASE CREATE DATABASE DISK INIT <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DISK RESIZE DROP DATABASE LOAD DATABASE <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOAD LOG RECONFIGURE RESTORE DATABASE <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RESTORE LOG <BR>(3)、触发器最多可以嵌套 32 层。<o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">*/<o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">--修改触发器<BR>--实质上，是将 CREATE TRIGGER ... 修改为 ALTER TRIGGER ...即可。<o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">--删除触发器<BR>DROP TRIGGER xxx<BR>GO<o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">--删除测试环境<BR>DROP TABLE 卷烟库存表<BR>GO<BR>DROP TABLE 卷烟销售表<BR>GO<BR>DROP TRIGGER T_INSERT_卷烟库存表<BR>GO<BR>DROP TRIGGER T_INSERT_卷烟销售表<BR>GO<BR>##################################################################<BR></SPAN><SPAN style="FONT-SIZE: 10.5pt; BACKGROUND: #cc99ff; COLOR: black; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Tahoma">触发器的基础知识和例子<SPAN lang=EN-US><BR></SPAN></SPAN><SPAN style="FONT-SIZE: 10.5pt; BACKGROUND: #ccffcc; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">：<SPAN lang=EN-US>create trigger tr_name<BR>&nbsp;&nbsp; on table/view<BR>{for | after | instead of } [update][,][insert][,][delete]<BR>[with encryption]<BR>as {batch | if update (col_name) [{and|or} update (col_name)] }</SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma"><BR><BR>说明：<BR><SPAN style="BACKGROUND: #ff99cc">1</SPAN>&nbsp; tr_name ：触发器名称<BR><SPAN style="BACKGROUND: #ff99cc">2</SPAN> on table/view ：触发器所作用的表。一个触发器只能作用于一个表<BR><SPAN style="BACKGROUND: #ff99cc">3</SPAN> for 和after ：同义<BR><SPAN style="BACKGROUND: #ff99cc">4</SPAN> after 与instead of :sql 2000新增项目afrer 与 instead of 的区别<BR><SPAN style="BACKGROUND: #ccffcc">After</SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>在触发事件发生以后才被激活,只可以建立在表上&nbsp;<BR><SPAN style="BACKGROUND: #ccffcc">Instead of</SPAN><BR>代替了相应的触发事件而被执行,既可以建立在表上也可以建立在视图上<BR><SPAN style="BACKGROUND: #ff99cc">5</SPAN> insert、update、delete：激活触发器的三种操作，可以同时执行，也可选其一<BR><SPAN style="BACKGROUND: #ff99cc">6</SPAN> if update (col_name)：表明所作的操作对指定列是否有影响，有影响，则激活触发器。此外，因为delete 操作只对行有影响，<BR>所以如果使用delete操作就不能用这条语句了(虽然使用也不出错，但是不能激活触发器，没意义)。<BR><SPAN style="BACKGROUND: #ff99cc">7</SPAN> 触发器执行时用到的两个特殊表：deleted ,inserted<BR><SPAN style="BACKGROUND: #ccffcc">&nbsp;deleted 和inserted</SPAN> 可以说是一种特殊的临时表，是在进行激活触发器时由系统自动生成的，其结构与触发器作用的表结构是一<BR>样的，只是存放 的数据有差异。<o:p></o:p></SPAN></P>
<P><SPAN style="FONT-SIZE: 10.5pt; BACKGROUND: #ff99cc; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma">续</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-size: 13.0pt; mso-bidi-font-family: Tahoma"><BR>下面表格说明deleted 与inserted 数据的差异<BR><SPAN style="BACKGROUND: #ccffcc">deleted 与inserted 数据的差异</SPAN><BR><SPAN style="BACKGROUND: #ccffcc">Inserted</SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>存放进行insert和update 操作后的数据&nbsp;<BR><SPAN style="BACKGROUND: #ccffcc">Deleted</SPAN><BR>存放进行delete 和update操作前的数据<BR>注意：update 操作相当于先进行delete 再进行insert ,所以在进行update操作时，修改前的数据拷贝一条到deleted 表中，修改后<BR>的数据在存到触发器作用的表的同时，也同时生成一条拷贝到insered表中<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt">&nbsp;<o:p></o:p></SPAN></P>]]></description>
</item><item>
<title><![CDATA[asp.net上传文件小结]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yuanqingtao&amp;id=12167</link>
<author>yuanqingtao</author>
<pubDate>2006/3/3 9:56:58</pubDate>
<description><![CDATA[&lt;input id="loFile" type="file" runat="server"&gt;<BR>&lt;form method="post" enctype="multipart/form-data" runat="server"&gt;<BR>&lt;/form&gt;<BR><BR>1.获得上传文件的名称：（关键是PostedFile类的应用）<BR>&nbsp;使用Path类中的GetFileName方法，具体如下：<BR>lstrFileName = loFile.PostedFile.FileName<BR>　　' 注： loFile.PostedFile.FileName 返回的是通过文件对话框选择的文件名，<BR>　　这之中包含了文件的目录信息<BR>lstrFileName = Path.GetFileName ( lstrFileName )<BR>　　' 去掉目录信息，返回文件名称<BR><BR>2. 判断上传目录是否存在，不存在就建立<BR>　　建立目录要使用到Directory类中的 CreateDirectory 方法，判断目录是否存在要用到 Directory 类中的Exists方法。具体如下：<BR><BR>If ( not Directory.Exists( lstrFileFolder ) ) Then<BR>　Directory.CreateDirectory ( lstrFileFolder )<BR>End If<BR>　' 注：lstrFileFolder是用户填入的目录名称，或者是缺省的目录名称<BR><BR>3.上传选定文件到服务器上<BR>　　在前面工作都已经完成以后，就可以上传文件了，上传文件相对比较简单，就用下面2行语句就可以完成上传工作。<BR><BR>lstrFileNamePath = lstrFileFolder &amp; lstrFileName<BR>　' 得到上传目录及文件名称<BR>loFile.PostedFile.SaveAs ( lstrFileNamePath )<BR>　'上传文件到服务器<BR><BR>4.获得并显示上传文件的属性<BR>FileName.Text = lstrFileName<BR>　' 获得文件名称<BR>FileType.Text = loFile.PostedFile.ContentType<BR>　'获得文件类型<BR>FileLength.Text = cStr ( loFile.PostedFile.ContentLength )<BR>　'获得文件长度<BR>FileUploadForm.visible = false<BR>AnswerMsg.visible = true<BR>　'显示上传文件属性<BR><BR><BR>&lt;% @ Import Namespace=" System.IO " %&gt;<BR>&lt;html&gt;<BR>&lt;BODY&gt;<BR>&lt;SCRIPT LANGUAGE="VB" RUNAT="SERVER"&gt;<BR>　Sub UploadFile_Clicked (Sender as Object, e as EventArgs)<BR>　　Dim lstrFileName as string<BR>　　Dim lstrFileNamePath as string<BR>　　Dim lstrFileFolder as string<BR>　　' 如果上传目录为空，就使用" c:\ "作为缺省上传目录<BR>　　' 获得上传到服务器的目录名称<BR>　　if dir.value &lt;&gt; "" then<BR>　　　lstrFileFolder = dir.value<BR>　　else<BR>　　　lstrFileFolder = "c:\"<BR>　　end if<BR><BR>　　' 获得文件名称<BR>　　lstrFileName = loFile.PostedFile.FileName<BR>　　　' 注： loFile.PostedFile.FileName 返回的是<BR>　　　通过文件对话框选择的文件名，这之中包含了文件的目录信息<BR>　　lstrFileName = Path.GetFileName ( lstrFileName )<BR>　　　' 去掉目录信息，返回文件名称<BR><BR>　　' 判断上传目录是否存在，不存在就建立<BR>　　If ( not Directory.Exists ( lstrFileFolder ) ) Then<BR>　　　Directory.CreateDirectory ( lstrFileFolder )<BR>　　End If<BR><BR>　　　'上传文件到服务器<BR>　　lstrFileNamePath = lstrFileFolder &amp; lstrFileName<BR>　　　' 得到上传目录及文件名称<BR>　　loFile.PostedFile.SaveAs ( lstrFileNamePath )<BR><BR>　　　' 获得并显示上传文件的属性<BR>　　FileName.Text = lstrFileName<BR>　　　' 获得文件名称<BR>　　FileType.Text = loFile.PostedFile.ContentType<BR>　　　' 获得文件类型<BR>　　FileLength.Text = cStr ( loFile.PostedFile.ContentLength )<BR>　　　' 获得文件长度<BR>　　FileUploadForm.visible = false<BR>　　AnswerMsg.visible = true<BR>　　　' 显示上传文件属性<BR>　　End sub<BR>&lt;/SCRIPT&gt;<BR>&lt;ASP:panel id="FileUploadForm" visible="true" runat="server"&gt;<BR>&lt;form method="post" enctype="multipart/form-data" runat="server"&gt;<BR>　&lt;h1&gt; 欢迎使用ASP.NET页面实现文件上传 &lt;/h1&gt;<BR>　　请选择上传到服务器的文件名称：<BR>　&lt;input id="loFile" type="file" runat="server"&gt; &lt;br&gt;<BR>　　请输入上传到服务器的目录名称：<BR>　&lt;input id="dir" type="text" runat="server"&gt; &lt;br&gt;<BR>　&lt;input type="submit" value="开始上传" OnServerClick="UploadFile_Clicked" runat="server"&gt;<BR>　&lt;br&gt;<BR>&lt;/form&gt;<BR>&lt;/ASP:panel&gt;<BR><BR>&lt;ASP:panel id="AnswerMsg" visible="false" runat="server"&gt;<BR>　谢谢使用ASP.NET页面实现文件上传 &lt;br&gt;<BR>　成功上传 &lt;ASP:label id="FileName" runat="server" /&gt; &lt;br&gt;<BR>　文件大小 &lt;ASP:label id="FileLength" runat="server" /&gt; 字节 &lt;br&gt; 　文件类型 &lt;ASP:label id="FileType " runat="server" /&gt; &lt;br&gt;<BR>&lt;/ASP:panel&gt;<BR>&lt;/BODY&gt;<BR>&lt;/HTML&gt;<BR>]]></description>
</item>
</channel>
</rss>