JavaScript 常见问题解答,持续收集中

JS技巧集锦
本文汇总了多种实用的JavaScript技巧,包括获取URL参数、操作Cookie、实现文件下载等,同时还介绍了如何自定义提示条、实现刷新后不变的文本框等功能。

Q:javascript中获取地址栏参数例如 index.asp?aaa=xxx&bbb=xxx,怎么用javascript取到QureyString中参数的名称呢?
A:
      方案一:由于url里面的参数是不区分大小写的,而javascript是区分大小写的,所以我这里把全部的字符都转换成大写以后才进行处理。所以返回的内容一定是全部大写的字符串,所以大家在使用这个函数的时候要注意这一点。

方案一
 1function getValue(name) 
 2{
 3    var str=window.location.search.toUpperCase(); 
 4    name = name.toUpperCase();
 5
 6    if (str.indexOf(name)!=-1
 7    {
 8        var pos_start=str.indexOf(name)+name.length+1
 9        var pos_end=str.indexOf("&",pos_start); 
10        if (pos_end==-1
11        {
12            return str.substring(pos_start).toUpperCase(); 
13        }

14        else
15        {
16            return str.substring(pos_start,pos_end).toUpperCase();
17        }

18    }
 
19    else 
20    
21        return ""
22    }
 
23}
 
24

      方案二:直接拆分成Array了,可以直接通过Array获取

方案二
 1function getValue(name)
 2{
 3    var URLParams = new Array(); 
 4    var aParams = document.location.search.substr(1).split('&'); 
 5    for (i=0; i < aParams.length i++)
 6    
 7        var aParam = aParams.split('='); 
 8        URLParams[aParam[0]] = aParam[1]; 
 9    }

10    return URLParams["name"]
11}

12

       方案三:这个用正则表达式分析出来的

方案三
1<script type="text/javascript"> 
2Request = { QueryString : function(item)var svalue = location.search.match(new RegExp("[\?\&]" + item + "=([^\&]*)(\&?)","i")); return svalue ? svalue[1] : svalue; } } 
3alert(Request.QueryString("id")); 
4</script>

 
Q:如何实现刷新后不变的文本框
A:

