Board logo

标题: [技术讨论] 漫话vbs学习感悟 [打印本页]

作者: myzam    时间: 2011-3-27 11:13     标题: 漫话vbs学习感悟

vbs与com的关系:
     vbs是扳机,com 是你的子弹,没有com的vbs脚本,就是一把没有子弹的枪。
     枪没了子弹,杀人时,你就只有赤膊上阵了,当然赤膊上阵也是可以杀人的。



     扣动你的扳机,射出一幅美丽的图像
                 再次刷新网页,显示动画




欢迎跟帖。贴出你,我,他---
在vbs学习中的感悟,
对与错并不重要,重要的是大家在一起讨论,学习。
没有错误,何来正确!
在学习中一起成长,
在讨论中一起丰富我们对vbs的理解。
贴出你的感悟------------
让大家一起分享!

让我们一起从不同的角度去欣赏美丽的vbs吧
特别提醒:脚本尽量采用短脚本。代码不求完美,只要能说明一个问题就可以了。
=================================================

1--结束vbs的while...wend循环。
  1. t=1
  2. j=0
  3. while t<2
  4.   wscript.echo j&"--", t
  5.   j=j+1
  6.   if j>10 then t=2
  7. wend
复制代码
-------------------------------
vbs入门级教程 http://www.bathome.net/thread-11581-1-1.html
--------------------------
msgbox 的返回值 http://www.bathome.net/thread-11613-1-1.html
----------------------------
密码输入
http://www.bathome.net/thread-11595-1-1.html
------------------------------------------
cmd中输入的长脚本 http://www.bathome.net/thread-11589-1-1.html
-----------------------------------------
mshta标准用法
http://www.bathome.net/thread-11516-1-1.html

-----------------------------
创建环境变量
http://www.bathome.net/thread-11514-1-1.html


------------------------------
getref函数
http://www.bathome.net/thread-11484-1-1.html

------------------------------
连续截取文本 http://www.bathome.net/thread-11469-1-1.html
----------------------------------------------
关于regsvr32--- 脚本部件问题
http://www.bathome.net/thread-11386-1-1.html
------------------------------------------------------------------
创建vbs中的类:http://www.bathome.net/thread-11318-1-1.html
---------------------------------------------------------------------------
cmd的全屏问题
http://www.bathome.net/thread-11289-1-1.html

---------------------------------
正则表达式
http://www.bathome.net/thread-11223-1-1.html
------------------------------------------------
系统是winxp吗?
http://www.bathome.net/thread-11179-1-1.html
---------------------------------------------------
读出文本
http://www.bathome.net/thread-11165-1-1.html
----------------------------
wsh对象模型:一张经常看的图片,黄色的代表对象是有属性生成,这样的对象是集合对象。
访问的方法如下:
for  each  i in  set
  ......
next
=========================================
转帖 值得一看的vbs文章
http://www.hongkejidi.com/wz/ShowClass.asp?ClassID=337&page=1


大力推荐给玩家一个com:shotgraph画图组件,下面的test1.gif就是有这个组件做的,刷新网页,你可以看到运动的圆
语法请参考第2页下方。跳转到第2页http://www.bathome.net/thread-11615-2-1.html

下载http://aspxhome.com/article/uplo ... 200792612313895.rar
作者: myzam    时间: 2011-3-27 11:46

本帖最后由 myzam 于 2011-3-27 12:01 编辑

vbs问题:
1. 如何在cmd中画出抛物线y=x*x   ?
2.如何从字符串 str="2011-11-30 12:50:33"
中提取年,月,日,时,分,秒?
3. 如何把数字 num=12345转化为 num=$12345.0000 ?
4.如果a.txt,b.txt被打开,如何聚焦到指定的文件如a.txt?
5. 已知字符串 str="z:\gg\ff\my.extend", 如何从str中提取:z,z:,my,extend,my.extend?
6.已知 p1="z:\gg\ff",p2="\rr\uu.txt",如何合并路径p1与p2?
作者: myzam    时间: 2011-3-27 12:24

本帖最后由 myzam 于 2011-3-27 17:12 编辑

2# myzam
假设f盘有一文件叫 20.txt其属性设置为只读且存档,
现在要用vbs显示这两个属性。方法如下:
  1. set fso=createobject("scripting.filesystemobject")
  2. set file=fso.getfile("f:\20.txt")
  3. t=file.attributes
  4. set dic=createobject("scripting.dictionary")
  5. dic.add 0,"normal"
  6. dic.add 1,"readonly"
  7. dic.add 2,"hide"
  8. dic.add 4,"system"
  9. dic.add 32,"achive"
  10. wscript.echo dic(t and 32),dic(t mod 32)
复制代码
---------------------------------
返回驱动器的文件系统
  1. set fso=createobject("scripting.filesystemobject")
  2. set file=fso.drives
  3. on error resume next ‘由于有光驱的存在,没有这句将返回驱动器没有准备好这一结果。
  4. for each i in file
  5. wscript.echo i.filesystem
  6. next
复制代码
resume单词的英文意思:假定,认定。
如假定x是大于2的数:Resuming x is greater than 2

题外话:如果是学数学的 用过专业的数学软件maple,那里面就有大量的 resume这个单词的用法。

--------------------------------------------------------------------------------------------
显示桌面文件有哪些?有多少。
  1. set obj=createobject("wscript.shell")
  2. set fso=createobject("scripting.filesystemobject")
  3. path=obj.specialfolders("desktop")  ‘获取桌面路径,可以直接输入
  4. set folder=fso.getfolder(path)
  5. set files=folder.files
  6. for each i in files
  7.     wscript.echo i.name ’获取文件名
  8. next
  9.    wscript.echo files.count  ‘获取文件数量
复制代码

作者: hbwazxf    时间: 2011-3-27 12:55

新手学习一下吧。
作者: wc726842270    时间: 2011-3-27 14:37

和MSGBOX一样INPUTBOX的按钮也是很有意思的,确定和取消也代表了不同的含意(当然最好是有个变量接住这个输入值)
作者: myzam    时间: 2011-3-27 14:57

5# wc726842270
对的。
刚开始接触msgbox时,点确定和取消按钮,效果都一样。
于是就想怎么做才可以让点击确定去执行a代码,点击取消就去执行b代码。
于是就 想 msgbox在运行后是不是有一个放回值。
这样就设计了下面的测试代码:
  1. t=msgbox("hello world",vbyesno,"我的测试")
  2.       wscript.echo t
复制代码
发现有放回值是6,7.

另外,bat中有很强的字符串截取功能。在vbs中也有,只是功能不那么强大。
下面几个fso对象的方法就具有字符串截取功能
getbasename
getdrivename
getextensionname
getfilename
getparentfoldername

p="k:\gg\uu\ha.abc"
set fso=createobject("scripting.filesystemobject")
wscript.echo fso.getdrivename(p)

-------------------------------------------显示驱动器类型
  1. set oshell=createobject("wscript.shell")
  2. set fso=createobject("scripting.filesystemobject")
  3. set drives=fso.drives
  4. for each i in drives
  5.   
  6.   if (i.drivetype mod 4)=0 then wscript.echo i&"It is CD"
  7.   if (i.drivetype mod 4)=1 then wscript.echo i&"It is flappy"
  8.   if (i.drivetype mod 4)=2 then wscript.echo i&"It is hard-disk"
  9. next
  10.    wscript.echo "Drives-count="&drives.count
复制代码
运行结果如下图
作者: Batcher    时间: 2011-3-27 22:04

6# myzam


你学VBS的时候没有找几个教程看看?
这些基础知识在Script56.chm里面讲的很清楚啊。

Windows脚本技术(script56.chm)
http://bbs.bathome.net/thread-1985-1-1.html
作者: myzam    时间: 2011-3-27 22:21

本帖最后由 myzam 于 2011-3-27 22:26 编辑

7# Batcher
怎么可能没看呢。我都看了几遍了。不知道为啥,参加vbs讨论的人那么少。我就是想把人气弄起来再说。有了人啥都好办嘛。
作者: wc726842270    时间: 2011-3-27 22:39

本帖最后由 wc726842270 于 2011-3-27 22:42 编辑

说的非常好,个人认为VBS是一个“高不成低不就”的脚本语言。刚接触不容易学,也没有像DOS一样走过一个时代(也就是后来的CMD。虽说不是,但是也是相通的)而VBS对语法,和英语还有更高的技术要有足够的了解(比如COM技术等)。虽然原因很多,但最直观的就是它不是主流。不过要是想学习技术的学习一下会是一个不错的选择。给大家一篇文章
http://www.jb51.net/article/14772.htm
作者: myzam    时间: 2011-3-28 18:57

本帖最后由 myzam 于 2011-3-28 19:23 编辑

9# wc726842270


     我在大学里面学的是basic ,fortran。那时我没电脑。我印象最深刻的是我算一个数值积分,程序运行了近4分钟才算完,那时的电脑是TR-80机,真的好慢,还有一次我参加抽签考试,看的是编程打到三角,平时我都会的,到哪参加考试时紧张,直到时间要用完时才编号,好险。后来工作了有电脑了。弄了点dos。之后弄了点vb。后来别人告诉我,要牛逼就去学vc,而学delphi是
