有需要在messageBox中增加一些内容,比如说,显示一些超链接,显示一个复选框.可是.NET原配的MESSAGEBOX扩展功能有限,找了半天资料也找不到在其基础上的扩展,所以只能自己制作一个了.
今天说第一项.
要在MessageBox中显示含有超链接的文本,最合适的控件是LinkLabel,之前也试过其他的控件,都有问题,比如:
1. RichText,这个只能用来显示RTF格式的文本,即格式化文本,如果要设置字体大小颜色加入图片,用这个合适,但是要内嵌超链接,这个没办法
2. WebBrowser,这个用来显示HTML文件相当好,但是一来我要显示的只是一些小块的文本,没必要用这个大家伙,二来我需要单起一个线程,而WebBrowser不能用在非主线程里.
开始时以为LinkLabel只能显示一个超链接,所以没仔细研究,后来才发现这东东其实威力不小,经过处理能显示带多个超链接的文本,很适合我的需要.
下面的代码是把传入的HTML格式的文本(超链接以<a href="...">XXX</a>格式存在)经过分析后转成LabelLink的方式显示出来.刚写的东西,BUG肯定有,请谅解.
1. 在建立FORM时,新建一个LinkLabel,设置其基本属性如下:
- frmMessage = new LinkLabel();
- frmMessage.LinkClicked += new LinkLabelLinkClickedEventHandler(frmMessage_LinkClicked);
- frmMessage.Dock = System.Windows.Forms.DockStyle.Top;
- frmMessage.AutoSize = true;
- frmMessage.Font = new Font("Tahoma", 9, FontStyle.Regular);
2. 注意第2行,在新建LinkLabel时,用户点击内容中的超链接时的响应也需要自行定义.在此,我用System.Diagnostics.Process.Start(target)来启动系统默认的浏览器来查看超链接,不必在其中指定IEXPLORER等.
- static void frmMessage_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
- {
- string target = e.Link.LinkData as string;
- if (target != null)
- {
- System.Diagnostics.Process.Start(target);
- }
- }
3. 那LinkLabel中的内容如何生成呢?我这里是基于从某个固定网页上实时取下来的HTML格式的文本,所以要对这段取下的文本做一点HTML解释才能放到LinkLabel上.
- static private void buildlink(string Message)
- {
- string sTmpMsg = Message = Message.Replace("<br>", "n").Replace(" ", " ").Replace("&", "&").Replace("<", "<").Replace(">", ">").Replace(""", @"""").Replace("#39;", "'").Replace("&", "&&");
- List<string> lLinks = new List<string>();
- Regex rWholeLink = new Regex(@"<a href=[wW]+?</a>", RegexOptions.IgnoreCase);
- Match mWholeLink = rWholeLink.Match(Message);
- if (!mWholeLink.Success)
- {
- frmMessage.Text=Message;
- frmMessage.DisabledLinkColor = Color.Black;
- frmMessage.LinkBehavior = LinkBehavior.NeverUnderline;
- frmMessage.Links[0].Enabled = false;
- return;
- }
- while (mWholeLink.Success)
- {
- Regex rLink = new Regex(@"<a href=""[wW]+?"">", RegexOptions.IgnoreCase);
- Regex rText = new Regex(@">[wW]+?</a>", RegexOptions.IgnoreCase);
- Match mLink = rLink.Match(mWholeLink.Value.ToString());
- if (mLink.Success)
- {
- Match mText = rText.Match(mWholeLink.Value.ToString(), mLink.Index);
- if (mText.Success)
- {
- string sLink = mLink.Value.ToString(); sLink = sLink.Substring(9, sLink.Length - 11).Replace("&&", "&");
- string sText = mText.Value.ToString(); sText = sText.Substring(1, sText.Length - 5);
- lLinks.Add(sLink + "#|||#" + sText);
- sTmpMsg = rWholeLink.Replace(sTmpMsg, sText, 1);
- }
- }
- mWholeLink = mWholeLink.NextMatch();
- }
- frmMessage.Text = sTmpMsg;
- foreach (string s in lLinks)
- {
- try
- {
- string slink = s.Substring(0, s.IndexOf("#|||#"));
- string stext = s.Substring(s.IndexOf("#|||#") + 5, s.Length - s.IndexOf("#|||#") - 5);
- frmMessage.Links.Add(frmMessage.Text.IndexOf(stext), stext.Length, slink);
- }
- catch
- {
- }
- }
- newMessageBox.Height = frmMessage.Height + 100;
- }
这段代码粘贴上来有点乱,不知为什么总是无法使用C#格式放上来,只能如此了。总而言之其作用是把带<a href="...">XXX</a>超链接格式的文本转换成普通文本,并按LinkLabel的使用方式在其中添加Links[]。
稍后继续。。。
C#启动带参数的线程
给MAXTHON浏览器加


