为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("用播放音频的代码替换我这个框框~");
能不能实现一对一呢?
非常谢谢你能写这么多代码。。。感动。。。
[其他解释]
能有大神站出来扛起大旗嘛。。。
[其他解释]
不客气 解决问题也是对自己的提高 其实你可以把点击事件里的代码封装成一个方法 参数是你的音频地址 然后保存到控件的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分归你了。。。