明智的选择,于是又去弄了弄delphi。结果是什么都没学好。在后来由去弄了下汇编。乱七八糟的弄了一大堆,到头来我是什么都没学好。
其实,说穿了还是工作中用不了多少。工作中能常用的就记的住。我在想,大学里面学的basic到现在我都还能记住,
更本原因是工作中,我有时要用来数值计算。其它的老是忘记,所以学好查手册我觉得是最好的办法。vbs越看越觉得是无底洞。
我都在想这个世界上有没有对vbs精通的人存在了。vbs的语法和20年前的basic语言差不多。但是是现在的vbs功能太强大,几乎是无所不能。
现在想想其实学什么语言都差不多。现在的高级语言都有共性。人的精力是有限的,专心一门语言就可以了。如果感觉精力旺盛,可以再去了解
一下其它的语言。
学编程其实也是不误正业,我觉得就和有的人喜欢打牌是一个道理。呵呵。
  现在的高级语言分为B,C,D(BASIC,C,DELPHI),这个世界上有没有人精通这三门语言的?真的不知道有没有。
微软的vb(vbs)是比较易懂的一门语言,感谢微软,它带着我们走进了现代的面向对象的编程。
所真的bat真的很古老,它不是面向对象的。如果只学bat那就意味着永远都停留在古代。我不是说古代就不好。
学bat之于,也学一点现代一点的高级语言。我想这是一种不错的选择。
作者: wc726842270    时间: 2011-3-28 21:13

本帖最后由 wc726842270 于 2011-3-28 21:32 编辑

用你的一句话来说"对与错并不重要"
重要的是为什么会是这个结果,也就是说过程,其实跟1L基本一个意思
我问个小问题
常见BAT通过MSHTA来调用VBS。那么能不能在VBS中用MSHTA来调用BAT呢?先思考一下,要说出为什么!!(思考交给别人)
PS:关于MSHTA的材料可不全啊,不过可以从宿主的角度着手
作者: Batcher    时间: 2011-3-28 21:48

10# myzam


还有就是,不能老在Windows里面转圈,还得了解一下UNIX里面的Shell、Perl等
^_^
作者: myzam    时间: 2011-3-28 21:55

11# wc726842270


我觉得可以。mshta是hta的宿主,专门用来解释hta文件的。而hta文件里面是可以嵌入脚本的,可以嵌入脚本就可以调用run(或exec)方法。而调用run就可以执行
bat文件。但我没试过。
作者: myzam    时间: 2011-3-28 22:25

13# myzam


        今天上网看写或读取剪切板的内容。方法真是很多。但看来看去,思路大致都是利用复制,粘贴去获得,写读剪切板的内容。真的是万紫千红。
有一种方法我觉得是不错的,一个网页文件里面可以嵌入文本框对象,而有文本框对象就可以进行复制与粘贴。这就隐含了读写剪切板。
     于是打开注册表在根键HKCU(这里注册的是classes=类),这是一个与类有关的键。网页中的按钮啊,文本框啊常这么写:
<form>
   <input type='text'/>
     <input type='button'/>
</form>
这里就在网页里面嵌入了一个窗体对象。所一我在HKCU键里搜索,就发现了一大堆与窗体有关的类,
如:forms.form.1,-forms.textbox.1,比照网页文件里面的窗体与文本框的关系,我想窗体是父类,文本框是子类,于是参考了其它的脚本,写下了下面的脚本,测试成功,离开了网页,文本框对象我们可以创建,但是你看不到。只有依附于网页等,你才可以显示出文本框!所以文本框的属性和网页中的是一样的。因为,你更本调用的就是网页中的那个文本框。
发到这里分享。
  1. set oform=createobject("forms.form.1") '创建窗体对象
  2. set  otextbox=oform.add("forms.textbox.1") '创建文本框对象
  3. otextbox.value="hello world"  '赋值给文本框
  4. otextbox.selstart=0
  5. otextbox.sellength=8 '以上两句是选择文本框里面的内容
  6. '如果你是用的是多行文本框,就加这样一句:otextbox.multiline=true
  7. otextbox.copy
  8. wscript.echo otextbox.textlength '显示一下我选中的文本长度。
复制代码
------------------------------------
读取剪切板内容 Clipboard Text  read by Textbox
  1. set oform=createobject("forms.form.1")
  2. set otextbox=oform.add("forms.textbox.1")
  3. otextbox.paste
  4. wscript.echo otextbox.value
  5. 'value属性和text属性的效果一样
复制代码
在理解上面的代码上,你想象中在进行html文件的编写。你在编写一个窗体,窗体里面有嵌入了一个文本框,这样代码就好理解了。


到这里我才发现原来网页中用的那些对象原来可以按照这样的方法脱离开网页而生存下去。
我还得测试一下能不能直接使用文本框对象,也就是说不创建窗体对象可以不?网页中是可以的。但是网页中是不是在隐含的使用文本框对象呢?
测试好了在贴。
经测试,发现不行,这说明如下的网友代码:
<input type='text'/>
虽然没有显示的创建窗体,但是html是在后台默默的创建了窗体的。


一点思考:不一定对。我猜测窗体com是按类似于如下的方式组织的:


<package>
   <component id='forms.form.1'>
       <public>
                      <method  name='add'>
              ...
       </public>
       <script language=vbs>
                  set  add=createcomponent("forms.textbox.1")

      </script>
   </component>
   <component id='forms.textbox.1'>
        <public>
             <method id='paste/'/>
              <method id='copy'/>

       </public>
        <script language=vbs>
              function paste
                     ....
             end function
               function copy
                     ....
             end function

         </script>
        ......
   </component>
     <component id='button'>
        ......
   </component>

</package>


---------------------------------------
所以vbs才会这样调用com

set  form=createobject("forms.fomr.1")
set textbox=form.add("forms.textbox.1")
。。。。。。
这样的嵌套结构就决定了,一定要先创建窗体form,然后才能调用textbox对象。

-------------------------------------------------
一个有趣的问题:
   set form=createobject("forms.form.1")
set textbox=form.add("forms.image.1")
textbox.picture=loadpicture("f:\sunset.jpg")
for i=1 to 5
   wscript.echo hex(textbox.picture)
next
按上面的方式运行结果是数字,这些数字代表什么呢?
---------------------------
我突然来了点灵感:
显示的数字是8位16进制,我认为前4为为line,后4位为column。代表图片的行列大小。
对于loadpicture的认识,有了一点认识。就是可以用来获取图片的高宽。
如:
  set t=loadpicture("f:\sunset.jpg")
   wscript.echo t.width,t.height
这个函数居然可以创建对象。好奇怪。但是这样得到的值和真实的快高不一样,图片是800x600,于是把获得的数字t.width除以800,得到了26.45875,
修改上面的程序
   set t=loadpicture("f:\sunset.jpg")
   wscript.echo int(t.width/26.45875),int(t.height/26.45875)
再运行,发现基本是
800x600,于是信心大增,把int该为round函数,居然对上号。于是有拿第二张图片测试,这次通过了。但是t返回的数值代表什么呢?还在思考中。
当然在网页中有图片框时这个函数的用法很简单,用法如名。
作者: myzam    时间: 2011-3-30 18:23

郁闷。
为啥学bat的人那么多。学vbs的那么少。
vbs无论从入门,到功能都比bat强很多。郁闷。
我想是不是因为vbs里面的英文太多了。
作者: myzam    时间: 2011-3-30 20:00

今天上网逛,看到一个vbscom非常好。这是一个画图组件。生成的图像非常漂亮。
组件名叫shotgraph,下载地此为http://aspxhome.com/article/uplo ... 200792612313895.rar
给出一个生成gif的程序:
  1. set obj=CreateObject("shotgraph.image")
  2. size=201
  3. 'Calling the CreateImage method
  4. obj.CreateImage size,size,4
  5. '4是指图像中要用到4种颜色,颜色按编号引用
  6. obj.SetColor 0,255,255,255
  7. obj.SetColor 1,0,0,0
  8. obj.SetColor 2,255,108,0
  9. obj.SetColor 3,0,0,204
  10. '0~3代表颜色编号,后面的三个数字是rgh数。
  11. obj.SetBgColor 0
  12. obj.FillRect 0,0,size-1,size-1
  13. '画正方形,填充色是编号为0的颜色,后面的是对角线坐标。程序有错误,颜色编号只能从1开始,不能用0,后面的语句和这句一样的道理。
  14. obj.SetDrawColor 1
  15. 'Drawing the line
  16. obj.Line size-1,0,0,size-1
  17. 'Color 2 will be used for filling
  18. obj.SetBgColor 2
  19. 'Draw the big circle
  20. obj.Ellipse 5,5,size-6,size-6
  21. 'Color 2 will be used for filling
  22. obj.SetBgColor 3
  23. 'Draw the small circle
  24. obj.Ellipse 5,(size-5)/4,size/2,(size-5)*3/4
  25. 'Create the image file named test.gif
  26. obj.GifImage 0,1,"test.gif" '图片可以保持为一切windows图片,包括swf文件也可以。
