大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
我来告诉大家什么是纯绿软件--(希望无知者不要再胡说八道了)
创新互联建站专注于玛多企业网站建设,自适应网站建设,商城开发。玛多网站建设公司,为玛多等地区提供建站服务。全流程按需开发,专业设计,全程项目跟踪,创新互联建站专业和态度为您提供的服务
有人说:
还有哪些所谓写绿色软件的人是不懂windows编程,根本就写不出注册的过程。所以自我安慰的叫绿色软件。不知大家注意没有绿色软件是不可以在天加删除中删掉的。只要它运行就会产生很多拉圾,而且是到处乱放,这就是为什么容易出问题的原因所在。
我只能说,这样说话的人是个电脑肓。
或是根本不懂得绿色软件的含义。
绿色软件有如下严格特征:
1、不对注册表进行任何操作(或只进行非常少的,一般朋友能理解的操作,典型的是开机起动。少数也进行一些临时操作,一般在程序结束前会自动清除写入的信息)。
2、不对系统敏感区进行操作,一般包括系统起动区根目录、安装目录(windows目录)、程序目录(Program Files)、帐户专用目录。
3、不向非自身所在目录外的目录进行任何写操作。
4、因为程序运行本身不对除本身所在目录外的任何文件产生任何影响,所以,根本不存在安装和卸载问题。
5、程序的删除,只要把程序所在目录和对应的快捷方式删了就可以了(如果你手工在桌面或其它位置设了快捷方式),只要这样做了,程序就完全干净地从你的电脑里删去了,不留任何垃圾。
以上就是绿色软件的特征。
对于编程人员来说,做一个绿色软件不难,做一个非绿色软件也不难,但是为什么那么多软件不做成绿色的呢?下面作一些讲解:
一、大型软件公司的大型软件为什么不做成绿色的:
1、大型软件公司并非没有能力做出绿色软件,但它们的软件涉及的方面过多,需要对系统原有的一些设置进行改动,以使电脑按照软件设计要求进行操作。以PhotoShop为例,它就需要在注册表里添加很多种格式文件的默认打开方法为PhtoShop.exe,以便大家双击此类文件后就自动打开PhotoShop以便编辑。
2、为了更好的为一些对电脑知识不是很了解的朋友进行一些自动设定。还是以PhotoShop为例,这儿已经有朋友发布了解压即可用的,但是,还是不少的朋友,连解压也不会,解压后都不知道点哪个文件开始正常运行,也不知道怎么在桌面上建快捷方式。就算别人为他做完了上面的事,要是有一天,他不想要PhotoShop了,也不知道原来安装的程序在哪个目录,怎么删去,甚至不知道如何删除快捷方式,更别说如何完全干净的删除了。做成安装版就可以自动为使用者完成上面的事了。
(特别说明:上面对PhotoShop的举例,只是用它来举例罢了,其实网上流行的解压即可用的PhotoShop也不是严格的绿色软件,其运行还是会写注册表的,如果不正常的使用它,注册表里还是会留下垃圾的,不过,这种垃圾对你的电脑影响不是很大,会的朋友可以手动删除这些垃圾)
二、做成安装软件很难吗?那些所谓写绿色软件的人是不懂windows编程,根本就写不出注册的过程吗。
1、我只能说,某些人的这种说法是一种非常不负责任的说法。其人根本不懂得编程,可笑而幼稚,只能以电脑肓来称呼。
2、现在流行的各种编程软件分三大类:
A、第一类是微软出的编程软件。
有Visual Studio系列(流行版本为6.0)以及新出不是很久的VS.NET系列,它们都自带了安装发布功能。特别是Visual Studio中的VB做出的东西,如果不发布,或不进行相关的处理,在别的没有安装VB的机器上是根本运行不起来的,因为VB编译出来的程序在根本上是伪编译,其指令通过VB运行库转译后运行,没有VB运行库的机器是根本无法正常运行此类程序的。当然了,有经验的朋友可以手工把运行库复制入相应的目录中,或是和VB做出的程序放在一起。其它的Visual Studio做出的程序有的有类似的上述情况。
在微软出品的VS.NET中,VS.NET兼容了多种编程语言,但按其说法,最终的代码其根本实质会变成一致。但是它做出的也同样是伪代码,也就是说,其代码不是根本上的机器二进制代码,不对机器进行直接指令指示,而是向.NET运行环境(NET Framework接口)发出指令,而由NET Framework转译指令为机器代码,再进行持行。这就要求你的机器上安装了NET Framework。NET Framework在win95/win98/windows2000上默认是没有安装的,如要安装,需要从网上下载或其它方式得到后安装。(微软官方有下载,大家也可以使用windows updata得到)。XP、windows 2003已集成。最后要说的是,微软宣言,要将原来的API接口(windows一直使用的标准编程接口)作废,改用.NET接口,故.NET编程方式可能是将来的标准方式。VS.NET系列的软件也集成了通用安装发布软件,只要正确掌握它,就能很好的做出楼主所谓的安装程序。
B、第二类软件是大名鼎鼎的Borland公司出品的编程软件,它也包括两大系列。即API系列和.NET系列。其.Net系列的情况和VS.NET是类似的。而其API的情况就有些不同了。
Borland的Borland C++Builder和Borland Delphi是两种非常流行的针对win进行API编程的编程环境。他们也带有install shield,可以说是编程人员必学的。不过,很多的稍简单的程序,编制者并不用它,因为,使用Borland C++Builder/Delphi开发出来的程序,只要正确设定几个参数,编译后得出的程序就可以在几乎所有版本的win中很好的直接运行了,当前,前提是,没有使用有特殊要求的第三方控件,或某些必要特别设定的数据源(BDE等)。而且,稍熟练的编制者可以直接在程序中通过程序自行进行一些简单的环境设定,如写注册表(关联文件、开机起动)、利用资源文件的方式向重要的目录写入文件,注册组件等等,可以说一点儿也不难。
C、第三类是一些比较偏的编程语言了,如易语言等,使用的人很少,本人很老实的说,具体情况我也不是很了解。
三、为什么一些个人的简单的软件会做成非绿色的:
1、编写者水平太低。低到只会使用微软的VB等,虽然做出的东西也值得一用,但是不知道怎么把它变成绿色的,只能依*VB等本身的功能以保证程序的正常运行。
2、编写者懒,写出程序后想,只要程序能正常让别人用就可以了,不值得太费脑子,依*VB等本身的功能发布吧,反正这样保险。
3、编写者水平不低,也不懒,但是它的程序用到了一些第三方控件,这些控件需要发布安装才能正常运行(需要注册特定的.DLL,需要把一些文件放到特定的位置,如典型的,要放入windows下的system32目录中。)
4、编写者为一些水平实在太低的人考虑,为了那些人的方便,如典型的《笨笨钟》就是此类,《FoxMail》、《winamp》也是此类,当然,FoxMail、《winamp》是写注册表的,通过其主程序进行一些环境的设定,严格上来说,也不是纯绿的。
5、编写者有一些特定的,不想为人知的东西要放入你的机器。比如典型的《阿达连连看》就是这样,它要把一些特定的与注册相关的东西放入你的windows目录,而且不想被人发现。又如网际快车的某些版本,它要把广告程序代码放入你的windows安装目录。
6、编写者有恶意,它的程序其实捆绑了木马、病毒等(对这一类的就要非常小心了),在安装的过程中这些恶意的程序就会释放出在,不知不觉中潜入你的计算机。
四、是否可以做出功能复杂,但又是严格意义上的纯绿软件:
答案是非常肯定的,因为,其实我们正在使用的很多程序都是纯绿的,特别是很多的游戏,虽然它们也要安装后才能运行,其实,你把它们安装后的目录放在别的机器上也一样的可以使用,并不必再次安装,其安装的意义就是***编写者为一些水平实在太低的人考虑***,如《三角洲》、《魔兽争霸III》。特别如网络游戏《传奇》(这个程序写的是真的很经典了,决对纯绿)等等著名的游戏都是如此。其需要设定的环境记录可以不写在注册表内,而利用*.INI文件来记录。我不知道有几个人有胆子说编写这些程序的人水平低下。
五、综上所述:
1、要做出一个纯绿色的软件,并不是很难,当然,可能要求编制者更多的依*自已去写代码(在必要情况下),在程序涉及方面比较多的情况下,可能给编制者加重很多的工作量。而要做一个非纯绿的软件,那就更容易了,往往可以利用编写器的一些自带功能自动完成。
2、纯绿的不带安装功能的软件非常适合于对电脑比较熟悉的朋友使用,而绿色带安装的软件适合于所有人使用。而自以为对电脑很熟的朋友往往更喜欢不带安装功能就可以用的。原因有如下:带安装的软件往往会有反安装程序,如果安装目录被人为删去,反安装程序或一些相关注册表信息往会留在机器中,成为垃圾。
3、为了自已的机器的安全、快速,也为了知情权(一个程序到底在安装和使用过程中在自已的机器里写了什么),本人极力推荐纯绿的软件。即便在必要的情况下非纯绿,也希望有详细的说明。说明软件可能会写注册表的那些部分,会改动机器里的哪些文件,会向哪些目录写入什么文件,内容。而且,希望这成为软件界的一个标准。这样,我们的电脑才会有安全可言!
4、为什么现在流行的软件中真正纯绿的软件不是很多呢?这个问题很不好回答。在这儿可以非常遗憾的告诉大家,有些朋友在网上下载的winrar绿色版、winamp绿色版等等,都不是真正意义上的纯绿软件。
比如winrar,它就因为为了在鼠标右键上出winrar的功能菜单而写动了注册表,因为要关联比如扩展名为.rar等等的文件(这些都可以在winrar程序里设定和更改)而写动了注册表。如果使用winrar后,强行把winrar程序目录删去,注册表里的这一部分注册表信息必然成为垃圾(其它的也许有本人没有发现的动作,如没有说出来是本人水平不足的问题了,呵呵)。
winamp绿色版似乎要好一些(本人的感觉),如果你设定了一些文件的关联,如双击*.mp3等文件winamp就会自动打开播放的话,你强行删去winamp所在目录,这部分文件的关联信息也会成为垃圾留在注册表中。
(上面两个只是举例,解决办法很多对电脑熟悉的朋友是会的,在这儿,我们并不讨解决办法,另外,应该说,上面两程序是很规范的东西,它们的这些动作是无可厚非的)
现在再回过头来说说“流行的软件中真正纯绿的软件不是很多”。
A、有些功能是非通过写注册表来实现不可,最最常见的就是文件关联、鼠标右键菜单。(呵呵,这种操作可以说,稍熟编程的人都会)。但是很少有个人编写者考虑到别人不用他的程序时,要怎么让使用者方便地复位这些文件关联,方便地清理右键菜单。
B、部分程序编写者喜欢把注册信息放在注册表中。(为什么喜欢?就因为注册表是庞大的参数库,他们以为,要从这样一个大参数库找出他们写入的一个信息是大海捞针。事实上,的确很多朋友是难以找出来的,话又说回来,会者不难,难者不会,在这儿我也不细说了)
C、一些大公司的程序实在对系统有太多的改动,他们做好了安装和卸载工具,这些软件涉及了系统的方方面面,想简单的删除是很难的。典型的就如微软的Office等等。这些软件说实在的,别说你不老实的删除了,就是老实的卸载,有时也是很难成功的。最好的办法就是装上后就别卸把,把它看成是系统的一部分(不管你乐不乐意,呵呵)。(又及,这类程序也不是很少,这儿只举一例)。
D、只有那些其功能可以不涉及更改系统默认行为的软件才可能在真正意义上做到纯绿。((也许我罗嗦了)系统默认行为包括“文件关联”,“右键菜单”,“控制面版”里的项目,真实或虚拟的硬件驱动以及其它我想不起来或是我也不知道的东西……)。当然了,还要编写者有真正的为使用者着想的精神,有较好的技术。
六、有部分并非纯绿的软件,伪装成纯绿的,在运行过程中向注册表写东西,向关键目录区写东西,甚至更改重要文件。这不是纯绿软件,只能说是伪纯绿。又及,很多网上流行的软件,号称纯绿版,实际上只是一些原版本经过稍许改进等,原软件并不设计为纯绿,在运行过程中还是会写注册表(甚至写关键win目录),也不是严格意义上的纯绿。反过来,也有部分其实是纯绿的软件,为了大家的方便,做成了安装发布式的。比如最典型的就是《传奇》《三角洲》、《魔兽争霸III》等一些游戏,一些工作软件如《FOXMAIL》(FoxMail至少在针对IE选项里的“程序”页里的"电子邮件"相关项进行了注册表相关写操作)《winamp》《winrar》等等准绿软件(在这儿,我只说它们是准绿的)也是如此。这类软件其实安装出来后,把其目录放在任何一台电脑上都能或者能较为正常的运行,这也是为什么大家能很方便的把它们改造成绿色软件的原因。现在真正的纯绿软件实际上是很少的,至于以后,也还是看不到纯绿一统天下的希望的,大家不可因噎废食。不可能只用纯绿软件而不用其它。而且大公司的软件一般还是非常可*的。
七、非纯绿软件的危害:
1、向系统关键目录或不属于该程序所在目录乱存放文件(默认临时文件夹除外)在原则上对机器的运行速度是没有大的影响的,除非乱放的文件改动了原有的系统关键文件,才会至使电脑变慢或运行不正常。但是,因为这些目录中的文件一般都比较多,很难对它们进行清理(鬼才知道哪个是能删,那个不能删),会使你的硬盘空间浪费,对于硬盘空间紧的朋友,那就非常讨厌了(此外,心里也不爽)。
2、向注册表乱写信息,如果乱写的信息并不影响系统的关键部分,对系统运行也是没有严重影响的,不过,有些信息写入了不删去,你的系统就会有些讨厌的东西出来,举例:你装上winrar后(典型安装设置),直接把winrar删了,你就会发现,你的右键菜单里会多出一些让人哭笑不得的东西。要注意的是,随着机器的使用,软件的安装、删除,这些可以感觉到和不能感觉到的信息会越来越多,而你的机器在运行过程中,几乎随时随刻不能离开对注册表的相关操作,注册表里的信息过多,机器查找所需信息的速度就会变慢,这时,机器的运行就表现为“变慢了”,这往往是一台电脑为什么越用越慢的最重要的原因之一。(提示:因为多数情况下,一个软件对注册表写的东西并不多,所以,在每一次垃圾进去了,用户是很难感觉到影响的)(又及,一些注册表清理软件,本人也用过,虽有作用,但是风险不少,是好是坏我也不知怎么评价……)。这些垃圾信息并非只有小公司的软件会留下,很多大公司的软件据本人的感觉,也是会留垃圾的,本人也很无耐。
解决办法吗?恕本人无能,在当今软件乱世,只怕多少有些无可耐何。本人是使用最笨的方法:Ghost镜像还原。基本上每三至四个月给它倒回一次。(工作文档等当然不能放在系统区了,呵呵)。
八、希望无知者不要信口开河,多多学习。最后,附上一个我自已做的纯绿软件---BCB编写的《水波特效演示》程序,给大家玩玩叭。
补充——初步判断一个软件是否纯绿软件的方法(注,只有对电脑比较熟悉的人能才办到,如果下面的说明,你基本能看懂,而无需请教别人,你就能做到了):
一、系统测试法:
1、将软件在别人的机器上安装,安装完成后,把安装出来的目录复制到你的机器中(如果本身就号称纯绿免装的,这步就免了)。
2、你的机器要求安装windows2000 或 windows XP 或 windows2003,使用受限用户登录(要求受限用户无对关键注册表有写权,无对重要目录有写权,当然了,默认的新建的用户就是这样的(XP下要将用户设为受限))。
3、受限用户登录后运行复制来的安装目录下的软件的主程序,如果正常,90%是纯绿。
4、对省下10%的说明——不排除可能编写者隐了动作,如果不成功也不报错,也不退出,还正常运行,一但能写的时就它就写。另外,还有一部分程序,如FoxMail,只对当前帐户相关于注册表进行写操作,因为“帐户相关于注册表"是"属于"对应帐户的,在受限帐号下也是可写的(特别说明一下,注销该帐户,注册表中该帐户的所有项目都会清去,所以也可以算是绿的)。
二、软件监控法:
1、如果上面的步子还不令你放心,还有一个工具值得一用,那就是《Filemon》,这是一个可以监视系统中任何软件对硬盘的读写操作的程序,通过它,你可以查到某个程序对你的硬盘的什么位置的什么文件进行了操作,这个程序只能在管理员帐户下用(切入系统进程)。
2、对于注册表的监视是很麻烦的事,《Regmon》可以办到,同上面的工具一样Regmon要求在管理员帐户下用(切入系统进程)。
3、90%的软件和上面的两个软件无冲突,省下的9%的是作者有意防止被监视(为什么有意防止被监,那你就自个想吧,一般都是比较可怕的东西),最后1%可能是因为程序实在相互不兼容了。
以上两工具都为同一公司(Sysinternals)出品,值得一用,附在最后(XTJS.rar)。
三、并非所有的不能在受限帐户下用的程序都不是纯绿的。某些程序可能要切入别的系统程序中,某些程序需要得到硬件信息等,这些最只有在管理员帐户下才能实现。还有一些程序可能没有考虑多用户操作系统等。只能说,通过了上面的测试的程序90%是纯绿的,没有通过的话90%是非纯绿的。有经验的朋友还可以据自已的经验得到更准确的结论。参考资料:以上资料,从网上下载的,与本人无关
病情分析:
你好咳嗽是人体清除呼吸道内的分泌物或异物的保护性呼吸反射动作。虽然有其有利的一面,但剧烈长期咳嗽可导致呼吸道出血。
指导意见:
你好小孩还是采用食疗生姜红糖大蒜孩子患了风寒感冒,喝温热的生姜红糖水能起到很好的治疗作用,如果孩子同时还伴有咳嗽,可在生姜红糖水里再加2~3瓣大蒜一起煮,要用小火煮10分钟,把蒜头的辣味煮掉,这样孩子才肯喝。
病情分析:
您好,主要原因估计还是身体抵抗力下降,建议注意饮食营养,尽量不要吃辛辣的食物。
指导意见:
一般情况下,感冒可在1~2周内自愈。至今尚无特效药物能快速治疗感冒,只能帮您减轻症状等,除了服用白加黑等常用抗感冒药物外,建议也可以食疗治疗感冒,如可以多喝一些鸡汤、可乐加生姜片加热后饮用、另外绿叶蔬菜含有较多的维生素C,对感冒病毒有一定抑制作用。
病情分析:
您好,小孩经常感冒是因为免疫力低下导致的
指导意见:
一般来说补充一些免疫球蛋白就可以的,以后就不会这么容易感冒,至于咳嗽的话可以吃点中成药。
病情分析:
您好,宝宝的咳嗽最主要的还是要找寻原因的,如果您家的宝宝的这个感冒咳嗽不断的话还是要建议您一是给宝宝查找有无过敏性的因素,二是要看看有无支原体感染等的情况。
指导意见:
因此您最好是要上正规医院进行诊疗的,不同的原因治疗方法完全不同的,咳嗽的治疗无外乎是对症治疗以及对因治疗二部分的。
病情分析:
你这个是典型的小孩子免疫力低下引起的反复感冒。
指导意见:
你这个我建议可以让孩子喝枇杷膏,效果很好而且是中药成分。然后记得让孩子每天晚上睡觉之前泡热水脚,泡二十分钟。以后就不会那么经常的感冒了。
病情分析:
如果总是咳嗽我个人认为应该是有炎症。
指导意见:
中药川贝炖雪梨对孩子的恢复也有很好的帮助,平时注意多给孩子喝水,一定要注意保暖,避免着凉引起感冒
病情分析:
你好,你说的这种情况考虑是抵抗力差引起的,不要担心。
指导意见:
你好,像你说的这种情况我建议你等孩子病好后给孩子吃点蛋白粉和合生元就可以的,多带孩子锻炼身体,长大点会好的,祝你生活愉快。
'补模块3文件。一个放不下。
'
' 渲染子程序,将新的帧数据渲染到 lpDIBitsRender 中
' 算法:
' posx = Wave1(x-1,y)-Wave1(x+1,y)+x
' posy = Wave1(x,y-1)-Wave1(x,y+1)+y
' SourceBmp(x,y) = DestBmp(posx,posy)
'
Public Sub WaveRender(lpWaveObject As WAVE_OBJECT)
Dim dwPosX As Long, dwPosY As Long, dwPtrSource As Long, dwPtrDest As Long, dwFlag As Long
Dim lpWave1 As Long, LineIdx As Long, LinePtr As Long
Dim lpDIBitsSource As Long, lpDIBitsRender As Long
Dim I As Long, J As Long
dwFlag = 0
With lpWaveObject
'Debug.Print "WaveRender " .dwFlag
If (.dwFlag And F_WO_ACTIVE) = 0 Then Exit Sub
.dwFlag = .dwFlag Or F_WO_NEED_UPDATE
lpWave1 = .lpWave1
LineIdx = .dwWaveByteWidth '像素指针
For I = 1 To .dwBmpHeight - 2
For J = 0 To .dwBmpWidth - 1
'********************************************************************
' PosY=i+像素上1能量-像素下1能量
' PosX=j+像素左1能量-像素右1能量
'********************************************************************
'LineIdx = LineIdx - .dwWaveByteWidth
LinePtr = lpWave1 + LineIdx - .dwWaveByteWidth
pLongPtr(0) = LinePtr
dwPosY = pLong(0)
LinePtr = lpWave1 + LineIdx + .dwWaveByteWidth
pLongPtr(0) = LinePtr
dwPosY = dwPosY - pLong(0) + I
LinePtr = lpWave1 + LineIdx - 4
pLongPtr(0) = LinePtr
dwPosX = pLong(0)
LinePtr = lpWave1 + LineIdx + 4
pLongPtr(0) = LinePtr
dwPosX = dwPosX - pLong(0) + J
If dwPosX 0 Or dwPosY 0 Then GoTo Continue
If dwPosX = .dwBmpWidth Or dwPosY = .dwBmpHeight Then GoTo Continue
'********************************************************************
' ptrSource = dwPosY * dwDIByteWidth + dwPosX * 3
' ptrDest = i * dwDIByteWidth + j * 3
'********************************************************************
'dwPtrSource = dwPosY * .dwDIByteWidth + (dwPosX + dwPosX * 2)
dwPosX = dwPosX + dwPosX * 2 'dwPosX * 3
dwPtrSource = dwPosY * .dwDIByteWidth + dwPosX
dwPtrDest = I * .dwDIByteWidth + (J + J * 2) 'dwPtrDest = I * .dwDIByteWidth + J * 3
'********************************************************************
' 渲染像素 [ptrDest] = 原始像素 [ptrSource]
'********************************************************************
lpDIBitsSource = .lpDIBitsSource + dwPtrSource
lpDIBitsRender = .lpDIBitsRender + dwPtrDest
If dwPtrSource dwPtrDest Then
dwFlag = dwFlag Or 1 '如果存在源像素和目标像素不同,则表示还在活动状态
' Debug.Print dwPtrSource " SR " dwPtrDest
'CopyMemory ByVal lpDIBitsRender, ByVal lpDIBitsSource, 3
Call WaveGetPixel(lpDIBitsSource, lpDIBitsRender, .dwDIByteWidth)
Else
CopyMemory ByVal lpDIBitsRender, ByVal lpDIBitsSource, 3
End If
'********************************************************************
' 继续循环
'********************************************************************
Continue:
LineIdx = LineIdx + 4 '像素++ '指针4个字节
Next 'J
Next 'I
SetDIBits .hDcRender, .hBmpRender, 0, .dwBmpHeight, .lpDIBitsRender, .stBmpInfo, DIB_RGB_COLORS
If dwFlag = 0 Then .dwFlag = .dwFlag And (Not F_WO_ACTIVE)
'Debug.Print "WaveRender " .dwFlag
End With
End Sub
Public Sub WaveUpdateFrame(lpWaveObject As WAVE_OBJECT, ByVal hdc As Long, bIfForce As Boolean)
'Dim ret As Long
With lpWaveObject
If bIfForce = True Then GoTo labUpdate
If (.dwFlag And F_WO_NEED_UPDATE) Then
'ret = SetDIBitsToDevice(.hDcRender, 0, 0, .dwBmpWidth, .dwBmpHeight, 0, 0, 0, .dwBmpHeight, .lpDIBitsRender, .stBmpInfo, DIB_RGB_COLORS)
'ret = SetDIBits(.hDcRender, .hBmpRender, 0, .dwBmpHeight, .lpDIBitsRender, .stBmpInfo, DIB_RGB_COLORS)
'SetDIBits .hDcRender, .hBmpRender, 0, .dwBmpHeight, .lpDIBitsRender, .stBmpInfo, DIB_RGB_COLORS
labUpdate:
BitBlt hdc, 0, 0, .dwBmpWidth, .dwBmpHeight, .hDcRender, 0, 0, SRCCOPY
.dwFlag = .dwFlag And (Not F_WO_NEED_UPDATE)
End If
End With
End Sub
'
' 扔一块石头
'
Public Sub WaveDropStone(lpWaveObject As WAVE_OBJECT, ByVal dwPosX As Long, ByVal dwPosY As Long, ByVal dwStoneSize As Long, ByVal dwStoneWeight As Long)
Dim dwSize As Long
Dim dwX1 As Long, dwX2 As Long
Dim dwY1 As Long, dwY2 As Long, dwY3 As Long
'Dim dwMaxX As Long, dwMaxY As Long
Dim LinePtr As Long
With lpWaveObject
'Debug.Print "WaveDropStone " .dwFlag
'********************************************************************
' 计算范围
'********************************************************************
dwSize = dwStoneSize \ H2 '2 ^ 1
dwX1 = dwPosX + dwSize
dwX2 = dwPosX - dwSize
If (.dwFlag And F_WO_ELLIPSE) Then dwSize = dwSize \ H2 ' 2 ^ 1
dwY1 = dwPosY + dwSize
dwY2 = dwPosY - dwSize
dwSize = dwStoneSize
If dwSize = 0 Then dwSize = dwSize + 1
'********************************************************************
' 判断范围的合法性
'********************************************************************
If dwX1 + 1 = .dwBmpWidth Or dwX2 1 Or dwY1 + 1 = .dwBmpHeight Or dwY2 1 Then Exit Sub
'********************************************************************
' 将范围内的点的能量置为 dwStoneWeight
'********************************************************************
While dwX2 = dwX1
dwY3 = dwY2
While dwY3 = dwY1
'(x-x0)^2+(y-y0)^2=r^2 就在圆内
If (dwX2 - dwPosX) * (dwX2 - dwPosX) + (dwY3 - dwPosY) * (dwY3 - dwPosY) = dwSize * dwSize Then
LinePtr = .lpWave1 + (dwY3 * .dwBmpWidth + dwX2) * H4 '2 ^ 2
pLongPtr(0) = LinePtr
pLong(0) = dwStoneWeight
End If
dwY3 = dwY3 + 1
Wend
dwX2 = dwX2 + 1
Wend
.dwFlag = .dwFlag Or F_WO_ACTIVE
End With
End Sub
'
' 计算扩散数据、渲染位图、更新窗口、处理特效的定时器过程
'
Public Sub WaveTimerProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
Dim hdc As Long
Dim dwPosX As Long, dwPosY As Long, dwSize As Long, dwWeight As Long
Dim lpWaveObj As Long
'建立模拟指针
Dim pWAVE_OBJECT() As WAVE_OBJECT
Dim pWAVE_OBJECTPtr() As Long
Dim SApWAVE_OBJECT As SAFEARRAY1D
Dim SApWAVE_OBJECTPtr As SAFEARRAY1D
With SApWAVE_OBJECT
.cDims = 1
.fFeatures = 0
.cbElements = 1
.cLocks = 0
.pvData = 0
.Bounds(0).lLbound = 0
.Bounds(0).cElements = 1
End With
With SApWAVE_OBJECTPtr
.cDims = 1
.fFeatures = 0
.cbElements = 4
.cLocks = 0
.pvData = VarPtr(SApWAVE_OBJECT.pvData)
.Bounds(0).lLbound = 0
.Bounds(0).cElements = 1
End With
CopyMemory ByVal VarPtrArray(pWAVE_OBJECT), VarPtr(SApWAVE_OBJECT), 4
CopyMemory ByVal VarPtrArray(pWAVE_OBJECTPtr), VarPtr(SApWAVE_OBJECTPtr), 4
lpWaveObj = idEvent
pWAVE_OBJECTPtr(0) = lpWaveObj
'Debug.Print "WaveTimerProc " pWAVE_OBJECT(0).dwFlag
Call WaveSpread(pWAVE_OBJECT(0))
Call WaveRender(pWAVE_OBJECT(0))
With pWAVE_OBJECT(0)
If (.dwFlag And F_WO_NEED_UPDATE) Then
hdc = GetDC(.hWnd)
Call WaveUpdateFrame(pWAVE_OBJECT(0), hdc, False)
Call ReleaseDC(.hWnd, hdc)
End If
'********************************************************************
' 特效处理
'********************************************************************
If (.dwFlag And F_WO_EFFECT) = 0 Then Exit Sub
Select Case .dwEffectType
'********************************************************************
' Type = 1 雨点,Param1=速度(0最快,越大越慢),Param2=雨点大小,Param3=能量
'********************************************************************
Case 1
'Dim ret As Long
If .dwEffectParam1 0 Then Call WaveRandom(pWAVE_OBJECT(0), .dwEffectParam1) 'ret = WaveRandom(pWAVE_OBJECT(0), .dwEffectParam1)
'If ret = 0 Then
dwPosX = WaveRandom(pWAVE_OBJECT(0), .dwBmpWidth - 2) + 1
dwPosY = WaveRandom(pWAVE_OBJECT(0), .dwBmpHeight - 2) + 1
dwSize = WaveRandom(pWAVE_OBJECT(0), .dwEffectParam2) + 1
dwWeight = WaveRandom(pWAVE_OBJECT(0), .dwEffectParam3) + 50
Call WaveDropStone(pWAVE_OBJECT(0), dwPosX, dwPosY, dwSize, dwWeight)
'End If
'********************************************************************
' Type = 2 行船,Param1=速度(0最快,越大越快),Param2=大小,Param3=能量
'********************************************************************
Case 2
.dwEff2Flip = .dwEff2Flip + 1
If (.dwEff2Flip And 1) 0 Then Exit Sub
dwPosX = .dwEff2X + .dwEff2XAdd
dwPosY = .dwEff2Y + .dwEff2YAdd
If dwPosX 1 Then
dwPosX = -(dwPosX - 1)
.dwEff2XAdd = -.dwEff2XAdd
End If
If dwPosY 1 Then
dwPosY = -(dwPosY - 1)
.dwEff2YAdd = -.dwEff2YAdd
End If
If dwPosX .dwBmpWidth - 1 Then
dwPosX = (.dwBmpWidth - 1) - (dwPosX - (.dwBmpWidth - 1)) '(.dwBmpWidth - 1)*2 -dwPosX
.dwEff2XAdd = -.dwEff2XAdd
End If
If dwPosY .dwBmpHeight - 1 Then
dwPosY = (.dwBmpHeight - 1) - (dwPosY - (.dwBmpHeight - 1)) '(.dwBmpHeight-1)*2-dwPosY
.dwEff2YAdd = -.dwEff2YAdd
End If
.dwEff2X = dwPosX
.dwEff2Y = dwPosY
Call WaveDropStone(pWAVE_OBJECT(0), dwPosX, dwPosY, .dwEffectParam2, .dwEffectParam3)
'********************************************************************
' Type = 3 波浪,Param1=密度,Param2=大小,Param3=能量
'********************************************************************
Case 3
Dim I As Long
For I = 0 To .dwEffectParam1
dwPosX = WaveRandom(pWAVE_OBJECT(0), .dwBmpWidth - 2) + 1
dwPosY = WaveRandom(pWAVE_OBJECT(0), .dwBmpHeight - 2) + 1
dwSize = WaveRandom(pWAVE_OBJECT(0), .dwEffectParam2) + 1
dwWeight = WaveRandom(pWAVE_OBJECT(0), .dwEffectParam3)
Call WaveDropStone(pWAVE_OBJECT(0), dwPosX, dwPosY, dwSize, dwWeight)
Next
End Select
End With
'取消模拟指针
CopyMemory ByVal VarPtrArray(pWAVE_OBJECT), 0, 4
CopyMemory ByVal VarPtrArray(pWAVE_OBJECTPtr), 0, 4
End Sub
'
'释放对象
'
Public Sub WaveFree(lpWaveObject As WAVE_OBJECT)
With lpWaveObject
If .hDcRender 0 Then DeleteDC (.hDcRender)
If .hBmpRender 0 Then DeleteObject .hBmpRender
If .lpDIBitsSource 0 Then GlobalFree .lpDIBitsSource
If .lpDIBitsRender 0 Then GlobalFree .lpDIBitsRender
If .lpWave1 0 Then GlobalFree .lpWave1
If .lpWave2 0 Then GlobalFree .lpWave2
KillTimer .hWnd, VarPtr(lpWaveObject)
ZeroMemory ByVal VarPtr(lpWaveObject), Len(lpWaveObject)
'-----------------------------------------------------------
'取消模拟指针
CopyMemory ByVal VarPtrArray(pLong), 0, 4
CopyMemory ByVal VarPtrArray(pLongPtr), 0, 4
'-----------------------------------------------------------------
'取消模拟指针
CopyMemory ByVal VarPtrArray(pByte), 0, 4
CopyMemory ByVal VarPtrArray(pBytePtr), 0, 4
'-----------------------------------------------------------
End With
End Sub
'
' 初始化对象
' 参数:_lpWaveObject = 指向 WAVE_OBJECT结构体
' 返回:0 成功、 1 失败
'
Public Function WaveInit(lpWaveObject As WAVE_OBJECT, ByVal hWnd As Long, ByVal hBmp As Long, ByVal dwSpeed As Long, ByVal dwType As WaveType) As Long
Dim stBmp As BITMAP
Dim dwReturn As Long
Dim ret As Long
Dim hdc As Long
Dim hMDC As Long
'-----------------------------------------------------------------
'建立模拟指针
With SApLong
.cDims = 1
.fFeatures = 0
.cbElements = 1
.cLocks = 0
.pvData = 0
.Bounds(0).lLbound = 0
.Bounds(0).cElements = 1
End With
With SApLongPtr
.cDims = 1
.fFeatures = 0
.cbElements = 4
.cLocks = 0
.pvData = VarPtr(SApLong.pvData)
.Bounds(0).lLbound = 0
.Bounds(0).cElements = 1
End With
CopyMemory ByVal VarPtrArray(pLong), VarPtr(SApLong), 4
CopyMemory ByVal VarPtrArray(pLongPtr), VarPtr(SApLongPtr), 4
'-----------------------------------------------------------------
'建立模拟指针
With SApByte
.cDims = 1
.fFeatures = 0
.cbElements = 1
.cLocks = 0
.pvData = 0
.Bounds(0).lLbound = 0
.Bounds(0).cElements = 3
End With
With SApBytePtr
.cDims = 1
.fFeatures = 0
.cbElements = 4
.cLocks = 0
.pvData = VarPtr(SApByte.pvData)
.Bounds(0).lLbound = 0
.Bounds(0).cElements = 1
End With
CopyMemory ByVal VarPtrArray(pByte), VarPtr(SApByte), 4
CopyMemory ByVal VarPtrArray(pBytePtr), VarPtr(SApBytePtr), 4
'-----------------------------------------------------------------
dwReturn = 0
ZeroMemory ByVal VarPtr(lpWaveObject), Len(lpWaveObject)
'ZeroMemory lpWaveObject, H84 ' Len(WAVE_OBJECT)
With lpWaveObject
If dwType = sEllipse Then
.dwFlag = .dwFlag Or F_WO_ELLIPSE
End If
'********************************************************************
' 获取位图尺寸
'********************************************************************
.hWnd = hWnd
.dwRandom = GetTickCount()
ret = GetObject(hBmp, Len(stBmp), stBmp)
If ret = 0 Then
dwReturn = 1
GoTo result
End If
.dwBmpHeight = stBmp.bmHeight
'if lpWaveObject.dwBmpHeight 3 then dwReturn = 1:GoTo result
.dwBmpWidth = stBmp.bmWidth
'if lpWaveObject.dwBmpWidth 3 then dwReturn = 1:GoTo result
.dwWaveByteWidth = stBmp.bmWidth * H4 '2 ^ 2 'dwBmpWidth * 4
.dwDIByteWidth = (stBmp.bmWidth + stBmp.bmWidth * 2 + 3) And (Not H3) '(dwBmpWidth * 3 + 3) and ~3 ' ((W * 3 + 3) And (Not 3))
'********************************************************************
' 创建用于渲染的位图
'********************************************************************
hdc = GetDC(hWnd)
.hDcRender = CreateCompatibleDC(hdc)
.hBmpRender = CreateCompatibleBitmap(hdc, .dwBmpWidth, .dwBmpHeight)
'MsgBox .hBmpRender
SelectObject .hDcRender, .hBmpRender
'********************************************************************
' 分配波能缓冲区
'********************************************************************
.lpWave1 = GlobalAlloc(GPTR, .dwWaveByteWidth * .dwBmpHeight)
.lpWave2 = GlobalAlloc(GPTR, .dwWaveByteWidth * .dwBmpHeight)
'********************************************************************
' 分配像素缓冲区
'********************************************************************
.lpDIBitsSource = GlobalAlloc(GPTR, .dwDIByteWidth * .dwBmpHeight)
.lpDIBitsRender = GlobalAlloc(GPTR, .dwDIByteWidth * .dwBmpHeight)
'********************************************************************
' 获取原始像素数据
'********************************************************************
'With .stBmpInfo.bmiHeader
.stBmpInfo.bmiHeader.biSize = Len(.stBmpInfo.bmiHeader) ' H28 'len(BITMAPINFOHEADER)
.stBmpInfo.bmiHeader.biWidth = .dwBmpWidth
.stBmpInfo.bmiHeader.biHeight = -.dwBmpHeight '- .dwBmpHeight
.stBmpInfo.bmiHeader.biPlanes = 1
.stBmpInfo.bmiHeader.biBitCount = 24
.stBmpInfo.bmiHeader.biCompression = BI_RGB
.stBmpInfo.bmiHeader.biSizeImage = 0
'End With
hMDC = CreateCompatibleDC(hdc)
SelectObject hMDC, hBmp
ReleaseDC hWnd, hdc
GetDIBits hMDC, hBmp, 0, .dwBmpHeight, .lpDIBitsSource, .stBmpInfo, DIB_RGB_COLORS
GetDIBits hMDC, hBmp, 0, .dwBmpHeight, .lpDIBitsRender, .stBmpInfo, DIB_RGB_COLORS
DeleteDC hMDC
If .lpWave1 = 0 Or .lpWave2 = 0 Or .lpDIBitsSource = 0 Or .lpDIBitsRender = 0 Or .hDcRender = 0 Then
WaveFree lpWaveObject
dwReturn = 1
End If
'Debug.Print "WaveInit " .dwFlag
SetTimer hWnd, ByVal VarPtr(lpWaveObject), dwSpeed, AddressOf WaveTimerProc
.dwFlag = .dwFlag Or F_WO_ACTIVE Or F_WO_NEED_UPDATE
'Debug.Print "WaveInit " .dwFlag
WaveRender lpWaveObject
hdc = GetDC(.hWnd)
WaveUpdateFrame lpWaveObject, hdc, True
ReleaseDC .hWnd, hdc
End With
'********************************************************************
result:
WaveInit = dwReturn
End Function
'
' 一些特效
' 输入:dwType = 0 关闭特效
' dwType 0 开启特效,参数具体见上面
'
Public Sub WaveEffect(lpWaveObject As WAVE_OBJECT, ByVal dwEffectType As WaveEffectType, ByVal dwParam1 As Long, ByVal dwParam2 As Long, ByVal dwParam3 As Long)
Dim dwMaxX As Long, dwMaxY As Long
With lpWaveObject
' Debug.Print "WaveEffect " .dwFlag
Select Case dwEffectType
Case wClose '关闭特效
.dwFlag = .dwFlag And (Not F_WO_EFFECT)
.dwEffectType = dwEffectType
Exit Sub
'Case wrain '下雨
Case wLaunch '汽艇
.dwEff2XAdd = dwParam1
.dwEff2YAdd = dwParam1
.dwEff2X = WaveRandom(lpWaveObject, .dwBmpWidth - 2) + 1
.dwEff2Y = WaveRandom(lpWaveObject, .dwBmpHeight - 2) + 1
' .dwEffectType = dwEffectType
' .dwEffectParam1 = dwParam1
' .dwEffectParam2 = dwParam2
' .dwEffectParam3 = dwParam3
' .dwFlag = .dwFlag Or F_WO_EFFECT
'Case wWaves '风浪
'Case Else '默认
End Select
.dwEffectType = dwEffectType
.dwEffectParam1 = dwParam1
.dwEffectParam2 = dwParam2
.dwEffectParam3 = dwParam3
.dwFlag = .dwFlag Or F_WO_EFFECT
End With
End Sub
完
用wpf容易一些。令窗体透明度下降,刷新画面,截图,把窗体背景改成空,放一个Rectangle显示截的图,给那个Rectangle加BlurEffect。定时更换截图。--来自相机+平板电脑+手机融合成的的Lumia 1520
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
binddata()
End If
End Sub
Public Sub binddata()
'
End Sub
'编辑中
Protected Sub GridView1_RowEditing(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewEditEventArgs) Handles GridView1.RowEditing
GridView1.EditIndex = e.NewEditIndex
'当前编辑行背景色高亮
GridView1.EditRowStyle.BackColor = Color.FromName("#F7CE90")
binddata()
End Sub
'分页
Protected Sub GridView1_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles GridView1.PageIndexChanging
GridView1.PageIndex = e.NewPageIndex
binddata() '重新绑定GridView数据的函数
End Sub
'更新
Protected Sub GridView1_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles GridView1.RowUpdating
Dim clsB As New sqlDLTP.business
Dim sqlstr As String
Dim ds As New DataSet
sqlstr = "select hbdwno from etsshbd where hbdcnm='" CType(GridView1.Rows(e.RowIndex).FindControl("TextBox1"), TextBox).Text.ToString().Trim() "'"
ds = clsB.queryitems(sqlstr)
Dim wno As String = ds.Tables(0).Rows(0)(0).ToString().Trim()
sqlstr = "update etsdl set okscore1='" _
CType(GridView1.Rows(e.RowIndex).FindControl("TextBox6"), TextBox).Text.ToString().Trim() "',okscore2='" _
CType(GridView1.Rows(e.RowIndex).FindControl("TextBox7"), TextBox).Text.ToString().Trim() "',okscore='" _
CType(GridView1.Rows(e.RowIndex).FindControl("TextBox8"), TextBox).Text.ToString().Trim() "',okreport='" _
CType(GridView1.Rows(e.RowIndex).FindControl("TextBox9"), TextBox).Text.ToString().Trim() "',okgrad='" _
CType(GridView1.Rows(e.RowIndex).FindControl("TextBox10"), TextBox).Text.ToString().Trim() "',memo='" _
CType(GridView1.Rows(e.RowIndex).FindControl("TextBox12"), TextBox).Text.ToString().Trim() "' where trano='" _
GridView1.DataKeys(e.RowIndex).Value.ToString() "' and wno='" wno "'"
clsB.ExeSqlCmd(sqlstr)
GridView1.EditIndex = -1
binddata()
End Sub
'取消
Protected Sub GridView1_RowCancelingEdit(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCancelEditEventArgs) Handles GridView1.RowCancelingEdit
GridView1.EditIndex = -1
binddata()
End Sub
'删除
Protected Sub GridView1_RowDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles GridView1.RowDeleting
Dim clsB As New sqlDLTP.business
Dim sqlstr As String
Dim ds As New DataSet
sqlstr = "select hbdwno from etsshbd where hbdcnm='" CType(GridView1.Rows(e.RowIndex).FindControl("Label1"), Label).Text.ToString().Trim() "'"
ds = clsB.queryitems(sqlstr)
Dim wno As String = ds.Tables(0).Rows(0)(0).ToString().Trim()
sqlstr = "delete etsdl where trano=" GridView1.DataKeys(e.RowIndex).Value.ToString().Trim() "and wno='" wno "'"
clsB.ExeSqlCmd(sqlstr)
binddata()
End Sub
'绑定行,特效及链接列属性分配等
Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
'鼠标经过时,行背景色变
e.Row.Attributes.Add("onmouseover", "this.style.backgroundColor='#E6F5FA'")
'鼠标移出时,行背景色变
e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor='#FFFFFF'")
' HyperLink列给链接值
CType(e.Row.Cells(1).FindControl("HyperLink1"), HyperLink).NavigateUrl = "javascript:void window.open('trashow.aspx?tno=" + CType(e.Row.Cells(1).FindControl("HyperLink1"), HyperLink).Text + "','', 'left='+(window.top.screen.width-454)/2+',top='+(window.top.screen.height-454)/2+',width=625,height=500,scrollbars=yes,resizeable=yes');"
'当有编辑列时,避免出错,要加的RowState判断
If e.Row.RowState = DataControlRowState.Normal Or e.Row.RowState = DataControlRowState.Alternate Then
If CType(e.Row.Cells(12).FindControl("Label11"), Label).Text = "1" Then
CType(e.Row.Cells(12).FindControl("Label11"), Label).Text = "在职"
End If
End If
End If
End Sub
前台:
asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" Width=100% BackColor="White" BorderColor="White" BorderStyle="Ridge" BorderWidth="2px" CellPadding="3" CellSpacing="1" GridLines="None" AllowPaging="True" AllowSorting="True"
!-- --
/asp:GridView
vb6.0只是VB版本中的一个版本
但是,由于现在VB6.0最流行
所以通常所说的VB编程
大部分都是用vb6.0来进行的
从严格的定义上不是一个概念