首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

为richTextBox中的文字和图片添加链接,点一上便播放音乐

2012-12-15 
为richTextBox中的文字和图片添加链接,点一下便播放音乐为richTextBox控件中图片和文字添加链接,点一下便

为richTextBox中的文字和图片添加链接,点一下便播放音乐
为richTextBox控件中图片和文字添加链接,点一下便播放音乐;
每个图片和文字都会对应不同的音频文件wav的地址
就如同微信的语音功能,点一下
便播放一个唯一对应的音频文件
高人求解!!!
[最优解释]
补充一点 用动态加控件的方法暂时没实现当控件超过richTextBox范围时 滚动条自己往下跟的问题 如果楼主打算采用这种方法 可以先考虑下这个问题
[其他解释]

你可以看看类似于 虾米音乐的 播放器在博客和微博的应用。
[其他解释]
还是没摸索出来
[其他解释]
高手来帮帮忙啊。。。
现在做项目急需解决这个问题!!!

[其他解释]
自己写的一个代码,功能可以实现,但不漂亮。。。
贴出来一起学习,还请高手多多出手。。。

运行结果:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;   //播放WAV用

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        //播放WAV用
        [DllImport("winmm")]
        public static extern bool PlaySound(string szSound, IntPtr hMod, int flags);

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //点击richTextBox控件中的“http://w--212.wav”便播放“212.wav”
            richTextBox1.AppendText("http://w--212.wav");
        }

        private void richTextBox1_LinkClicked(object sender, LinkClickedEventArgs e)    //打开richTextBox中的链接
        {
            string file = Application.StartupPath + "\" + e.LinkText.Substring(10);
            PlaySound(file, IntPtr.Zero, 0x00020000 
[其他解释]
 0x0001);
        }
    }
}

[其他解释]
我以前弄过一个效果不太好的,点击richtextbox中的编号可以打开对应的任务。
我的方法是用尖括号将编号括起来,比如 <001>,判断richtextbox的mousedown事件,如果点击位置往前找到<,并且往后找到>,则表示点中了任务。

不知你是WPF/WinForm/WebForm?
[其他解释]
WinFrom
[其他解释]
能让每个标签都对应一个不同的wav文件的地址嘛?
高手把代码贴出来吧!
大家一起学习。。。
感激不尽。。。
------其他解决方案--------------------


LZ,如果你紧紧只是想让不同的标签对应不同的WAV地址,可以用尝试用配置文件设置。eg:<Test1 name ='XX'>HTTP://...</Test1> <Test2 name='XXX'>HTTP://...</Test2> 'name'可以设置为你不同的标签 这样每次在设置或者获取数据的时候读配置文件的name来获得地址。
[其他解释]
效果如下 看不清 点我

可能跟楼主的思路不同 我是往richTextBox里面添加控件实现的 也是一种方法 楼主可以参考一下



代码在这里


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace My
{
    public partial class Form2 : Form
    {
        //纵坐标增量
        int pointY = -25;
        public Form2()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 点击一次按钮创建一个PictureBox
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            pointY += 25;
            //创建控件
            PictureBox picBox = new PictureBox();
            //设置坐标
            picBox.Location = new Point(this.rtbTest.Location.X + 10, this.rtbTest.Location.Y + pointY);
            //设置图片路径
            picBox.Image = Image.FromFile(Application.StartupPath+"\\Images\\sound.gif");
            //图片显示模式
            picBox.SizeMode = PictureBoxSizeMode.AutoSize;
            //设置鼠标样式
            picBox.Cursor = Cursors.Hand;
            //父容器为RichtextBox
            picBox.Parent = this.rtbTest;
            //控件的Clik事件
            picBox.Click += new EventHandler(picBox_Click);
            //将控件添加至父容器中
            this.rtbTest.Controls.Add(picBox);
        }

        /// <summary>


        /// 播放音频的代码放这里
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void picBox_Click(object sender, EventArgs e)
        {
            MessageBox.Show("用播放音频的代码替换我这个框框~");
        }

        /// <summary>
        /// 点击一次创建一个超链接标签
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            pointY += 25;
            //创建控件
            LinkLabel lklbl = new LinkLabel();
            //设置坐标
            lklbl.Location = new Point(this.rtbTest.Location.X + 10, this.rtbTest.Location.Y + pointY);
            //设置显示文本
            lklbl.Text = "点我播放音乐";
            //设置鼠标样式
            lklbl.Cursor = Cursors.Hand;
            //设置下划线行为 = 当鼠标Hover时显示下划线
            lklbl.LinkBehavior = LinkBehavior.HoverUnderline;
            //父容器为RichtextBox
            lklbl.Parent = this.rtbTest;
            //控件的LinkClicked事件 我这样写是不准确的 应该新写一个LinkClicked事件 这里测试就不那么讲究了
            lklbl.LinkClicked += new LinkLabelLinkClickedEventHandler(picBox_Click);
            //将控件添加至父容器中
            this.rtbTest.Controls.Add(lklbl);
        }

    }
}