刷新后不变的文本框
 1<HTML>
 2    <HEAD>
 3        <META NAME="save" CONTENT="history">
 4        <STYLE>
 5            .sHistory {behavior:url(#default#savehistory);}
 6        </STYLE>
 7    </HEAD>
 8    <BODY>
 9        <INPUT class=sHistory type=text id=oPersistInput>
10    </BODY>
11</HTML>

Q:如何访问剪贴板
A:
       (1)拖拽访问
             event.dataTransfer.setData("URL", oImage.src);
             sImageURL = event.dataTransfer.getData("URL")
       (2)普通访问
             window.clipboardData.setData("Text",oSource.innerText);
             window.clipboardData.getData("Text");

Q:如何操作COOKIE
A:

操作COOKIE
 1function SetCookie(sName, svalue)
 2{
 3    documents.cookie = sName + "=" + escape(svalue) + "";
 4}

 5function GetCookie(sName)
 6{
 7    var aCookie = documents.cookie.split("");
 8    for (var i=0; i < aCookie.length; i++)
 9    {
10        var aCrumb = aCookie[i].split("=");
11        if (sName == aCrumb[0])
12        return unescape(aCrumb[1]);
13    }

14
15}

16function DelCookie(sName)
17{
18    documents.cookie = sName + "=" + escape(svalue) + "; expires=Fri, 31 Dec 1999 23:59:59 GMT;";
19}

20

Q:如何让setTimeout增加参数
A:

给setTimeout增加参数
 1<script>
 2var _st = window.setTimeout;
 3window.setTimeout = function(fRef, mDelay) 
 4{
 5    if(typeof fRef == 'function')
 6    {
 7        var argu = Array.prototype.slice.call(arguments,2);
 8        var f = (function(){ fRef.apply(null, argu); });
 9        return _st(f, mDelay);
10    }

11    return _st(fRef,mDelay);
12}

13function test(x)
14{
15    alert(x);
16}

17window.setTimeout(test,1000,'fason');
18</script>

Q:如何自定义apply,call
A:

自定义apply,call
 1Function.prototype.apply = function (obj, argu) 
 2{
 3    if (obj) obj.constructor.prototype._caller = this;
 4    var argus = new Array();
 5    for (var i=0;i<argu.length;i++)
 6        argus[i] = "argu[" + i + "]";
 7    var r;
 8    eval("r = " + (obj ? ("obj._caller(" + argus.join(","+ ");") : ("this(" + argus.join(","+ ");")));
 9    return r;
10}
;
11Function.prototype.call = function (obj) 
12{
13    var argu = new Array();
14    for (var i=1;i<arguments.length;i++)
15        argu[i-1= arguments[i];
16    return this.apply(obj, argu);
17}
;
18

Q:如何实现文件下载
A:

实现文件下载
 1function DownURL(strRemoteURL,strLocalURL)
 2{
 3    try
 4    {
 5        var xmlHTTP=new ActiveXObject("Microsoft.XMLHTTP");
 6        xmlHTTP.open("Get",strRemoteURL,false);
 7        xmlHTTP.send();
 8        var adodbStream=new ActiveXObject("ADODB.Stream");
 9        adodbStream.Type=1;//1=adTypeBinary
10        adodbStream.Open();
11        adodbStream.write(xmlHTTP.responseBody);
12        adodbStream.SaveToFile(strLocalURL,2);
13        adodbStream.Close();
14        adodbStream=null;
15        xmlHTTP=null;
16    }

17    catch(e)
18    {
19        window.confirm("下载URL出错!");
20    }

21    window.confirm("下载完成.");
22}

Q:如何检查一个URL是否有效
A:

检查URL是否有效
 1function getXML(URL)
 2{
 3    var xmlhttp = new ActiveXObject("microsoft.xmlhttp");
 4    xmlhttp.Open("GET",URL, false);
 5    try
 6    {
 7        xmlhttp.Send();
 8    }

 9    catch(e){}
10    finally
11    {
12        var result = xmlhttp.responseText;
13        if(result)
14        {
15            if(xmlhttp.Status==200)
16            {
17                return(true);
18            }

19            else
20            {
21                return(false);
22            }

23        }

24        else
25        {
26            return(false);
27        }

28    }

29}

Q:如何实现用POST代替FORM
A:

用POST代替FORM
 1<SCRIPT language="VBScript">
 2Function URLEncoding(vstrIn)
 3    strReturn = ""
 4    For i = 1 To Len(vstrIn)
 5    ThisChr = Mid(vStrIn,i,1)
 6    If Abs(Asc(ThisChr)) < &HFF Then
 7        strReturn = strReturn & ThisChr
 8    Else
 9        innerCode = Asc(ThisChr)
10        If innerCode < 0 Then
11            innerCode = innerCode + &H10000
12        End If
13        Hight8 = (innerCode And &HFF00)\ &HFF
14        Low8 = innerCode And &HFF
15        strReturn = strReturn & "%" & Hex(Hight8) & "%" & Hex(Low8)
16    End If
17    Next
18    URLEncoding = strReturn
19End Function
20
21Function bytes2BSTR(vIn)
22    strReturn = ""
23    For i = 1 To LenB(vIn)
24        ThisCharCode = AscB(MidB(vIn,i,1))
25        If ThisCharCode < &H80 Then
26            strReturn = strReturn & Chr(ThisCharCode)
27        Else
28            NextCharCode = AscB(MidB(vIn,i+1,1))
29            strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))
30            i = i + 1
31        End If
32    Next
33    bytes2BSTR = strReturn
34End Function
35
36dim strA,oReq
37strA = URLEncoding("submit1=Submit&text1=中文")
38set oReq = CreateObject("MSXML2.XMLHTTP")
39oReq.open "POST","http://ServerName/VDir/TstResult.asp",false
40oReq.setRequestHeader "Content-Length",Len(strA)
41oReq.setRequestHeader "CONTENT-TYPE","application/x-www-form-urlencoded"
42oReq.send strA
43msgbox bytes2BSTR(oReq.responseBody)
44</SCRIPT>

Q:如何用javascript 写服务器端连接数据库
A:

用javascript 写服务器端连接数据库的代码示例
 1<script language="javascript">
 2//用 javascript 写服务器端连接数据库的代码示例
 3var conn = new ActiveXObject("ADODB.Connection");
 4conn.Open("Provider=SQLOLEDB.1; Data Source=localhost; User ID=sa; Password=sa; Initial Catalog=MyTestDB");
 5var rs = new ActiveXObject("ADODB.Recordset");
 6var sql="select * from T_Memeber";
 7rs.open(sql, conn);
 8shtml = "<table width='100%' border=1>";
 9shtml +="<tr bgcolor='#f4f4f4'><td>au_id</td><td>au_lname</td><td>au_fname</td><td>phone</td><td>address</td><td> city</td><td>state</td><td>zip</td></tr>";
10while(!rs.EOF)
11{
12    shtml += "<tr><td>" + rs("au_id"+ "</td><td>" + rs("au_lname"+ "</td><td>" + rs("au_fname"+ "</td><td>" + rs("phone"+ "</td><td>" + rs("address"+ "</td><td>" + rs("city"+ "</td><td>" + rs("state"+ "</td><td>" + rs("zip"+ "</td></tr>";
13    rs.moveNext;
14}

15shtml += "</table>";
16document.write(shtml);
17rs.close();
18rs = null;
19conn.close();
20conn = null;
21</script>

Q:如何使用数据岛(XML数据集合)
A:

使用XML数据岛
 1<html>
 2<body>
 3    srno:<input type=text datasrc=#xmldate DataFLD=srno size="76"><BR>
 4    times:<input type=text datasrc=#xmldate DataFLD=times size="76"><BR>
 5    <input id="first" TYPE=button value="<< 第一条记录" onclick="xmldate.recordset.moveFirst()">
 6    <input id="prev" TYPE=button value="<上一条记录" onclick="xmldate.recordset.movePrevious()">
 7    <input id="next" TYPE=button value="下一条记录>" onclick="xmldate.recordset.moveNext()">
 8    <input id="last" TYPE=button value="最后一条记录>>" onclick="xmldate.recordset.moveLast()">
 9    <input id="Add" TYPE=button value="添加新记录" onclick="xmldate.recordset.addNew()">
10
11    <XML ID="xmldate">
12    <infolist>
13    <info ><srno>20041025-01</srno><times>null</times></info>
14    <info ><srno>20041101-09</srno><times>2004年10月1日2点22分0秒</times></info>
15    </infolist>
16    </XML>
17</body>
18</html>

Q:作一个可以编辑的下拉选单
A:

可编辑的下拉选单
1<input type=text name=re_name style="width:100px;height:21px;font-size:10pt;">
2<span style="width:18px;border:0px solid red;">
3    <select name="r00" style="margin-left:-100px;width:118px; background-color:#FFEEEE;" onChange="document.all.re_name.value=this.value;">
4        <option value="1">11111111<option>
5        <option value="2">222222</option>
6        <option value="3">333333</option>
7    </select>
8</span>
9

Q:如何使用JavaScript设置光标位置
A:

访问设定光标位置
 1function getCaret(textbox)
 2{
 3    var control = document.activeElement;
 4    textbox.focus();
 5    var rang = document.selection.createRange();
 6    rang.setEndPoint("StartToStart",textbox.createTextRange())
 7    control.focus();
 8    return rang.text.length;
 9}

10function setCaret(textbox,pos)
11{
12    try
13    {
14        var r =textbox.createTextRange();
15        r.moveStart('character',pos);
16        r.collapse(true);
17        r.select();
18    }

19    catch(e)
20    {}
21}

22function selectLength(textbox,start,len)
23{
24    try
25    {
26        var r =textbox.createTextRange();
27
28        r.moveEnd('character',len-(textbox.value.length-start));
29        r.moveStart('character',start);
30
31        r.select();
32    }

33    catch(e)
34    {
35        alert(e.description);
36    }

37}

38function insertAtCaret(textbox,text)
39{
40    textbox.focus();
41    document.selection.createRange().text = text;
42}

Q:如何实现页内查找
A:

页内查找
 1function findInPage(str)
 2{
 3    var txt, i, found,n = 0;
 4    if (str == "")
 5    {
 6        return false;
 7    }

 8    txt = document.body.createTextRange();
 9    for (i = 0; i <= n && (found = txt.findText(str)) != false; i++)
10    {
11        txt.moveStart("character"1);
12        txt.moveEnd("textedit");
13    }

14    if (found)
15    {
16        txt.moveStart("character"-1);
17        txt.findText(str);
18        txt.select();
19        txt.scrollIntoView();
20        n++;
21    }

22    else
23    {
24        if (n > 0)
25        {
26            n = 0;
27            findInPage(str);
28        }

29        else
30        {
31            alert(str + " 您要找的文字不存在。\n \n请试着输入页面中的关键字再次查找!");
32        }

33    }

34    return false;
35}

Q:如何用JavaScript操作Excel
A:

操作Excel代码
 1<script language="javascript">
 2function jStartExcel() 
 3{
 4    var xls = new ActiveXObject ( "Excel.Application" );
 5    xls.visible = true;
 6    var newBook = xls.Workbooks.Add;
 7    newBook.Worksheets.Add;
 8    newBook.Worksheets(1).Activate;
 9    xls.ActiveWorkBook.ActiveSheet.PageSetup.Orientation = 2;
10    xls.ActiveWorkBook.ActiveSheet.PageSetup.PaperSize = 5;
11    newBook.Worksheets(1).Columns("A").columnwidth=50;
12    newBook.Worksheets(1).Columns("A").WrapText = true;
13    newBook.Worksheets(1).Columns("B").columnwidth=50;
14    newBook.Worksheets(1).Columns("B").WrapText = true;
15    newBook.Worksheets(1).Range("A1:B1000").NumberFormat = "0";
16    newBook.Worksheets(1).Range("A1:B1000").HorizontalAlignment = -4131;
17    newBook.Worksheets(1).Cells(1,1).Interior.ColorIndex="15";
18    newBook.Worksheets(1).Cells(1,1).value="First Column, First Cell";
19    newBook.Worksheets(1).Cells(2,1).value="First Column, Second Cell";
20    newBook.Worksheets(1).Cells(1,2).value="Second Column, First Cell";
21    newBook.Worksheets(1).Cells(2,2).value="Second Column, Second Cell";
22    newBook.Worksheets(1).Name="My First WorkSheet";
23}

24</script>

Q:如何自定义提示条
A:

自定义提示条(tip)
 1<a href="#" title="这是提示">tip</a>
 2<script Language="javascript">
 3//***********默认设置定义.*********************
 4tPopWait=50;//停留tWait豪秒后显示提示。
 5tPopShow=5000;//显示tShow豪秒后关闭提示
 6showPopStep=20;
 7popOpacity=99;
 8//***************内部变量定义*****************
 9sPop=null;
10curShow=null;
11tFadeOut=null;
12tFadeIn=null;
13tFadeWaiting=null;
14document.write("<style type='text/css'id='defaultPopStyle'>");
15document.write(".cPopText { background-color: #F8F8F5;color:#000000; border: 1px #000000 solid;font-color: font-size: 12px; padding-right: 4px; padding-left: 4px; height: 20px; padding-top: 2px; padding-bottom: 2px; filter: Alpha(Opacity=0)}");
16document.write("</style>");
17document.write("<div id='dypopLayer' style='position:absolute;z-index:1000;' class='cPopText'></div>");
18
19function showPopupText()
20{
21    var o=event.srcElement;
22    MouseX=event.x;
23    MouseY=event.y;
24    if(o.alt!=null && o.alt!=""){o.dypop=o.alt;o.alt=""};
25    if(o.title!=null && o.title!=""){o.dypop=o.title;o.title=""};
26    if(o.dypop!=sPop) 
27    {
28        sPop=o.dypop;
29        clearTimeout(curShow);
30        clearTimeout(tFadeOut);
31        clearTimeout(tFadeIn);
32        clearTimeout(tFadeWaiting);
33        if(sPop==null || sPop==""
34        {
35            dypopLayer.innerHTML="";
36            dypopLayer.style.filter="Alpha()";
37            dypopLayer.filters.Alpha.opacity=0;
38        }

39        else 
40        {
41            if(o.dyclass!=null) popStyle=o.dyclass
42            else popStyle="cPopText";
43            curShow=setTimeout("showIt()",tPopWait);
44        }

45    }

46}

47
48function showIt()
49{
50    dypopLayer.className=popStyle;
51    dypopLayer.innerHTML=sPop;
52    popWidth=dypopLayer.clientWidth;
53    popHeight=dypopLayer.clientHeight;
54    if(MouseX+12+popWidth>document.body.clientWidth) popLeftAdjust=-popWidth-24
55    else popLeftAdjust=0;
56    if(MouseY+12+popHeight>document.body.clientHeight) popTopAdjust=-popHeight-24
57    else popTopAdjust=0;
58    dypopLayer.style.left=MouseX+12+document.body.scrollLeft+popLeftAdjust;
59    dypopLayer.style.top=MouseY+12+document.body.scrollTop+popTopAdjust;
60    dypopLayer.style.filter="Alpha(Opacity=0)";
61    fadeOut();
62}

63
64function fadeOut()
65{
66    if(dypopLayer.filters.Alpha.opacity<popOpacity) 
67    {
68        dypopLayer.filters.Alpha.opacity+=showPopStep;
69        tFadeOut=setTimeout("fadeOut()",1);
70    }

71    else 
72    {
73    dypopLayer.filters.Alpha.opacity=popOpacity;
74    tFadeWaiting=setTimeout("fadeIn()",tPopShow);
75    }

76}

77
78function fadeIn()
79{
80    if(dypopLayer.filters.Alpha.opacity>0
81    {
82        dypopLayer.filters.Alpha.opacity-=1;
83        tFadeIn=setTimeout("fadeIn()",1);
84    }

85}

86document.onmouseover=showPopupText;
87</script>

Q:如何插入文字
A:

插入文字
 1document.onclick =function()
 2{
 3    var oSource = window.event.srcElement;
 4    if(oSource.tagName!="DIV")
 5        return false;
 6    var sel = document.selection;
 7    if (sel!=null
 8    {
 9        var rng = sel.createRange();
10        if (rng!=null)
11            rng.pasteHTML("<font color=red>插入文字</font>");
12    }

13}

Q:判断键盘输入的键
A:

判断键盘输入
 1<html>
 2<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
 3<head>
 4<script language="javascript">
 5var ie =navigator.appName=="Microsoft Internet Explorer"?true:false;
 6
 7function keyDown(e)
 8{
 9    if(!ie)
10    {
11        var nkey=e.which;
12        var iekey='现在是ns浏览器';
13        var realkey=String.fromCharCode(e.which);
14    }

15    if(ie)
16    {
17        var iekey=event.keyCode;
18        var nkey='现在是ie浏览器';
19        var realkey=String.fromCharCode(event.keyCode);
20        if(event.keyCode==32){realkey='\' 空格\''}
21        if(event.keyCode==13){realkey='\' 回车\''}
22        if(event.keyCode==27){realkey='\' Esc\''}
23        if(event.keyCode==16){realkey='\' Shift\''}
24        if(event.keyCode==17){realkey='\' Ctrl\''}
25        if(event.keyCode==18){realkey='\' Alt\''}
26    }

27    alert('ns浏览器中键值:'+nkey+'\n'+'ie浏览器中键值:'+iekey+'\n'+'实际键为'+realkey);
28}

29document.onkeydown = keyDown;
30
</script>
31</head>
32<body>
33<hr>
34<center>
35<h3>请按任意一个键。。。。</h3>
36</center>
37</body>
38</html>

Q:如何让文本超出的时候自动显示省略号
A:

自动显示省略号
1<DIV STYLE="width: 120px; height: 50px; border: 1px solid blue;overflow: hidden; text-overflow:ellipsis">
2<NOBR>就是比如有一行文字,很长,表格内一行显示不下.</NOBR>
3</DIV>
4

Q:检测Media Player版本
A:

检测MeidaPlayer版本
 1<IE:clientCaps ID="oClientCaps" style="{behavior:url(#default#clientcaps)}" />
 2<SCRIPT>
 3var flash="";
 4WMPVersion= oClientCaps.getComponentVersion("{22D6F312-B0F6-11D0-94AB-0080C74C7E95}","ComponentID");
 5if (WMPVersion != ""
 6{
 7    flash = "";
 8    var version = WMPVersion.split(",");
 9    var i;
10    for (i = 0; i < version.length; i++
11    {
12        if (i != 0)
13        flash += ".";
14        flash += version[i];
15    }

16    document.write("您的Windows Media Player 版本是:"+flash+"<p>");
17}

18</SCRIPT>

Q:使图片按比例缩放显示
A:

使图片按比例缩放
 1<script language="javascript">
 2<!--
 3var flag=false;
 4function DrawImage(ImgD)
 5{
 6    var image=new Image();
 7    var iwidth = 80//定义允许图片宽度
 8    var iheight = 80//定义允许图片高度
 9    image.src=ImgD.src;
10    if(image.width>0 && image.height>0)
11    {
12        flag=true;
13        if(image.width/image.height>= iwidth/iheight)
14        {
15            if(image.width>iwidth)
16            {
17                ImgD.width=iwidth;
18                ImgD.height=(image.height*iwidth)/image.width;
19            }

20            else
21            {
22                ImgD.width=image.width;
23                ImgD.height=image.height;
24            }

25            ImgD.alt=image.width+"×"+image.height;
26        }

27        else
28        {
29            if(image.height>iheight)
30            {
31                ImgD.height=iheight;
32                ImgD.width=(image.width*iheight)/image.height;
33            }

34            else
35            {
36                ImgD.width=image.width;
37                ImgD.height=image.height;
38            }

39            ImgD.alt=image.width+"×"+image.height;
40        }

41    }

42}

43//-->
44
</script>
45<img src=".." onload = "DrawImage(this)">

 

 

Q:细线边框下拉选单
A:

细线下拉选单
1<span style="border:1px solid #000000; position:absolute; overflow:hidden;" >
2    <select style="margin:-2px;">
3        <option>1111</option>
4        <option>2222</option>
5        <option>3333</option>
6    </select>
7</span>

Q:如何使Window.Print()不打印页码和文件名
A:这个方法需要使用脚本来修改注册表,使用的过程中会跳出警告。是一个很头疼的问题,不过目前没有找到更好的解决办法。

Window.Print不打印页码和文件名
 1<HTML><HEAD>
 2<script language="JavaScript">
 3var hkey_root,hkey_path,hkey_key
 4hkey_root="HKEY_CURRENT_USER"
 5hkey_path="\\Software\\Microsoft\\Internet Explorer\\PageSetup\\"
 6//设置网页打印的页眉页脚为空
 7function pagesetup_null(){
 8try{
 9    var RegWsh = new ActiveXObject("WScript.Shell")
10    hkey_key="header"    
11    RegWsh.RegWrite(hkey_root+hkey_path+hkey_key,"")
12    hkey_key="footer"
13    RegWsh.RegWrite(hkey_root+hkey_path+hkey_key,"")
14}
catch(e){}
15}

16//设置网页打印的页眉页脚为默认值
17function pagesetup_default(){
18try{
19    var RegWsh = new ActiveXObject("WScript.Shell")
20    hkey_key="header"    
21    RegWsh.RegWrite(hkey_root+hkey_path+hkey_key,"&w&b页码,&p/&P")
22    hkey_key="footer"
23    RegWsh.RegWrite(hkey_root+hkey_path+hkey_key,"&u&b&d")
24}
catch(e){}
25}

26
</script>
27</HEAD>
28<BODY><br/><br/><br/><br/><br/><br/><align=center>
29<input type="button" value="清空页码" onclick=pagesetup_null()>
30<input type="button" value="恢复页码" onclick=pagesetup_default()><br/>
31</p></BODY></HTML>

 


 

 

 

 

转载于:https://www.cnblogs.com/WilliamsQi/articles/509351.html

'源代码 Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long 'GetDC()功能是获取指定窗体的设备场景的句柄(hDC),用参数0则可以获取整个屏幕的场景句柄 Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long 'GetPixel用于取得场景(这里是整个屏幕)中某点的颜色值 Private Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long 'SetPixel用于设置场景(这里是整个屏幕)中某点的颜色值 Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long '释放由GetDC()获取的设备场景句柄,否则可能造成系统锁死 Private Declare Function InvalidateRect& Lib "user32" (ByVal hwnd As Long, lpRect As RECT, ByVal bErase As Long) '清理窗口雪花 Private Type POINTAPI '定义坐标点结构 x As Long y As Long End Type Private Type RECT '定义“区域”数据结构,但实际上并没有用到,因为仅需在函数InvalidateRect中传递一个空的RECT参数 left As Long top As Long right As Long bottom As Long End Type Dim rect1 As RECT Private Const ScrnWidth = 1024 '屏幕宽度(单位:像素) Private Const ScrnHight = 768 '屏幕高度(单位:像素) Private Const SnowCol = &HFEFFFE '雪花颜色 Private Const SnowColDown = &HFFFFFF '积雪颜色 Private Const SnowColDuck = &HFFDDDD '深色积雪颜色 Private Const SnowNum = 500 '同一时间飘动的雪花数量 Dim hDC1 As Long '存储桌面窗口设备句柄 Dim pData(SnowNum) As POINTAPI '存储每个雪花的位置信息 Dim pColor(SnowNum) As Long '存储画出雪花前屏幕原来的颜色 Dim Vx As Integer '雪花总体水平飘行速度 Dim Vy As Integer '雪花总体垂直下落速度 Dim PVx As Integer '单个雪花实际水平飘行速度 Dim PVy As Integer '单个雪花实际垂直飘行速度 '初始化雪花位置 Private Sub InitP(i As Integer) pData(i).x = Rnd() * ScrnWidth pData(i).y = Rnd() * 2 pColor(i) = GetPixel(hDC1, pData(i).x, pData(i).y) '取得屏幕原来的颜色值 End Sub '取得某一点与周围点的对比度,确定是否在此位置堆积雪花 Private Function GetContrast(i As Integer) As Long Dim ColorCmp As Long '存储用作对比的点的颜色值 Dim tempR As Long '存储CorlorCmp的红色部分,下同 Dim tempG As Long Dim tempB As Long Dim Slope As Integer '存储雪花飘落方向:Vx/Vy '计算雪花飘落方向 If PVy <> 0 Then Slope = PVx / PVy Else Slope = 2 End If '根据雪花飘落方向决定取哪一点作对比点, '若PVx/PVy在-1到1之间,即Slope=0,就取正下面的象素点 '若PVx/PVy>1,取右下方的点,PVx/PVy<-1则取左下方 If Slope = 0 Then ColorCmp = GetPixel(hDC1, pData(i).x, pData(i).y + 1) Else If Slope > 1 Then ColorCmp = GetPixel(hDC1, pData(i).x + 1, pData(i).y + 1) Else ColorCmp = GetPixel(hDC1, pData(i).x - 1, pData(i).y + 1) End If End If '确定当前位置没有与另一个雪花重叠,否则返回0,用于防止由于不同雪花重叠造成雪花乱堆 If ColorCmp = SnowCol Then GetContrast = 0 Exit Function End If '分别获取ColorCmp与对比点的蓝、绿、红部分的差值 tempB = Abs((ColorCmp And &HFF0000) - (pColor(i) And &HFF0000)) / &H10000 tempG = Abs((ColorCmp And &HFF00&) - (pColor(i) And &HFF00&)) / &H100& tempR = Abs((ColorCmp And &HFF&) - (pColor(i) And &HFF&)) '返回对比度值 GetContrast = (tempR + tempG + tempB) / 3 End Function '画出一帧,即重画所有雪花位置一次 Private Sub DrawP() Dim i As Integer For i = 0 To SnowNum '防止雪花重叠造成干扰 If pColor(i) <> SnowCol Then '还原上一个位置的颜色 SetPixel hDC1, pData(i).x, pData(i).y, pColor(i) End If '设置新的位置,i Mod 3用于将雪花分为三类采用不同速度,以便形成层次感 PVx = Rnd() * 2 - 1 + Vx * (i Mod 3) PVy = Vy * (i Mod 3 + 1) pData(i).x = pData(i).x + PVx pData(i).y = pData(i).y + PVy '取得新位置原始颜色值,用于下一步雪花飘过时恢复此处颜色 pColor(i) = GetPixel(hDC1, pData(i).x, pData(i).y) '如果获取颜色失败,表明雪花已飘出屏幕,重新初始化 If pColor(i) = -1 Then InitP i Else '否则若雪花没有重叠 If pColor(i) <> SnowCol Then '若对比度较小(即不能堆积),就画出雪花 'Rnd()>0.3用于防止某些连续而明显的边界截获所有雪花 If Rnd() > 0.3 Or GetContrast(i) < 50 Then SetPixel hDC1, pData(i).x, pData(i).y, SnowCol '否则表明找到明显的边界,画出堆积的雪,并初始化以便画新的雪花 Else SetPixel hDC1, pData(i).x, pData(i).y - 1, SnowColDuck SetPixel hDC1, pData(i).x - 1, pData(i).y, SnowColDuck SetPixel hDC1, pData(i).x + 1, pData(i).y, SnowColDown InitP i End If End If End If Next End Sub Private Sub Form_Load() Dim j As Integer Me.Caption = "桌面飘雪" '设置窗口标题 '设置计时器,Timer1用于画单帧,Timer2用于风向变化 Timer1.Enabled = True Timer1.Interval = 10 Timer2.Enabled = True Timer2.Interval = 2000 Randomize '初始化随机数种子 hDC1 = GetDC(0) '获取桌面窗口设备场景句柄 '初始化整个屏幕 For j = 0 To SnowNum pData(j).x = Rnd() * ScrnWidth pData(j).y = Rnd() * ScrnHight pColor(j) = GetPixel(hDC1, pData(j).x, pData(j).y) Next End Sub Private Sub Form_Unload(Cancel As Integer) ReleaseDC 0, hDC1 '释放桌面窗口设备句柄 InvalidateRect 0, rect1, 0 '清除所有雪花,恢复桌面 End Sub Private Sub Timer1_Timer() DrawP '画出一帧 End Sub Private Sub Timer2_Timer() '改变风向 Vx = Rnd() * 4 - 2 Vy = Rnd() + 2 End Sub '完,最后,需要两个Timer:Timer1、Timer2。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值