复制代码
上面的代码生成的图片如下:有了这个画图组件,利用vbs画函数的图像的问题就解决了。利用这个com去生成图片,用windows图片查看器去
不断的显示图片,真的在vbs里面画图很完美了。shotgraph很小,小到安装时你都不没感觉。

最大的遗憾是图片的长宽受限制。其它的都非常好。


===========上面的语句有问题==下面的为正确的===========================
  1. set obj=createobject("shotgraph.image")
  2. obj.createimage 300,200,3
  3. obj.setcolor 1,0,255,0
  4. obj.setcolor 2,0,0,255
  5. obj.setbgcolor 1
  6. obj.fillrect 0,0,300,200
  7. obj.setdrawcolor 2
  8. obj.line 0,0,200,200
  9. obj.gifimage 0,1,"test.gif"
复制代码
==================================运动的直线
  1. set oshell=createobject("wscript.shell")
  2. set obj=createobject("shotgraph.image")
  3. obj.createimage 300,200,3
  4. obj.setcolor 1,0,255,0
  5. for i=0 to 20
  6. obj.setdrawcolor 1
  7. obj.line i,i,400-i*i,i*i  '改为 obj.line i,i,i,i 就是点
  8. obj.gifimage 0,1,"test.gif"
  9. wscript.sleep 500
  10. oshell.run "test.gif"
  11. next
复制代码
要申请金山快盘的 请点我的邀请链接,我也好到金上去弄2分。谢谢支持哦。
要请链接为&nbsp;&nbsp;&nbsp;&nbsp; 推荐金山快盘,5.6G的免费空间,可以存照片、文档等,可以自动同步快盘里的文件,在哪都能编辑使用,不怕硬盘损坏,系统崩溃,电脑丢失,病毒破坏等,文件永不丢失的网络硬盘!非常喜欢! &nbsp;&nbsp;&nbsp;&nbsp; 点击下面的的地址立即试用:   http://k.wps.cn/register/?invite=dbkvsx
=====================动态的画抛物线, 特别注意,支持小数步长,如step 0.05
  1. set oshell=createobject("wscript.shell")
  2. set obj=createobject("shotgraph.image")
  3. obj.createimage 300,200,3
  4. obj.setcolor 1,0,255,0
  5. for i=0 to 100
  6. obj.setbgcolor 1
  7. obj.fillrect i,i^2*0.02,i+1,i^2*0.02+1
  8. obj.gifimage 0,1,"test.gif"
  9. wscript.sleep 500
  10. oshell.run "test.gif"
  11. next
复制代码

作者: wc726842270    时间: 2011-4-1 00:24

本帖最后由 wc726842270 于 2011-4-1 00:27 编辑

一始看以为颜色的模式是CMYK,但细看却不是。不过问一下题外话,RGH这个H代表什么啊
PS:“'4是指图像中要用到4种颜色,颜色按编号引用”有些不理解,它不是按照RGB的规则么?为什么要指定4种呢。RGB再通过色阶不可以达到一般的要求么(有点跑题了,呵呵),运行了一下很有意思。
作者: myzam    时间: 2011-4-1 17:39

17# wc726842270
我那天有时间时,我更新一下,给出点简单清楚的实例。
对了,你问的4色,是指你的图片中要用的4色。
rgb的r是red,g是green,b是blue。
作者: myzam    时间: 2011-4-1 18:59

本帖最后由 myzam 于 2011-4-1 21:06 编辑

shotgraph图像组件的用法,
   
1--create image object
   set oimg=createobject("shotgraph.image")
2--image对象的方法
   createimage 方法:   oimg.createimage(size1,size2,num)
   设置要创建的图片文件的尺寸大小为size1 x size2,size1<=320,size<=240.
   大于这个数的按这320或240计算。
   num设置要创建的图片文件里要使用的颜色个数,这里是颜色个数可以认为的指定,如你的图片要用5个颜色就指定5个,这5个颜色是你配置好的颜色,不要错误的理解为是5个基本的色素。每个颜色通个方法
   setcolor定义。
  
   gifimage 方法:oimg.gifimage bgcolor,forcolor,path
   path表示创建的图片文件要存放的路径。保存的图片格式是一切windows图片格式包含swf也可以。
   bgcolor背景色,取逻辑值,这里是比较宽松的
   非0等价于true,0等价于false。
   如:set oimg=createobject("shotgraph.image")
           t=oimg.createimage (200,200,3)

           oimg.setcolor 0,255,255,200

           oimg.gifimage 1,0,"test.gif"
           背景是通过setcolor 0来定义的,必须是0
           要应用背景gifimage必须是是1,*
           要屏蔽背景色必须是0,*。你也可以直接使用 vb常数true,false。
    绘制线方法: line x,y,x+h,y+k
                 x,y代表对角线起点坐标,h,k代表长,宽。
    绘制点的方法:line x,y,x,y
    绘制椭圆和园的方法:ellipse x,y,x+h,y+k
    绘制正方形的方法:fillrect x,y,x+h,y+k
    填色的方法
    绘制线,点时,设置颜色的方法是 setdrawcolor num
    num 为setcolor定义的颜色编号。
    绘制圆,椭圆时,设置颜色的方法是 setbgcolor num
    num的含义同上。
    setcolor定义颜色的方法:setcolor num ,red,green,blue
    num为颜色编号,0分配给图片背景使用。1,2,...分配给点,线,椭圆,圆,长方形使用。

  既然我说的是方法,请注意方法的用法是 oimg.method. 它们不是函数是方法!
  如果你要去返回值就这么用 t=oimg.method () .
  再次提醒注意:未注册版本生成的图片大小为320x240,能不能突破这个限制,网上说注册就行,
经过我试验不必要,你只要把图片保存为swf格式就可以了。
看实例:
  1. set oshell=createobject("wscript.shell")
  2. set oimg=createobject("shotgraph.image")
  3. x=200
  4. y=200
  5. oimg.createimage x,y,8
  6. oimg.setcolor 0,255,100,12
  7. oimg.setcolor 1,125,0,0
  8. oimg.setdrawcolor 1
  9. oimg.line 50,50,100,100
  10. oimg.gifimage 1,0,"test.swf"
  11. oshell.run "test.swf",3
复制代码
利用循环语句把步长设置为小数,将得到高精度图像。
作者: wc726842270    时间: 2011-4-1 20:49

本帖最后由 wc726842270 于 2011-4-1 20:58 编辑

是好,这样也可以画出函数图像了。不过中心点好像有些不太好掌握
PS:1L的“转帖 值得一看的vbs文章”很给力。不过现在正看脚本之家的“VBS揭密".在此也推荐一下吧(不过主要是HTML的)
http://www.jb51.net/books/16580.html
作者: myzam    时间: 2011-4-1 21:00

本帖最后由 myzam 于 2011-4-1 21:08 编辑

20# wc726842270

好掌握啊。比如你的图片大小是200x100,你的图片是矩形框。从左上角开始的坐标为0,0,左下角的坐标就是200,100.
我把你推荐的书下来看看。
作者: wc726842270    时间: 2011-4-1 21:11

不好意思,刚才没转过来弯来,有点心事,
作者: myzam    时间: 2011-4-1 21:41

本帖最后由 myzam 于 2011-4-2 22:00 编辑

估计是。呵呵。
对了,这个控件还可以创建文字
  1. set oshell=createobject("wscript.shell")
  2. set oimg=createobject("shotgraph.image")
  3. x=200
  4. y=200
  5. oimg.createimage x,y,8
  6. oimg.setcolor 0,255,100,12
  7. oimg.setcolor 1,125,0,0
  8. oimg.setcolor 2,255,255,200
  9. oimg.fontsmoothing=2
  10. oimg.textout 50,100,"hello world hello world"
  11. oimg.gifimage 1,95,"test.swf"
  12. oshell.run "test.swf",3
复制代码
创建字体画的语法(保存为swf,这样可以突破尺寸大小为320x240的限制):
  1. set oshell=createobject("wscript.shell")
  2. set oimg=createobject("shotgraph.image")
  3. x=800
  4. y=600
  5. oimg.createimage x,y,8
  6. oimg.setcolor 0,255,100,12
  7. oimg.setcolor 1,125,0,0
  8. oimg.setcolor 2,255,255,200
  9. oimg.createfont "Arial",50,72,100,false,false,false,false
  10. oimg.textout 10,20,"hello"
  11. oimg.gifimage 10,0,"test.swf"
  12. oshell.run "test.swf",3
复制代码
语法:
1--设置字体属性 ,line取逻辑值,这里的逻辑值比较松,true为非0,false为0
oimg.createfont "font-family",charactorset,size,rotation,line1,line2,line3,line4
2--字体位置:
oimg.textout  leftposition,topposition,"text,text can be chinese"
3--字体颜色
   由oimg.setcolor num,red,green,blue 定义颜色
   由oimg.settextcolor num 把编号为num的颜色应用到字体上。
完整的语法为:createFont sFamily, nCharset, nHeight, nAngle, bBold, bItalic, bUnderline, bStrikeOut [,bUnicode]
作者: powerbat    时间: 2011-4-1 22:26