[其他解释]
@ducker3590
你这个方案做出来界面挺漂亮的,但所有的单击都只对应一个
————MessageBox.Show("用播放音频的代码替换我这个框框~");
能不能实现一对一呢?
非常谢谢你能写这么多代码。。。感动。。。
[其他解释]
能有大神站出来扛起大旗嘛。。。

[其他解释]
引用:
@ducker3590
你这个方案做出来界面挺漂亮的,但所有的单击都只对应一个
————MessageBox.Show("用播放音频的代码替换我这个框框~");


能不能实现一对一呢?
非常谢谢你能写这么多代码。。。感动。。。


不客气  解决问题也是对自己的提高 其实你可以把点击事件里的代码封装成一个方法 参数是你的音频地址 然后保存到控件的tag里 然后控件的点击事件绑定一个播放的方法 把tag里的音频地址传过去 实现播放 我试着写写看 能成功的话贴代码上来
[其他解释]

先上效果图  应该可以满足楼主的需求了 如果有问题再提出来一起研究





代码如下

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace My
{
    public partial class Form2 : Form
    {
        //纵坐标增量
        int pointY = -25;
        public Form2()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 点击一次按钮创建一个PictureBox
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            //将控件添加至父容器中
            this.rtbTest.Controls.Add(CreateSoundPic("aa"));
        }

        /// <summary>
        /// 动态创建一个图片框
        /// </summary>
        /// <param name="mediaPath">音频地址</param>
        /// <returns></returns>
        private PictureBox CreateSoundPic(string mediaPath)
        {
            pointY += 25;
            //创建控件
            PictureBox picBox = new PictureBox();
            //设置坐标
            picBox.Location = new Point(this.rtbTest.Location.X + 10, this.rtbTest.Location.Y + pointY);
            //设置图片路径
            picBox.Image = Image.FromFile(Application.StartupPath + "\\Images\\sound.gif");
            //图片显示模式
            picBox.SizeMode = PictureBoxSizeMode.AutoSize;

            //图片的tag保存音频地址


            //--------------------
            picBox.Tag = mediaPath;
            //--------------------            

            //设置鼠标样式
            picBox.Cursor = Cursors.Hand;
            //父容器为RichtextBox
            picBox.Parent = this.rtbTest;
            //控件的Clik事件
            picBox.Click += new EventHandler(picBox_Click);
            //返回PictureBox对象
            return picBox;
        }

        /// <summary>
        /// 图片框的点击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void picBox_Click(object sender, EventArgs e)
        {
            //还原事件源
            PictureBox pic = sender as PictureBox;
            //调用播放方法
            PlaySound(pic.Tag.ToString());
        }

        /// <summary>
        /// 点击一次创建一个超链接标签
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            
            //将控件添加至父容器中
            this.rtbTest.Controls.Add(CreateSoundLable("bb"));
        }

        /// <summary>
        /// 动态创建LinkLable
        /// </summary>
        /// <param name="mediaPath">音频地址</param>
        /// <returns></returns>
        private LinkLabel CreateSoundLable(string mediaPath)
        {
            pointY += 25;


            //创建控件
            LinkLabel lklbl = new LinkLabel();
            //设置坐标
            lklbl.Location = new Point(this.rtbTest.Location.X + 10, this.rtbTest.Location.Y + pointY);
            //设置显示文本
            lklbl.Text = "点我播放音乐";
            //设置鼠标样式
            lklbl.Cursor = Cursors.Hand;

            //Lable的tag保存音频地址
            //--------------------
            lklbl.Tag = mediaPath;
            //--------------------

            //设置下划线行为 = 当鼠标Hover时显示下划线
            lklbl.LinkBehavior = LinkBehavior.HoverUnderline;
            //父容器为RichtextBox
            lklbl.Parent = this.rtbTest;
            //控件的LinkClicked事件 我这样写是不准确的 应该新写一个LinkClicked事件 这里测试就不那么讲究了
            lklbl.LinkClicked += new LinkLabelLinkClickedEventHandler(lnkLable_Click);
            //返回LinkLable对象
            return lklbl;
        }

        /// <summary>
        /// LinkLable的点击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void lnkLable_Click(object sender, EventArgs e)
        {
            //还原事件源
            LinkLabel lnk = sender as LinkLabel;
            //调用播放方法
            PlaySound(lnk.Tag.ToString());
        }
        
        /// <summary>
        /// 音频播放方法 里面换成你需要的播放音频的代码
        /// </summary>
        /// <param name="mediaPath">音频路径</param>
        private void PlaySound(string mediaPath)
        {
            MessageBox.Show("开始播放" + mediaPath);


        }

    }
}


[其他解释]
没错, 就是Tag了。。。
[其他解释]
@ducker3590
谢谢啦~
100分归你了。。。

热点排行