惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
Schneier on Security
The Last Watchdog
The Last Watchdog
Cyberwarzone
Cyberwarzone
S
Securelist
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
Cyber Attacks, Cyber Crime and Cyber Security
L
Lohrmann on Cybersecurity
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
The Cloudflare Blog
V
V2EX
博客园_首页
博客园 - 聂微东
Vercel News
Vercel News
人人都是产品经理
人人都是产品经理
G
GRAHAM CLULEY
T
Tenable Blog
Last Week in AI
Last Week in AI
Y
Y Combinator Blog
L
LINUX DO - 最新话题
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
SecWiki News
SecWiki News
博客园 - 三生石上(FineUI控件)
S
Secure Thoughts
N
News | PayPal Newsroom
T
The Blog of Author Tim Ferriss
The GitHub Blog
The GitHub Blog
T
Troy Hunt's Blog
博客园 - 【当耐特】
Forbes - Security
Forbes - Security
H
Hacker News: Front Page
A
About on SuperTechFans
B
Blog RSS Feed
Engineering at Meta
Engineering at Meta
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
罗磊的独立博客
D
DataBreaches.Net
P
Privacy & Cybersecurity Law Blog
Schneier on Security
Schneier on Security
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Google DeepMind News
Google DeepMind News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Jina AI
Jina AI
D
Docker
P
Proofpoint News Feed

博客园 - 李晓

离开程序员的行业3年了,这次回来,心情波动很大 现在不做程序员了,不会了 现在的生活 芙蓉姐姐大片美若天仙 - 李晓 - 博客园 博客地图怎么做? 我是一个很不称职的管理员 写了一个以树形显示文档库的WEBPART,可根据权限显示文档库 更正用AJAX实现IE TREE无刷新取值的方法 转发: Visual Studio 2005常用插件 转发:编程之余保护眼睛[不断更新ing...] 转发:Session研习笔记 转发:使用JavaScript删除ASP.NET生成的HttpCookie 大病了一场,不过闲时对AJAX探索时,实现了IE TREE无刷新 提供可在WSS上使用的MYTREE 2006年的长春.NET俱乐部 关于WSS搜索的问题 AJAX(2) 在将WEBPART打包成*.CAB包和*.MSI安装包后,竟然无法将其安装到指定的WSS网站 关于AJAX开发
在C#中实现MSN消息框的功能
李晓 · 2005-11-23 · via 博客园 - 李晓

最近有一个任务,是实现MSN消息框的功能.

一共做了三个版本:
1、用asp.net实现网页中弹出消息框
    这个我采用了一个.NET的第三方控件(这个控件在网上找一下就行),可是这个控件只能显示在网页区域内,也就是说,它无法真正实现和MSN一样的消息框功能。无柰,只好放弃。不过,如果只需要在网页区域中显示的话,可以采用它.

2、用JAVASCRIPT去实现该功能
    这回采用JAVASCRIPT去实现。代码如下:
        <SCRIPT language="JavaScript"> 

<!-- 
 
/* 
 *    消息构造 
 */ 