虽然我没学过任何编程语言,但我也会写不太复杂的vbs脚本,觉得一本《Windows脚本技术(script56.chm)》足以走遍天下。虽然对VB/VBScript语言怎么不理解,但根据手册里中的例子照葫芦画瓢也能解决大多数常见问题。关键是对手册里函数的功能和用法还有例子要熟,要经常看。不懂没关系,关键是要知道一个函数能实现什么功能、怎么使用、要什么参数、得到什么结果。

所以在我看来getref、脚本部件什么的,都是无意义的东西。可能是很强大,但对我来说几乎用不上,估计大多数人也一样,而且创建脚本部件并好像不能产生新的用法,还是对基本vbs功能的组合。我觉得了解wsf文件也比这些强。

至于楼主鼓吹的hta,本质就是HTML,要想学hta当今世界上几乎没有资料,为什么?因为学HTML、CSS、DOM就行了,不要本末倒置。只是hta用于本地运行,由mshta解释,并多了一个<hta>标签及相应功能。

要了解其他COM对象,最好的手册是MSDN

----以上内容多数是向zqz0012005版主学习的,他是我的vbs入门老师
作者: myzam    时间: 2011-4-1 22:40

本帖最后由 myzam 于 2011-4-1 22:43 编辑

你说的一点都没错。
对我来说我就只关心画函数图象。其它的对我用处都不大。我看其它的只是了解它吧了。说真的要说方便把vb一架就解决问题了。用不了这么繁杂的。
html那东东是看不会的。建个网站,在用中才能学会。
vbs手册就算看一万次,还是学不会vbs的,除非去用。
就像看不会数学一样,你就算把数学书看破了,也学不会数学的,不是吗?学数学我们都知道要学习数学的各个分支,如果对数学分析感兴趣,就只学习数学分析,而对射影几何一点都不了解那是不行的,要想学习数学,出了做数学题外,不会有更好的方法。
所以学校vbs不在全局上对vbs做个大概的了解,我觉得是不行的。学习脚本部件,学习hta,
其实就是从不同的角度去了解vbs。最后是各人取自己感兴趣的去学习。
作者: powerbat    时间: 2011-4-1 23:04

我没打算学VB/VBScript语言本身(因为我不懂编程),我的目的是会写VBS脚本,会使用常用函数和对象。
VBS我不了解,但我对VBS提供的函数大多数都知道用法,对系统提供的常用对象如WScript、WScript.Shell、WScript.NetWork、Scripting.FileSystemObject、Scripting.Dictionary、正则表达式、InternetExplorer.Application、Adodb.Stream等都会用。我觉得学vbs会这些东西就够了。
作者: myzam    时间: 2011-4-2 18:10

让字体动态的旋转一周
  1. set oshell=createobject("wscript.shell")
  2. set oimg=createobject("shotgraph.image")
  3. x=320
  4. y=240
  5. oimg.createimage x,y,3
  6. oimg.setcolor 0,100,255,0
  7. oimg.setcolor 1,0,0,200
  8. oimg.setcolor 2,255,0,0
  9. oimg.settextcolor 2
  10. for i=0 to 40
  11. oimg.createfont "arial",0,48,90*i,false,false,false,false
  12. oimg.textout 100,100,"hello"
  13. oimg.gifimage true,95,"test.gif"
  14. oshell.run "test.gif" ,1
  15. wscript.sleep 1000
  16. next
复制代码

作者: myzam    时间: 2011-4-3 09:43

shotgraph可以直接生成gif动画
看实例:
  1. set s=createobject("wscript.shell")
  2. set obj=CreateObject("shotgraph.image")
  3. xsize=320
  4. ysize=240
  5. frames=9
  6. obj.CreateImage xsize,ysize,4
  7. obj.SetColor 0,0,255,51
  8. obj.SetColor 1,0,0,0
  9. obj.SetColor 2,255,0,0
  10. obj.createpen "PS_SOLID",4,2
  11. for i=1 to 50
  12. obj.TrackAdd true,10,10,0,0,150,100,30
  13. obj.rEctangle i+10,i+10,i+30,i+30
  14. next
  15. obj.trackplay "test.gif"
  16. s.run "test.gif"
复制代码
说明:要生存动画就要用到方法:trackadd,trackplay
语法如下:
trackadd  transparent,x,y,x1,y1,width,height,dispose
参数trasparent背景是否透明,取逻辑值
    x--top-left,y--top-up
     x,y与width,height配合就是设置出动画演示的长方形区域
   x1,y1是指在上面设置的动画区域内frame(帧)的坐标,当然
   x1---还是是left-top,y1--left-up
     注意x,y和x1,y1计算坐标的起点是不同的。
   x,y的计算是基于图片的左上角开始计算的,
   而x1,y1是基于动画区域开始计算的。
   你运行我给出的实例记清楚了。
trackplay  path
    保存你生存的动画图片
shotgraph 太好用了,极力推荐给玩家
下面是这段程序生存的动画图片,由于没有付费,所以你看到的动画只是运动了一次,
要再次看到运动,你刷新网页就可以了。
作者: myzam    时间: 2011-4-3 13:17

本帖最后由 myzam 于 2011-4-8 19:43 编辑

   shotgraph图像组件的语法
   终于把方法处理完了。现在贴出来,共享。myzam 2011-4-2
    提醒:要完整的使用这里的方法,请创建画布。obj.fillrect 。。。。
   没有画布的图片,背景是一个黑粑粑。而且下面的关于透明的属性,将不起作用。
   参数是标准的vbs命名方法。如字符串就是s开头,布尔值就是b开头etc。下面的方法我将抽时间逐以注解。

   shotgraph是以矩形为基础进行构图的。确定矩形大小的方法有两种:
   通常是用对角线端点坐标确定大小,但是有的地方是用对角线的左上端点和,长,宽来确定大小的。  
---方法部分----------------------

动画:
1--定义帧
TrackAdd iTransp,iXDecl,iYDecl,iX,iY,iWidth,iHeight,iTime [,sDisp]

说明:oimg.trackadd true,0,0,10,10,50,40
         就是创建一帧,该帧的长方形对角线坐标为:0,0,0+50,0+40
         然后在帧上放一个元件,元件所在的长方形的lefttop坐标为10,10,当然这个元件的最大范围是10,10,10+50,10+40
         也就是说元件超出帧后将不显示超出的部分。true逻辑值,到表要背景色,false就表示不要背景色。shotgraph的逻辑值
         比较松散,非零的数等价于true,零等价于false。这点和vbs不同。在vbs中true总是严格的=-1,false=0.
         最后一个参数,sdisp是可选的,用处不大,约去。

2--保存动画TrackPlay sFileName [,iBgColor]
说明:把你做的动画存盘。sfilename就是路径。如 oimg.trackplay "f:\test.gif"
         如果你用gifimge,jepgimage存盘,则动画将不动。

3--椭圆弧arc
Arc nLeftRect, nTopRect, nRightRect, nBottomRect, nXStartArc, nYStartArc, nXEndArc, nYEndArc
说明:arc画的是椭圆弧(含圆弧),参数nleftrect,ntoprect,nright,nbottomrect确定矩形的内切椭圆,
        nXStartArc, nYStartArc, 从椭圆中心到这个点的一条射线。
        nXEndArc, nYEndArc 从椭圆中心到这个点的一条射线。上面的两射线就从椭圆上割下了椭圆弧。

例子:未注册版为200x200的jpg,320x240的gif
set s=createobject("wscript.shell")
set obj=CreateObject("shotgraph.image")
x=320:y=240
obj.createimage x,y,8

obj.setcolor 0,255,200,225
obj.setcolor 1,0,255,0
obj.setcolor 2,0,0,255

obj.setbgcolor 0
obj.fillrect 0,0,x-1,x-1

obj.setbgcolor 1
obj.chord 10,10,50,50,30,50,30,10

obj.jpegimage 90,0,"test.jpg"
s.run "test.jpg"
4--椭圆弓形区域chord /发音kuod/这个单词大家比较生僻,意思是弦,弓形
Chord nLeftRect, nTopRect, nRighrRect, nBottomRect, nXRadial1, nYRadial1, nXRadial2, nYRadial2
说明:参数含义完全同上面,只是这里得到的是弓形区域。
例子:
set s=createobject("wscript.shell")
set obj=CreateObject("shotgraph.image")

x=320:y=240
obj.createimage x,y,8

obj.setcolor 0,255,200,225
obj.setcolor 1,0,255,0
obj.setcolor 2,0,0,255

obj.setbgcolor 0
obj.fillrect 0,0,x-1,x-1

obj.setbgcolor 1
obj.chord 10,10,50,50,30,50,30,10

obj.jpegimage 90,0,"test.jpg"
s.run "test.jpg"
5---createbrush
CreateBrush sStyle, nColor, sHatch
说明:单词hatch---是光栅之意,或者说是影线,就是说填充的是一根根线。
        
EG.1
set s=createobject("wscript.shell")
set obj=CreateObject("shotgraph.image")

x=320:y=240
obj.createimage x,y,8

obj.setcolor 0,255,200,225
obj.setcolor 1,0,255,0
obj.setcolor 2,0,0,255

obj.setbgcolor 0
obj.fillrect 0,0,x-1,x-1

obj.createbrush "",1,""
obj.chord 10,10,50,50,30,50,30,10

obj.jpegimage 90,0,"test.jpg"
s.run "test.jpg"

EG.2
set s=createobject("wscript.shell")
set obj=CreateObject("shotgraph.image")

x=320:y=240
obj.createimage x,y,8

obj.setcolor 0,255,200,225
obj.setcolor 1,0,255,0
obj.setcolor 2,0,0,255

obj.setbgcolor 0
obj.fillrect 0,0,x-1,x-1

obj.createbrush "BS_HATCHED",1,"HS_VERCITCAL"
obj.chord 10,10,50,50,30,50,30,10

obj.jpegimage 90,0,"test.jpg"
s.run "test.jpg"

6---创建图像CreateImage nXSize, nYSize, nColors
说明:参数nXSize, nYSize设置图片的大小。参数 nColors 设置图片的背景色。

7----创建字体
CreateFont sFamily, nCharset, nHeight, nAngle, bBold, bItalic, bUnderline, bStrikeOut

[,bUnicode]
说明:sFamily 设置字体如Euclid,Rrial,对不支持中文字体。 nCharset指定字符集。nAngle旋转角度,取90*40才旋转一周。
bBold, bItalic, bUnderline, bStrikeO一次表示黑体否?斜体否?下划线否?删除线否?它们去逻辑值。

eg.1
set s=createobject("wscript.shell")
set obj=CreateObject("shotgraph.image")

x=320:y=240
obj.createimage x,y,8

obj.setcolor 0,255,200,225
obj.setcolor 1,0,255,0
obj.setcolor 2,0,0,255

obj.setbgcolor 0
obj.fillrect 0,0,x-1,x-1

obj.settextcolor 1
obj.createfont "arial",0,48,30,true,false,false,false
obj.textout 10,10,"hello world"

obj.gifimage 90,0,"test.gif"
s.run "test.gif"

8------创建笔CreatePen sStyle, nWidth, nColor
说明:sstyle笔的样式如:PS_SOLID(P-PEN,S-STYLE之意),PS_DASH,PS_DOTDASH
         nWidth笔的粗细, nColor笔的颜色。     
如:
obj.createpen "PS_SOLID",4,1
9---文字布局TextOut nXStart,nYStart,sText[,bUnicode]
说明: nXStart,nYStart设置文字在图片上显示的矩形的left top坐标。
          sText设置要显示的文字字符串
10---画线Line nXStart, nYStart, nXEnd, nYEnd [,bAntiAliased]
说明:nXStart, nYStart, nXEnd, nYEnd 线的起点和终点坐标。

-11-画饼Pie nLeftRect, nTopRect, nRighrRect, nBottomRect, nXRadial1, nYRadial1, nXRadial2, nYRadial2
说明:nLeftRect, nTopRect, nRighrRect, nBottomRect确定一个矩形框,框中放置了一个内切椭圆。假定椭圆的中心是P点。
         nXRadial1, nYRadial1确定一个点Q,然后PQ就确定了一条线。同样的道理 nXRadial2, nYRadial2 也和椭圆的中心P确定
        另一条线RQ.这样弓形就构造出来了。        

-12-贝塞尔曲线
PolyBezier aPoints
说明:apoints为数组定义的4个点,2个端点,2个控制点
如:apoints=arrary(0,0,10,30,24,50,100,50)
也可以是2维数组
bezier函数是数学上著名的多项式插值函数。
13---折线
PolyLine sFill, aPoints
说明:sfill取ALTERNATE(交替填色,如果有的话) ,WINDING
         通常可以空缺,如oimg.polyline " ",arrary(0,0,10,30,24,50,100,50),
         aPoints必须是由array生成的数组。这一点同上。
-14--矩形
Rectangle nXStart, nYStart, nXEnd, nYEnd
说明:nXStart, nYStart, nXEnd, nYEnd代表矩形的对角线坐标。
obj.rectangle 10,10,50,30

15--圆角矩形ROUNDrECT nXStart, nYStart, nXEnd, nYEnd, nWidth, nHeight
说明:nXStart, nYStart, nXEnd, nYEnd代表矩形的对角线坐标。
        nWidth, nHeight 圆角是放到一个小矩形中的,代表这个小矩形的宽,高。
obj.roundrect 10,10,100,80,20,20
16--设置填充色
SetBgColor nColor
说明:ncolor表示由setcolor定义的色编号。

17---设置背景色
SetBkColor nColor
说明:ncolor表示由setcolor定义的色编号。
         要更详细的设置背景就用createbrush方法。
18---设置背景模式为透明或不透明SetBkMode sMode
smode=OPAQUE 或TRANSPARENT
说明:在创建动画时,和设置光栅时其作用是明显的。
19---设置颜色
SetColor nColor, nRed, nGreen, nBlue
说明:ncolor给这个自定义颜色的编号,以便其它方法引用这个颜色。
         nRed, nGreen, nBlue   RGB颜色数,可以是16进制。


20--设置画笔颜色
SetDrawColor nColor
说明:ncolor表示由setcolor定义的色编号。
         要想更详细的设置画笔,就用CREATEPEN方法。

21--设置文本颜色
SetTextColor nColor
说明:ncolor表示由setcolor定义的色编号。
22--创建gif图片
GifImage nTransparent, nInterlaced, sFileName
说明:nTransparent  如果取true表示要背景色,否则不要背景色。如果无效那对光栅就有效。
        nInterlaced  消除内部据此,取0,1,2
23--创建jpg图片
JpegImage iCompression, iProgressive, sFileName [,nXStart] [,nYStart] [,Width] [,Height]

说明:icompresion一般去-1等价于去压缩率100,取-1的效果与去90的压缩率差不多。取1是很差的效果。
        如:obj.jpegimage -1,0,"text.jpg"
        iProgressive是否逐行扫描,设置为0即false好了。
        sFileName存盘路径。
        [,nXStart] [,nYStart] [,Width] [,Height]可选,存盘时改变图片的尺寸。
        gifimage方法存盘时是不可以改变图片的尺寸的。
      
24---获取磁盘上的图片文件的维数(dimension),就是图片大小。如400x300
GetFileDimensions sFileName,iX,iY
说明:sFileName磁盘上图片的路径
         iX,iY 磁盘文件的尺寸。这个方法要和readiamg配合作用才大,但是用readimage要钱。
如:obj.getfiledimensions "test.jpg",x,y
这里的x,y被读入内存,然后通过creatimage方法调用。
如:obj.createimage x,y,8
25---截屏

CaptureScreen nXDest, nYDest, nWidth, nHeight, nXSrc, nYSrc
说明:
     nXDest, nYDest, nWidth, nHeight确定要创建的图片的大小,nWidth, nHeight这与通常意义下的
      矩形框的确定方法不同。因为它们代表的是宽高。
      nXSrc, nYSrc 表示屏幕的一个点,由这个点到屏幕的左下角就是你的切屏范围。由于没有负费切的图片不大。
dest=distination,src=source
如:obj.capturescreen 10,10,50,50,0,0
10,10,50,50是你要保存的图片的对角线的坐标。
0,0是屏幕的coordinate of left-top point
26---补充创建gif动画
   创建gif动画有2个方法是必须要用到的trackadd,trackplay
   trackadd是用来定义动画区域的,而trackplay是用来存盘的。
   动画的size由于没purchase money。So,你就只可以使用320x240的size了。你觉得不过瘾
   那就pay dollar 80吧。对了最关键的一点是动画的frame怎么来?对了,用前面的划线啊,
   画矩形啊,话椭圆啊,画贝塞尔曲线啊这些方法去创建frame吧。那是你自己的创意了,与我
   无关了。
   TrackAdd iTransp,iXDecl,iYDecl,iX,iY,iWidth,iHeight,iTime [,sDisp]
   itransp: 透明否?
   ixdec1,iydec1配合iWidth,iHeight定义动画演示区域,就是帧。基于图片的letf-top开始计算。
   iX,iY上面定义的动画区域即帧,元件的位置就是ix,iy。这里的计算是基于动画区域
   开始计算的。
   itime:显示表示动画时间。
   sdisp=dispose处理之意。处理谁?不是frame才怪。怎么处理?
   也就是说sdisp有3个取值:"LEAVE","BACKGROUND","PREVIOUS",动画有什么拖尾动画,丢掉动画,就  

是这些意思。
   trackplay太明了,没说的。
   来过例子:
    obj.rectangle 10,30,50,50
    obj.trackadd true,10,10,20,20,80,80,30
    这就定义了一动画区域10,10,10+80,10+80
    在这个区域内,第一帧的位置是10-20,30-20,注意这不是图片的坐标!是动画区域内的坐标
    或叫相对坐标吧。如果让你来设计这个shotgraph我想你也会自然的用相对坐标。为了计算的方便,最后是是把trackadd里面的元件坐标和
   rectangle里面的元件坐标设置成一样,或干脆在trackadd里面把元件的坐标设置成0,0.
    这里的动画的逐帧动画,创建动画的过程。创建帧,在帧上在放元件,超出帧的部分将不显示。元件要放在帧上。注意次序。
    有点遗憾,就是图片有点小,还有textout只支持2个汉字。