function CLASS_MSN_MESSAGE(id,width,height,caption,title,message,target,action){ 
    this.id     = id; 
    this.title  = title; 
    this.caption= caption; 
    this.message= message; 
    this.target = target; 
    this.action = action; 
    this.width    = width?width:200; 
    this.height = height?height:120; 
    this.timeout= 150; 
    this.speed    = 20;
    this.step    = 1;
    this.right    = screen.width -1; 
    this.bottom = screen.height;
    this.left    = this.right - this.width;
    this.top    = this.bottom - this.height;
    this.timer    = 0;
    this.pause    = false;
    this.close    = false;

 
/* 
 *    隐藏消息方法 
 */ 
CLASS_MSN_MESSAGE.prototype.hide = function(){ 
    if(this.onunload()){ 

        var offset  = this.height>this.bottom-this.top?this.height:this.bottom-this.top;
        var me  = this; 
 
        if(this.timer>0){  
            window.clearInterval(me.timer); 
        } 
 
        var fun = function(){ 
            if(me.pause==false||me.close){
                var x  = me.left;
                var y  = 0;
                var width = me.width;
                var height = 0;
                if(me.offset>0){
                    height = me.offset;
                }
    
                y  = me.bottom - height;
    
                if(y>=me.bottom){
                    window.clearInterval(me.timer); 
                    me.Pop.hide(); 
                } else {
                    me.offset =me.offset - me.step; //等于0是马上消失,否则为逐渐消失
                }
                me.Pop.show(x,y,width,height);   
            }            
        } 
 
        this.timer = window.setInterval(fun,this.speed)     
    } 

 
/* 
 *    消息卸载事件,可以重写 
 */ 
CLASS_MSN_MESSAGE.prototype.onunload = function() { 
    return true; 

/* 
 *    消息命令事件,要实现自己的连接,请重写它 
 * 
 */ 
CLASS_MSN_MESSAGE.prototype.oncommand = function(){ 
    this.hide();
    window.open('http://www.google.com');   

 
/* 
 *    消息显示方法 
 */ 
CLASS_MSN_MESSAGE.prototype.show = function(){ 

    var oPopup = window.createPopup(); //IE5.5+ 
   
    this.Pop = oPopup; 
 
    var w = this.width; 
    var h = this.height; 
 
    var str = "<DIV style='BORDER-RIGHT: #455690 1px solid; BORDER-TOP: #a6b4cf 1px solid; Z-INDEX: 99999; LEFT: 0px; BORDER-LEFT: #a6b4cf 1px solid; WIDTH: " + w + "px; BORDER-BOTTOM: #455690 1px solid; POSITION: absolute; TOP: 0px; HEIGHT: " + h + "px; BACKGROUND-COLOR: #c9d3f3'>" 
        str += "<TABLE style='BORDER-TOP: #ffffff 1px solid; BORDER-LEFT: #ffffff 1px solid' cellSpacing=0 cellPadding=0 width='100%' bgColor=#cfdef4 border=0>" 
        str += "<TR>" 
        str += "<TD style='FONT-SIZE: 12px;COLOR: #0f2c8c' width=30 height=24></TD>" 
        str += "<TD style='PADDING-LEFT: 4px; FONT-WEIGHT: normal; FONT-SIZE: 12px; COLOR: #1f336b; PADDING-TOP: 4px' vAlign=center width='100%'>" + this.caption + "</TD>" 
        str += "<TD style='PADDING-RIGHT: 2px; PADDING-TOP: 2px' vAlign=center align=right width=19>" 
        str += "<SPAN title=关闭 style='FONT-WEIGHT: bold; FONT-SIZE: 12px; CURSOR: hand; COLOR: red; MARGIN-RIGHT: 4px' id='btSysClose' >×</SPAN></TD>" 
        str += "</TR>" 
        str += "<TR>" 
        str += "<TD style='PADDING-RIGHT: 1px;PADDING-BOTTOM: 1px' colSpan=3 height=" + (h-28) + ">" 
        str += "<DIV style='BORDER-RIGHT: #b9c9ef 1px solid; PADDING-RIGHT: 8px; BORDER-TOP: #728eb8 1px solid; PADDING-LEFT: 8px; FONT-SIZE: 12px; PADDING-BOTTOM: 8px; BORDER-LEFT: #728eb8 1px solid; WIDTH: 100%; COLOR: #1f336b; PADDING-TOP: 8px; BORDER-BOTTOM: #b9c9ef 1px solid; HEIGHT: 100%'>" + this.title + "<BR><BR>" 
        str += "<DIV style='WORD-BREAK: break-all' align=left><A href='javascript:void(0)' hidefocus=false id='btCommand'><FONT color=#ff0000>" + this.message + "</FONT></A></DIV>" 
        str += "</DIV>" 
        str += "</TD>" 
        str += "</TR>" 
        str += "</TABLE>" 
        str += "</DIV>" 
 
    oPopup.document.body.innerHTML = str;
   
 
 
    this.offset  = 0;
    var me  = this; 

    oPopup.document.body.onmouseover = function(){me.pause=true;}
    oPopup.document.body.onmouseout = function(){me.pause=false;}

    var fun = function(){ 
        var x  = me.right;        
        var y  = 0;
        var width    = me.width;
        var height    = me.height;
 
            if(me.offset>me.height){
                height = me.height;
            } else {
                height = me.offset;
            }
 
        y  = me.bottom - me.offset;
        if(y<=me.top)//让消息框消失
        {
            me.timeout--;
            if(me.timeout==0)//当消息框在页面中显示的时间到期时,将消息框隐藏
            {
      //alert(me.timer);
              window.clearInterval(me.timer); 
              me.hide();
   }
        }
        else
        {
            me.offset = me.offset + me.step;
        }
        me.Pop.show(x,y,width,height); 
      // oPopup.show(100, 100, 180, 25, str); 
 
    } 
 
    this.timer = window.setInterval(fun,this.speed)     
 
    
 
    var btClose = oPopup.document.getElementById("btSysClose"); 
 
    btClose.onclick = function(){ 
        me.close = true;
        me.hide(); 
    } 
 
    var btCommand = oPopup.document.getElementById("btCommand"); 
    btCommand.onclick = function(){ 
        me.oncommand(); 
    }   


/*
** 设置速度方法
**/
CLASS_MSN_MESSAGE.prototype.speed = function(s){
    var t = 20;
    try {
        t = praseInt(s);
    } catch(e){}
    this.speed = t;
}
/*
** 设置步长方法
**/
CLASS_MSN_MESSAGE.prototype.step = function(s){
    var t = 1;
    try {
        t = praseInt(s);
    } catch(e){}
    this.step = t;
}
 
CLASS_MSN_MESSAGE.prototype.rect = function(left,right,top,bottom){
    try {
        this.left        = left    !=null?left:this.right-this.width;
        this.right        = right    !=null?right:this.left +this.width;
        this.bottom        = bottom!=null?(bottom>screen.height?screen.height:bottom):screen.height;
        this.top        = top    !=null?top:this.bottom - this.height;
    } catch(e){}
}


function bb(ini)
{

 if(ini<=1)
 {
 
  //alert(window.Form1.teTitle.value);
  var  MSG1 = new CLASS_MSN_MESSAGE(ini,200,120,"<image src='oicq.gif'> 消息提示:",window.Form1.teTitle.value,window.Form1.teShow.value); 
     MSG1.rect(null,null,null,screen.availHeight); //screen 是任务栏,availHeight代表当前任务栏的高度
     //alert(screen.availHeight);
  MSG1.speed    = 10;
  MSG1.step    = 5;
  //alert(MSG1.top);
  //MSG1.hide(); 
 // window.setTimeout('Ktime()',120);
  MSG1.show();
 }
 
 else if(ini>1)
 {
  for(i=1;i<=ini;i++)
  {
   var MSG1 = new CLASS_MSN_MESSAGE(i,200,120,"<image src='oicq.gif'> 消息提示:",window.Form1.teTitle.value,window.Form1.teShow.value); 
   var popheight;
   if(i==1)
    popheight=screen.availHeight;
   else
    popheight=popheight-120;
    
   
   MSG1.rect(null,null,null,popheight); //screen 是任务栏,availHeight代表当前任务栏的高度
   MSG1.speed    = 10;
   MSG1.step    = 5;
   //alert(MSG1.top);
   //MSG1.hide();
   window.setTimeout('Ktime()',1000);
   MSG1.show();
  }
 }

 }
function Ktime()
{
 window.setTimeout('Ktime()',1000);
}
 //同时两个有闪烁,只能用层代替了,不过层不跨框架
//var MSG2 = new CLASS_MSN_MESSAGE("aa",200,120,"短消息提示:","您有2封消息","好的啊"); 
//   MSG2.rect(100,null,null,screen.height);
//    MSG2.show(); 
//--> 
  </SCRIPT>
<form id="Form1" method="post" runat="server">
   &nbsp;
   <TABLE id="Table2" style="Z-INDEX: 101; LEFT: 8px; POSITION: absolute; TOP: 8px" cellSpacing="0"
    cellPadding="0" width="100%" border="0">
    <TR>
     <TD vAlign="top"><asp:panel id="Panel1" runat="server"><FONT face="宋体">
        <TABLE id="Table1" style="WIDTH: 783px; HEIGHT: 64px" cellSpacing="0" cellPadding="0" width="783"
         border="0">
         <TBODY>
          <TR>
           <TD style="WIDTH: 94px">
            <asp:label id="Label3" runat="server">标  题</asp:label></TD>
           <TD><INPUT id="teTitle" style="WIDTH: 336px; HEIGHT: 22px" type="text" size="50" value="MSN Message"
             runat="server"></TD>
          </TR>
          <TR>
           <TD style="WIDTH: 94px">
            <asp:label id="Label1" runat="server">显示文字</asp:label></TD>
           <TD><FONT face="宋体"><INPUT id="teShow" style="WIDTH: 336px; HEIGHT: 22px" type="text" size="50" value="请点击查看详细信息!"></FONT></TD>
          </TR>
          <TR>
           <TD style="WIDTH: 94px">
            <asp:label id="Label2" runat="server">显示次数</asp:label></TD>
           <TD><INPUT id="cou" style="WIDTH: 336px; HEIGHT: 22px" type="text" size="50">
      </asp:panel></TD>
    </TR>
   </TABLE>
   </FONT></TD></TR>
   <TR>
    <TD vAlign="top"><INPUT style="WIDTH: 432px; HEIGHT: 56px" onclick="bb(cou.value)" type="button" value="快按一下吧"></TD>
   </TR>
   </TBODY></TABLE></form>

这个方法可以实现MSN的功能。但还是有一毛病,就是,不能同时出现两个或以上的消息框,否则刷新将十分严重。这样的话,可该怎么办呢?

最后,我实现没有办法了,我只好用C#来实现这个功能

3、用WINDOW窗体实现MSN消息框功能
    这个例子我是照MSDN上的一篇例子做的,我在这里只提供一个网址,因为这个网址包含的范例做的更好一些,我做的拿不出手的程序在这里就不提了

http://www.microsoft.com/china/MSDN/library/netFramework/netframework/WindowsForms.mspx

总结一下:

在这里,我提供了三种方法。各位可因人而宜。不过注意一点的是,如采用第二种方法,就必须将不断闪烁的缺点克服。如果各位高手中有知道如何去掉这个错误的话,请教教小弟!这里不胜感激!
                                                                                                                                                                                   李晓