27---剪辑版方法
     这里的图像剪辑版和windows剪辑版是完全不同的两个无关概念。它指的是内存里面开辟的一个缓冲区。
     要使用剪辑版,首先要创建图片,就是要在语句
     oimg.createimage xsize,yszie,ncolor 之后才可以使用!
     (a)oimg.initclipboard width,height
               说明:初始化剪辑版,即在内存里面创建一个宽为width,高为height的长方形区域。
     (b)oimg.selectclipboard true
              说明:激活剪辑版,剪辑版必须激活才可以使用。
     (c)oimg.copy  x,y,w,h,cx,cy "SRCCOPY"
              说明:从剪辑版中复制图片。cx,cy是剪辑版的左上顶点坐标。复制的图片就从这里开始直到剪辑版的右下角。
                把复制的图片粘贴到图片的矩形框上,其左上顶点为x,y,右下顶点为x+w,y+h
              
     (d)实例:
  1. set s=createobject("wscript.shell")
  2. set oimg=CreateObject("shotgraph.image")
  3. xsize=320:ysize=240
  4. oimg.createimage xsize,ysize,8
  5. oimg.setcolor 0,200,80,100
  6. oimg.setcolor 1,0,255,0
  7. oimg.setcolor 2,0,0,255
  8. oimg.setbgcolor 0
  9. oimg.fillrect 0,0,xsize,ysize
  10. oimg.initclipboard 50,50
  11. oimg.selectclipboard true
  12. oimg.setbgcolor 1
  13. oimg.rectangle 0,0,100,100
  14. oimg.copy 0,20,30,30,10,10,"SRCCOPY"
  15. oimg.copy 0,60,30,30,10,10,"SRCCOPY"
  16. oimg.copy 10,100,30,30,10,10,"SRCCOPY"
  17. oimg.gifimage -1,0,"hh.gif"
  18. s.run "hh.gif"
复制代码
28---数据传送
     可以把图片当数组数据进行传送。
    (a) 读入图片数据
    data=oimg.readbinaryfile("test.gif",maxsize)
      其中maxsize是预先自己设定的图片的最大尺寸,超出这个尺寸的数据将被丢掉。单位为字节byte。
    如可以设置maxsize=1024*10
     (b)写数据即数据存盘
    oimg.writebinary data,0,ubound(data)+1,"hhh.gif"
      说明:如果报错请把maxsize设置成一个更大的数。         
          0,ubound(data)+1表示数组的维数的最小值是0,最大值是按vb函数ubound计算出来的。
         什么样的图片都可以进行数据的传送,当然也可以进行图片格式的转变。
         如果报错,请把maxsize设置成更大的数。一般来讲如果是800x600,则maxsize=480000
             其它情况类似。

    (d)例子:
  1. set s=createobject("wscript.shell")
  2.                set oimg=CreateObject("shotgraph.image")
  3.                maxsize=480000
  4.               data=oimg.readbinaryfile("sunset.jpg",maxsize)
  5.               oimg.writebinary data,0,ubound(data)+1,"hhh.jpg"
  6.                s.run "hhh.jpg"
复制代码
GOOD LUCK!
作者: broly    时间: 2011-4-3 23:32

26# powerbat


同意。我也差不多这样想。
作者: myzam    时间: 2011-4-4 02:39

本帖最后由 myzam 于 2011-4-8 18:09 编辑

30# broly
没想到这个com还可以进行数学的线性变换。我们用的是
仿射变换---颠覆你的视觉NB

仿射变换的尾巴代表平移。
给一个简单的线性变换--放大2倍的例子吧。对了线性变换是用矩阵表示的。像这样
[attach]3684[/attach]
[attach]3685[/attach]
---说明:这2张图片是用mathtype做的
上述变换在数学上表达的意思是伸张2倍,并平移到坐标为(1,2)的地方。
shotgraph要进行仿射变换,必须用到俩句话:
obj.setgraphicsmode "GM_ADVANCED"   它的常数除了true,false外,其它的常数请大写,这是不爽的地方。
obj.settransformation a11,a12,a21,a22,h,k
a11,a12,a21,a22,h,k这是正交变换的矩阵元素。
旋转 就取这样的矩阵:cos(t),sin(t),-sin(t),cos(t) ,h,k
        调整负号的位置,可以把反射加进去。
t为旋转角度,正的代表逆时针,负的代表顺时针旋转。h,k代表平移坐标。
反射,就这样去矩阵:-1,0,0,1,0,0 关于x轴反射
                     1,0,0,-1,0,0关于y轴反射
                     -1,0,0-1,0,0关于0,0对称
用这个方法翻转字体,比直接用obj.createfont "",0,32,t,true,0,0,0  翻转字体来的快
因为上面这个方法要翻转字体 t=90*20,
原因是 t=90*40字体才旋转一周。也就是说这里的参数1代表的是0.1度。3600shotgraph=360degree
放大2陪就这样取矩阵:2,0,0,2,0,0
                                           2,0,0,2,1,2放大2倍并平移到坐标为1,2的地方。
平移就这样取矩阵 0,0,0,0,12,35  平移到坐标为12,35的地方。
                                
例子如下:我以截屏为例子。
  1. set obj=createobject("shotgraph.image") '连接到com
  2. obj.createimage 320,240,8,创建图片,可以有8种颜色,这也是免费版的最大色数(不是素!)了
  3. obj.setcolor 0,0,255,0 '定义绿色,编号为0,编号可以任意指定。
  4. obj.fillrect 0,0,319,239 ’填充一个rectangle,其实就是创建画布。
  5. OBJ.setgraphicSmode "GM_ADVANCED"    '进入变换模式。这是要进行变换的必要条件,后面的参数是高级的意思,不可以去掉!
  6. OBJ.setTransformation 2,0,0,2,10,10  '进行相似变换
  7. obj.capturescreen 0,0,320,240,450,50  '在屏幕上从坐标(10,10)的地方开始抓一个rectangle屏幕进入内存,然后在一个矩形区域
  8.                                           '显示图片。前4个数字代表矩形区域
复制代码
为了简化计算,在变换时把图片框取方是一个好的技巧。


--------------------------------一个复杂的例子 椭圆的包络线
                                        看了图片你会惊奇它的美,和功能的强大
  1. set obj=CreateObject("shotgraph.image")
  2. size=220
  3. obj.CreateImage size,size,2
  4. obj.SetColor 0,255,255,255
  5. obj.SetColor 1,0,0,0
  6. obj.SetBgColor 0
  7. obj.FillRect 0,0,size-1,size-1
  8. obj.SetDrawColor 1
  9. obj.CreateBrush "BS_NULL",0,""
  10. obj.SetGraphicsMode "GM_ADVANCED"
  11. for i=0 to 179 step 10
  12. ang=i*3.141/180.0
  13. 'Rotate the drawing
  14. obj.SetTransformation Cos(ang),Sin(ang),-Sin(ang),Cos(ang),size/2,size/2
  15. obj.Ellipse -size/2,-size/4,size/2-2,size/4-2
  16. next
  17. img=obj.GifImage(-1,1,"test.gif")
复制代码
这是它的创建的图片[attach]3682[/attach]
说真的这样的图片,你就是用专业的数学软件,如几何画板,顶级数学软件maple13,也不那么容易画。
椭圆包络线的编程思路是:让椭圆的长轴的端点在大小不同的2个圆上运动就可以了。
当然,它还具有色彩的渐变,剪辑,遮罩,不过有的要付费,就是不付费个人认为用处不大。
想要那种绚丽的艺术效果,那就用FLASH,PS,AI好了。我认为该com的功能是创建几何图形为主。
艺术效果是次要的。
下面这些方格是我用shotgraph的剪辑版(虚拟的,其实就是在内存里面新开辟一个缓冲区,别和系统的剪辑版搞混)画的
[attach]3683[/attach]
------------------------------------------------------------------------------
闪烁的光栅hatche
  1. set s=createobject("wscript.shell")
  2. set obj=CreateObject("shotgraph.image")
  3. xsize=320
  4. ysize=240
  5. obj.CreateImage xsize,ysize,8
  6. obj.SetColor 0,0,50,0
  7. obj.SetColor 1,&HFF,0,0
  8. obj.setcolor 2,0,&HFF,0
  9. obj.setcolor 3,0,&HFF,&HFF
  10. obj.setcolor 4,&HFF,0,&HFF
  11. obj.setcolor 5,&HFF,&HFF,0
  12. obj.setcolor 6,0,0,&HFF
  13. obj.setcolor 7,0,0,0
  14. obj.SetBgColor 0
  15. obj.FillRect 0,0,xsize,ysize
  16. obj.createfont "",0,32,0,1,0,1,0
  17. obj.settextcolor 2
  18. obj.textout 30,5,"myzam"
  19. for i=0 to 10
  20. for r=0 to 100 step 10
  21. obj.createpen "PS_SOLID",4,(r MOD 6)+1
  22. obj.setbkmode "TRANSPARENT"
  23. OBJ.CREATEBRUSH "BS_HATCHED",(r MOD 6)+2,"HS_CROSS"
  24. obj.ellipse 160-r,120-r,160+r,120+r
  25. obj.trackadd -1,0,0,0,0,xsize,ysize,30     
  26. next
  27. next
  28. obj.trackplay "test.gif"
  29. s.run "f:\test.gif"
  30.   
复制代码




=====================================
这个com可以处理的数学类型有下面这些:

画折线
画多边形
画弧
画弓形
画椭圆饼(数学上叫椭圆扇形,一般office就饼)
画bezier曲线(非常典型,由此可以很方便的模拟出抛物线,正弦线等)
仿射变换(平移,旋转,放大,缩小,弯曲,反射)
除此之外还可以
画字符画(对汉字的处理只能处理几个字)
做动画。
另外还可以创建图片剪辑版(虚拟的),然后可以把图片缓存到clipboard,然后在处理。
这里的剪辑板其实是内存的一个区域,不是系统带的那个clipbrd !
obj.initclipboard 10,10
obj.selectclipboard true
obj.copy 0,0,40,50,10,10 "SRCCOPY"
其它功能:
读取图片(readimage就是要收费,遗憾)
把图片作为数据流处理
可以直接与office对话,从而处理office的图片。但还不如直接用vba。
非注册版本的功能已经够可以的了。
如果有注册版本当然好了。但是我没找到。遗憾。

我的实例
eg.1描点法画抛物线,较慢,gif文件大小为130kb
  1. set s=createobject("wscript.shell")
  2. set obj=CreateObject("shotgraph.image")
  3. size=240
  4. obj.CreateImage size,size,8
  5. obj.SetColor 0,0,255,0
  6. obj.SetColor 1,0,0,255
  7. obj.setcolor 2,255,0,0
  8. obj.setcolor 3,0,0,0
  9. obj.SetBgColor 0
  10. obj.FillRect 0,0,size-1,size-1
  11. obj.createpen "PS_SOLID",3,2
  12. obj.line 0,size-4,size,size-4
  13. obj.line 120,0,120,size
  14. obj.createfont "ARIAL",0,24,0,true,0,0,0
  15. obj.settextcolor 3
  16. obj.setbkmode "TRANSPARENT"
  17. obj.gettextdimensions "x-axies",u,v
  18. obj.textout size-u-2,size-v-2,"x-axies"
  19. obj.textout 120,0,"y-axies"
  20. for i=0 to size step 2
  21.         obj.trackadd true,0,0,0,0,size,size,30
  22.         obj.createpen "PS_SOLID",4,1
  23.         obj.line i,size-0.1*(i-120)^2-5,i,size-0.1*(i-120)^2-5
  24. next
  25. obj.trackplay "test.gif"
  26. s.run "test.gif"
复制代码

这是动态的显示描点
[attach]3686[/attach]
这是描点法得到的动画图片,刷新网页可以看到。和下面用变换做的是同样一条抛物线
的图像,用变换法生成的图像动画比这个快的多。


如果不想动态的显示描点,只想显示结果,那么把帧语句obj.trackadd true,0,0,0,0,size,size,30移动动for循环的外面,next的后面就行了。
eg.2 利用平移和反射作抛物线的图像,描点法
  1. set s=createobject("wscript.shell")
  2. set obj=CreateObject("shotgraph.image")
  3. size=240
  4. obj.CreateImage size,size,8
  5. obj.SetColor 0,0,255,0
  6. obj.SetColor 1,0,0,255
  7. obj.setcolor 2,255,0,0
  8. obj.setcolor 3,0,0,0
  9. obj.SetBgColor 0
  10. obj.FillRect 0,0,size-1,size-1
  11. obj.createpen "PS_SOLID",3,2
  12. obj.line 0,size-4,size,size-4
  13. obj.line 120,0,120,size
  14. obj.createfont "ARIAL",0,24,0,true,0,0,0
  15. obj.settextcolor 3
  16. obj.setbkmode "TRANSPARENT"
  17. obj.gettextdimensions "x-axies",u,v
  18. obj.textout size-u-2,size-v-2,"x-axies"
  19. obj.textout 120,0,"y-axies"
  20. for i=0 to size-1 step 1
  21.         obj.setgraphicsmode "GM_ADVANCED"
  22.         obj.settransformation 1,0,0,1,i+120,0.2*i^2
  23.         obj.createpen "PS_SOLID",4,1
  24.         obj.line i,0,i,0
  25.         obj.settransformation -1,0,0,1,size-i-120,0.2*i^2
  26.         obj.line i,0,i,0
  27. next
  28. obj.gifimage -1,0,"test.gif"
  29. s.run "test.gif"
复制代码
其实关键的语句没这么多,就是for。。。next那几句,其它的是废话。就是为了好看一点吧了。
下面是利用平移变换作的图,刷新网页,看以看到动画

例子:利用bezier贝塞尔方法创建曲线轨迹
  1. set s=createobject("wscript.shell")
  2. set obj=CreateObject("shotgraph.image")
  3. size=240
  4. obj.CreateImage size,size,8
  5. obj.SetColor 0,0,255,0
  6. obj.SetColor 1,0,0,255
  7. obj.setcolor 2,255,0,0
  8. obj.setcolor 3,0,0,0
  9. obj.SetBgColor 0
  10. obj.FillRect 0,0,size-1,size-1
  11. obj.createpen "PS_SOLID",3,2
  12. obj.line 0,size-4,size,size-4
  13. obj.line 120,0,120,size
  14. obj.createfont "ARIAL",0,24,0,true,0,0,0
  15. obj.settextcolor 3
  16. obj.setbkmode "TRANSPARENT"
  17. obj.gettextdimensions "x-axies",u,v
  18. obj.textout size-u-2,size-v-2,"x-axies"
  19. obj.textout 120,0,"y-axies"
  20. for i=2 to 51 step 5
  21.         obj.createpen "PS_SOLID",1,1
  22.         obj.polybezier array(0,0,i+118,0.1*i^2,i+122,0.1*(i+2)^2,240,0)
  23.         obj.trackadd true,0,0,0,0,size,size,30
  24. next
  25. obj.trackplay "test.gif"
  26. s.run "test.gif"
复制代码
生成的动画图片如下,刷新网页可以看到动画。

[attach]3687[/attach]
利用bezier方法创建的曲线系文件很小。这是因为它采用的是多项式插值推算出来的,不是一点一点的描出来的。
所以数学函数的模拟尽量采用插值发,以减小文件的大小。这个图片才16kb。如果是描点的话,
大概要达到200kb的样子,差别是非常大的。

例子:直方图
  1. set s=createobject("wscript.shell")
  2. Set g=CreateObject("shotgraph.image")
  3. x=320
  4. y=240
  5. g.createimage x,y,8
  6. g.setcolor 0,100,0,255
  7. g.setcolor 1,255,0,0
  8. g.setcolor 2,0,255,0
  9. g.setbgcolor 0
  10. g.fillrect 0,0,x-1,y-1
  11. for i=0 to 11   
  12.   g.setbgcolor (i mod 2)+1
  13.   if y-i*50>=0 then
  14.      g.fillrect i*30,y-i*50,i*30+30,y
  15.   else
  16.      g.fillrect i*30,i*50-y,i*30+30,y
  17.   end if
  18. next
  19. g.gifimage true,0,"test.gif"
  20. s.run "test.gif"
复制代码
===============[attach]3690[/attach]
例子:微积分中的曲边梯形动画
  1. set s=createobject("wscript.shell")
  2. set obj=CreateObject("shotgraph.image")
  3. xsize=320
  4. ysize=240
  5. obj.CreateImage xsize,ysize,8
  6. obj.SetColor 0,0,255,0
  7. obj.SetColor 1,0,0,255
  8. obj.setcolor 2,255,0,0
  9. obj.SetBgColor 0
  10. obj.FillRect 0,0,xsize,ysize
  11. sub my()
  12. n=inputbox("Please number:")
  13. h=xsize/n
  14. for i=0 to n-1
  15.     xi=0+i*h
  16.     yi=0.005*(xi+h/2)^2
  17.   if ysize-yi >=0 then
  18.     obj.setbgcolor (i mod 3)+1
  19.     obj.fillrect xi,ysize,xi+h,ysize-yi
  20.     obj.trackadd -1,0,0,0,0,xsize,ysize,30
  21.   else
  22.     exit for
  23.   end if
  24. next
  25. end sub
  26. call my()
  27. obj.trackplay "test.gif"
  28. s.run "test.gif"
复制代码
刷新网页,可以看到动画:y=x*x*0.0056的曲边梯形

[attach]3691[/attach]
-----------------------------------------------------
例子:抛物线的曲边梯形2--y=0.005*x^2
  1. ''''####Editer:myzay 2011-4-5#########
  2. set s=createobject("wscript.shell")
  3. set obj=CreateObject("shotgraph.image")
  4. xsize=320
  5. ysize=240
  6. obj.CreateImage xsize,ysize,8
  7. obj.SetColor 0,0,255,0
  8. obj.SetColor 1,0,0,255
  9. obj.setcolor 2,255,0,0
  10. obj.setcolor 3,200,10,125
  11. obj.setcolor 4,125,200,50
  12. obj.SetBgColor 0
  13. obj.FillRect 0,0,xsize,ysize
  14. call my()
  15. function my()
  16.     for n=10 to 50
  17.         
  18.         h=xsize/n
  19.         
  20.         
  21.         obj.gettextdimensions "100Number Of Iterate",x1,y1
  22.         obj.createfont "Arail",0,32,1800,true,true,true,true
  23.         obj.setbKmode "TRANSPARENT"
  24.         obj.settextcolor (n mod 2)+3
  25.         obj.textout x1+10,y1+20,"Number Of Iterate:"&n-9
  26.    for i=0 to n-1
  27.            
  28.            xi=0+i*h
  29.            yi=0.005*(xi+h/2)^2
  30.            if ysize-yi >=0 then
  31.            obj.setbgcolor (i mod 3)+1
  32.            obj.fillrect xi,ysize,xi+h,ysize-yi
  33.            obj.trackadd -1,0,0,0,0,xsize,ysize,20
  34.          
  35.     else
  36.            exit for
  37.     end if
  38.     next
  39.     obj.SetBgColor 0
  40.     obj.FillRect 0,0,xsize,ysize
  41. next
  42. end function
  43. obj.trackplay "test.gif"
  44. s.run "f:\test.gif"
  45.   
复制代码
动画文件为1.25mb,请稍等。要重复播放,请刷新网页。



----------------------------------------------------

函数图像画法有3法:
  法1:老老实实的描点
  法2:平移变换法
  法3:贝塞尔方法。这种方法是曲线的近似画法,数学上叫曲线的拟合。
  法4:折线法obj.polyline,采用极限的思想,把区间细分一下,如分为30段,就可以达到很好的效果,而且文件还小。
   给个例子:
  1. set s=createobject("wscript.shell")
  2. set obj=CreateObject("shotgraph.image")
  3. xsize=320
  4. ysize=240
  5. obj.CreateImage xsize,ysize,8
  6. obj.SetColor 0,0,255,0
  7. obj.SetColor 1,0,0,255
  8. obj.setcolor 2,255,0,0
  9. obj.setcolor 3,200,10,125
  10. obj.setcolor 4,125,200,50
  11. obj.SetBgColor 0
  12. obj.FillRect 0,0,xsize,ysize
  13. arr=array( _
  14. 100,100,110,50,120,100,130,50,140,100,_
  15. 150,50,160,100,170,50,180,100,200,50,220)
  16. obj.setdrawcolor 2
  17. obj.polyline "",arr
  18. obj.line 0,160,230,160
  19. obj.line 100,10,100,300        
  20. obj.gifimage -1,0,"test.gif"
  21. s.run "f:\test.gif"
复制代码
[attach]3692[/attach]
  利用帧来创建图片就可以了。如果要想文件小点,快点,就获取图片的最后结果,只用一帧就可以了。,如果
  喜欢慢慢的欣赏画图的过程,那就要用多帧。
  如果你希望图片上的点不离散,那就取小数步长,这时动画是很慢的哦。
  玩家可能觉得奇怪,既然画图是这么的重要,为啥vbs不自带一个功能强大一点的方法?
  原因是这样的:vbs被微软设计成了一个类似于仪表盘的东西。
  仪表盘上的每一个按钮就是vbs的基本语句和基本方法,基本属性。
  vbs脚本所要做的就是让我们去按动按钮,然后调用com,通过com(控件)去完成各种复杂的事情。
  vbs没有画图的方法,这是由微软打造vbs的主导思想决定的。并不是微软办不到。
由此看来这个组件叫shotgraph是很妙的叫法了。shot---射击,graph---图表。合起来就是射击图表。
就是说你的vbs脚本就像一把枪的扳机,com就是你的子弹,你扣动扳机,就是调用com。这一枪出去,你就射出了一幅图像。
  这就是为什么叫shot  graph射图的原因,你说取的妙不妙?!vbs脚本是扳机,com是你的子弹,没有com的vbs就如没有子弹的枪。

  我查看了一下API函数列表,估计shotgraph就是调用的API函数。比如api函数中有textout,这里也有。
  遗憾的是我对API函数只认识A---P--I,除此之外是一篇空白,将来也不想去学。太累。
  该组件就一个文件在windows\system32\shotgraph.dll
   我打开文件看了,是C++ 编写的。它就是注册了一com。在里面可以看到它在注册表中的键位。
-------------------------------------------------------------
结束语:
      如果你想有效的使用shotgraph的各种方法,请创建画布吧---obj.fillrect 0,0,size1,size2
         如果你觉得图片小了,那就保存为test.swf吧。
      该com的要点是--矩形是基础,对角线是关键。
      我看重这个com,因为它的创建图片的功能不比专业的数学软件差。
      几何画板作图的功能够强大了吧,世界级的顶级数学软件Maple13画图的功能也足够强大了吧.
        它们都是有几十兆到几百兆的大小。
      而shotgraph就几十kb,居然达到了这样的颠覆你视觉的效果,说句真话,那些顶级的数学软件应该汗颜!
      说道这里让我想起了微软的公式编辑器,大家都以为那是微软的专利,其实大错特错!
      那是微软花了money买的Design Science公司的产品Mathtype的简化版。如果你装上原版的Mathtype那
      功能,没讲的。它让你直接可以使用LETEX语言输入科技符号。
      所以,我在想说不定哪天微软再花money把shotgraph买了,这不是没有可能,
      如果这样的事情发生了,那是玩家们的福音。呵呵。有点dream哈。
      编程对我来说就是玩,对我并没什么大的用处。我想对大多数人也是这样。
      因此,我祝各位玩家玩的愉快。
      由于时间的关系,水平的限制,错误是难免的,欢迎各位玩家指出,我会及时改正的。

        忘记最重要的一点了。由于这个版本是非注册版本,gif的大小是320x240,jpeg的大小为200x200.
       其实这不是问题,因为flash软件给我们提供了转变方法:你只要把文件导入flash的舞台,让后让flash的画布与
    gif文件一样大,接着导出来就是了,在导出文件时flash会提示你选择什么文件,你选择比如gif动画,点确定,
    flash又提示你文件的大小设置,这时你输入800x600,就可以改变gif动画的大小了。相信flash效果很好。
     我在使用中发现,下面的方法可以 突破非注册版尺寸的限制---------借助于flash播放器---------
       set oshell=createobject("wscript.shell")
       oshell.run "saflashplayer test.gif"
作者: myzam    时间: 2011-4-16 23:26

本帖最后由 myzam 于 2011-4-18 17:42 编辑

如何学习wmic?
  下面举例说明如何去查看wmic的帮助。其实要记住成千的wmic命令是很难的。因而学会察看wmic才帮助才是出路。
其实也没必要记那些命令。除非你要去参加考试。
假如f盘有一个文件叫test.txt
1---输入命令
   wmic  datafile where name='f:\\test.txt' get /value
   这时将显示关键字 createclassname=cim_logicalfile
  这就是此时,我们用到的类。
   我们首先要学会查看类的属性和方法,类里有和属性,有和方法。因为类的属性和方法才是我们要调用的东西。
背它没必要!
2---查看类样子 输入命令
  wmic  class  cim_logicalfile  get
这时你看到的是xml标签语言。不属习的人是读不懂的,就是属性标签语言的人,我想读起来也不会是一种享受。
怎么办?
这时我们输出它们到网页。如何输出到网页?用下面的命令好了:
wimc  /record:f:\test.htm class cim_logicalfile get
此时你去打开文件 f:\test.htm类cim_logicalfile的方法,属性就显示在你眼前了。
3---使用类的属性和方法
[attach]3721[/attach]
从图片中你可以看到该类有属性如 name,有方法如 copy,copyex。
利用属性:
wmic  path cim_logicalfile  where  name='f:\test.txt'  get /value
利用方法:
wimc  path cim_logicalfile where name='f:\test.txt'  call copy f:\test123.txt
问题来了compress方法是什么意思,论坛求助?估计无人回答你,网络找解答,估计还是没有你满意的结果。怎么办?
查看帮助啊?
如何查看?方法如下:
compress是压缩之意,
你输入下面的命令看看如何:
wmic path cim_logicalfile where name='f:\test.txt' call compress  /?
这时你发现这个帮助看了半天还是不明白。那你用下面的方法试试看:
wmic path cim_logicalfile  where name='f:\test.txt' call compress  /?:full
这时详细的帮助出来了。



总之,学习命令语言和学习一般的编制语言的方法是不同的。学习命令语言关键是学会如何查看帮助!

感谢:感谢网友的指出。再编辑中漏掉了 where。现补上。
作者: wc726842270    时间: 2011-4-17 08:47

简单的说一下,楼上好像少了不少WHERE啊




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2