PDA

View Full Version : track bar



mina1363
پنج شنبه 25 مرداد 1386, 16:24 عصر
سلام من یه track bar دارم میخوام وقتی sound شروع شد به پخش شدن track bar هم همزمان باهاش شروع کنه به حرکت کردن چکار باید بکنم؟ codesh چیه ؟
میخوام کاربر بتونه صدا رو کم و زیاد هم بکنه با button هایی که برای میزان بلندی صدا و میزان کاهش صدا گذاشتم برای این هم چه code باید بنویسم ؟
اگر منو راهنمایی کنید ممنون میشم.

mina1363
جمعه 26 مرداد 1386, 08:27 صبح
هیچ کس نمی دونه من باید چیکار کنم؟

mina1363
جمعه 26 مرداد 1386, 15:14 عصر
چرا کسی به این جواب نمیده؟

PC2st
جمعه 26 مرداد 1386, 16:38 عصر
میخوام کاربر بتونه صدا رو کم و زیاد هم بکنه با button هایی که برای میزان بلندی صدا و میزان کاهش صدا گذاشتم برای این هم چه code باید بنویسم ؟
برای تغییر ولوم صدا، اگر از کنترل axWindowsMediaPlayer استفاده مکنید، از خاصیت axWindowsMediaPlayer1.settings.volume استفاده کنید و هر وقت که کاربر روی دکمه افزایش صدا کلیک کرد، یک واحد افزایش و اگر روی کاهش صدا کلیک کرد، یک واحد از این خاصیت کم کنید.


یه track bar دارم میخوام وقتی sound شروع شد به پخش شدن track bar هم همزمان باهاش شروع کنه به حرکت کردن چکار باید بکنم؟
بلد نبودم که زمان سپری شده از پخش آهنگ رو بدست بیارم، وگرنه جواب این سوال را هم میدادم.

mina1363
جمعه 26 مرداد 1386, 16:54 عصر
ای ول دمتون گرم
ولی قسمت اول سؤالتون نه از axWindowsMediaPlayer استفاده نکردم از soundPlayer استفاده کردم
برای سؤال دوم: بیزحمت میشه روش کار کنید That's important for me plzzzzz

PC2st
جمعه 26 مرداد 1386, 19:29 عصر
تا جائی که متوجه شدم، کلاس SoundPlayer انعطاف نداره یا اینکه نمیدونم چطور باهاش میشه چنین کارهائی رو انجام داد.

برای تغییر درجه صدا روی آهنگ، میتونید صدای ویندوز رو کم یا زیاد کنید، با مراجعه به لینک زیر:
http://barnamenevis.org/forum/showthread.php?t=73702

mina1363
جمعه 26 مرداد 1386, 19:49 عصر
باز هم ممنونم فعلا که نتونستم ببینمش پیغام داد فیلتر شده

mina1363
شنبه 27 مرداد 1386, 08:24 صبح
خوب حالا میشه بگید چطور از axWindowsMediaPlayer استفاده کنم که کارهای منو انجام و دیده هم نشه و ...؟

mina1363
شنبه 27 مرداد 1386, 13:29 عصر
خب بگید چه جوری از axWindowsMediaPlayer استفاده کنم دیگه خب ؟

PC2st
شنبه 27 مرداد 1386, 13:49 عصر
باید این کنترل رو به Toolbox اضافه کنید، برای افزودن این کنترل به Toolbox، روی Toolbox کلیک راست کرده و گزینه Choose Items رو انتخاب کنید. صبر کنید تا پنجره ای نمایش داده بشه و از زبانه COM Components و از لیست گزینه Windows Media Player را انتخاب کرده و روی دکمه OK کلیک کنید. با اینکار این کنترل به Toolbox اضافه میشه.

کنترل Windows Media Player رو به فرم اضافه کنید (تحت نام axWindowsMediaPlayer1 اضافه میشه)،
اگر میخواید نمایش داده نشه، کارهای زیر رو انجام بدید:
1. خاصیت uiMode رو به invisible تغییر دهید.
2. خاصیت Size رو به 0 و 0 تغییر بدید.
3. خاصیت Visible را روی false تنظیم کنید.

برای مشخص کردن یک آهنگ برای آن، از کد زیر استفاده کنید که filename نام آهنگ است (mp3, midi, rmi, wav, wma و ...):


axWindowsMediaPlayer1.currentMedia = axWindowsMediaPlayer1.newMedia(filename);


و برای پخش آن از متد axWindowsMediaPlayer1.Ctlcontrols.play() استفاده کنید.

mina1363
شنبه 27 مرداد 1386, 13:57 عصر
مرسی مرسی مرسی
آیا pause هم داره یا نه؟
laud volume & Low volume هم داره دیگه ؟
آخ آره یادم اومد گفتید داره :-)

mina1363
شنبه 27 مرداد 1386, 14:59 عصر
ببخشید ها برای بلندی صدا
axWindowsMediaPlayer1.settings.volume + 1;
نوشتم ولی error زیر رو داد :
Error 1 Only assignment, call, increment, decrement, and new object expressions can be used as a
حالا چکار کنم؟
راستی اگه بخوام از خاصیت mute استفاده کنم
بعدش برای از حالت mute درآمدن باید از چی استفاده کنم ؟

PC2st
شنبه 27 مرداد 1386, 15:12 عصر
یک نمونه برنامه در قسمت نمونه برنامه ها گذاشتم، خواستید ببینید.
http://barnamenevis.org/forum/showthread.php?t=64210

mina1363
شنبه 27 مرداد 1386, 15:15 عصر
یک label هم دارم که میخوام مقدار زمان پخش صدا رو نشان بده ولی چه جوری ؟

PC2st
شنبه 27 مرداد 1386, 15:42 عصر
از axWindowsMediaPlayer1.Ctlcontrols.currentPosition استفاده کنید. (بر حسب ثانیه است)

mina1363
یک شنبه 28 مرداد 1386, 17:00 عصر
ولی وقتی این کد را برایش نوشتم
label1.Text = Convert.ToString(axWindowsMediaPlayer1.Ctlcontrols .currentPosition);

label فقط عدد صفر رو نشان میده

PC2st
یک شنبه 28 مرداد 1386, 17:58 عصر
بله، من هم وقتی بار اول خواستم اینجوری ازش استفاده کنم، عدد صفر رو بهم نشون میداد.
زمانی از این خاصیت استفاده کنید که موسیقی آماده پخش باشه.
مثلا یک timer به فرم اضافه کنید و کد زیر رو درونش بنویسید، حتما نتیجه خواهید گرفت:


private void timer1_Tick(object sender, EventArgs e)
{
label1.Text = axWindowsMediaPlayer1.Ctlcontrols.currentPositionS tring;
}

timer رو Enabled کنید. هر وقت هم که خواستید زمان پخش رو به رشته تبدیل کنید، بهتره بجای Ctlcontrols.currentPosition از Ctlcontrols.currentPositionString استفاده کنید تا لازم نباشه به رشته تبدیلش کنید.

mina1363
دوشنبه 29 مرداد 1386, 04:50 صبح
حالا هر کاری میکنم که نوشته یک label زمان کل صدا باشه نمیشه از
label3.Text = axWindowsMediaPlayer1.currentMedia.durationString; استفاده کردم ولی فقط 0 را نشان میده توی timer نوشتمش ولی ارور داد
و همچنین کاربر وقتی میخواد صدا رو جلو و عقب کنه باید وقتی track bar رو جابجا میکنه بتونه صدا رو هم جابجا کنه اینو چطور انجام بدم؟

PC2st
دوشنبه 29 مرداد 1386, 07:45 صبح
ولی فقط 0 را نشان میده توی timer نوشتمش ولی ارور داد
چون هنوز موسیقی آماده نشده... این کدتون رو در رویداد PlayStateChange بنویسید.


همچنین کاربر وقتی میخواد صدا رو جلو و عقب کنه باید وقتی track bar رو جابجا میکنه بتونه صدا رو هم جابجا کنه
به خاصیت axWindowsMediaPlayer1.Ctlcontrols.currentPosition مقدار زمان رو برحسب ثانیه بدید. (در رویداد Scroll)

mina1363
دوشنبه 29 مرداد 1386, 20:41 عصر
به خاصیت axWindowsMediaPlayer1.Ctlcontrols.currentPosition مقدار زمان رو برحسب ثانیه بدید. (در رویداد Scroll)
یعنی چی ؟

PC2st
دوشنبه 29 مرداد 1386, 21:50 عصر
یعنی اینکه یک TrackBar به فرم اضافه کرده و در رویداد Scroll از کنترل trackBar1 کد زیر رو می نویسیم:


axWindowsMediaPlayer1.Ctlcontrols.currentPosition = trackBar1.Value;

که باعث میشه به همان اندازه ای که Scroll صورت می گیره، مکان پخش آهنگ هم به همان اندازه جلو یا عقب بره. البته این حالت در صورت درست خواهد بود که قبلش کد زیر نوشته شده باشه:


trackBar1.Maximum = (int)Math.Ceiling(axWindowsMediaPlayer1.currentMed ia.duration);

حداکثر مقداری که trackBar1.Value میتونه داشته باشه از طریق کد بالا تعیین میشه.
که از متد Math.Ceiling استفاده شده تا مقدار currentMedia.duration را به عدد صحیح رو به بالا گرد کنه.
حالا چرا از دو کد فوق اینطوری استفاده کردیم؟
روش کار به اینصورته که میآیم و زمان کل آهنگ رو بعنوان ماکزیمم مقدار trackBar1 مشخص میکنیم. پس طولی که trackBar1 میتونه Scroll کنه، برابر با طول زمان پخش آهنگ خواهد بود، هر جا که Scroll قرار داشته باشه (خاصیت Value)، زمان سپری شده از آهنگ هم باید در همونجا قرار داده بشه (مثل اصل تشابه در ریاضیات در نظر بگیرید چون طول trackBar1 با زمان کل آهنگ برابره).
اگر میخواهید یک نمونه ببینید، همون نمونه برنامه ای که گذاشته بودم، TrackBar اش رو Scroll کنید، همون کاری رو میکنه که میخواهید.

mina1363
سه شنبه 30 مرداد 1386, 14:47 عصر
مرسی PC2st.ir مهربون
یه سؤال؟
من از کجا باید بفهمم که کدهایم را در چه رویدادی باید بنویسم؟

mina1363
سه شنبه 30 مرداد 1386, 14:59 عصر
ببخشیدا!
ولی پس چرا مال من اصلا هیچی در خروجی نشان نمیده؟
حتی 00000000000 رو :-(

PC2st
سه شنبه 30 مرداد 1386, 15:20 عصر
میشه اون قسمت از کدی که اشکال داره رو اینجا بنویسید، و لطفا بگید که کدها جزء کدوم رویداد هستند؟

mina1363
سه شنبه 30 مرداد 1386, 15:24 عصر
اصلا اشکال نداره که error هم نمیده فقط label خالی است
privatevoid button3_Click(object sender, EventArgs e)
{
SoundPlayer sp = newSoundPlayer(@"F:\Programming\GhazalNama\GhazalNama\GhazalNama\Re sources\WAV\4.wav");
Stopwatch mywatch = newStopwatch();
if (button3.Text == "Start")
{

mywatch.Start();
button3.Text = "Stop";
sp.Play();


}
elseif (button3.Text == "Stop") {
mywatch.Stop();
sp.Stop();
button3.Text = "Start";
double TimeSpent = mywatch.ElapsedMilliseconds / 100D;
label2.Text = string.Format("Elapsed time :{0} Seconds", TimeSpent.ToString("#,##.##"));

}

mina1363
سه شنبه 30 مرداد 1386, 15:28 عصر
مرسی PC2st.ir مهربون
یه سؤال؟
من از کجا باید بفهمم که کدهایم را در چه رویدادی باید بنویسم؟

mina1363
سه شنبه 30 مرداد 1386, 15:34 عصر
آخ واقعا باید ببخشید این کدها مال یه سؤال دیگه بود که ازتون پرسیده بودم
و الا این track bar مسئله اش حل شد
اصلا حواسم نبود:-(

PC2st
سه شنبه 30 مرداد 1386, 16:01 عصر
Stopwatch mywatch = new Stopwatch();

کد فوق نباید درون متد button3_Click باشه، باید بعنوان یک فیلد از کلاس معرفی اش کنید:


Stopwatch mywatch = new Stopwatch();

private void button3_Click(object sender, EventArgs e)
{
SoundPlayer sp = new SoundPlayer(@"F:\Programming\GhazalNama\GhazalNama\GhazalNama\Re sources\WAV\4.wav");
if (button3.Text == "Start")
{
mywatch.Start();
button3.Text = "Stop";
sp.Play();
}
else if (button3.Text == "Stop")
{
mywatch.Stop();
sp.Stop();
button3.Text = "Start";
double TimeSpent = mywatch.ElapsedMilliseconds / 100D;
label2.Text = string.Format("Elapsed time :{0} Seconds", TimeSpent.ToString("#,##.##"));
}
}

mina1363
سه شنبه 30 مرداد 1386, 16:32 عصر
مرسی مرسی مرسی و باز هم مرسی
ببخشید من یک کم سر به هوا هستم فکر کنم یکدفعه اینو بهم گفتید ولی یادم رفته بود اجراش کنم :-(
ولی واقعا یک دنیا تشکر
حالا راستی چرا وقتی تو ی متد button3_Click نوشتم جواب نمیداد ولی وقتی به عنوان فیلد کلاس نوشتم جواب داد؟

mina1363
سه شنبه 30 مرداد 1386, 16:38 عصر
یه چیز دیگه:
حالا اگه بخوام بر عکس این رو داشته باشم برای یک مسابقه که مدت داره و این مدت رو من سیستم تعیین میکنم نه هر زمان که کاربر خواست طول بده) تایمر بر عکس ( این چه جوریه؟؟؟؟؟؟؟

PC2st
سه شنبه 30 مرداد 1386, 17:54 عصر
حالا راستی چرا وقتی تو ی متد button3_Click نوشتم جواب نمیداد ولی وقتی به عنوان فیلد کلاس نوشتم جواب داد؟
طول عمر فیلدها به اندازه طول عمر استفاده از یک کلاس است.
طول عمر یک متغیری که در یک متد تعریف میشه، به اندازه طول عمر همان متد است، یعنی با پایان دستورات متد، متغیر نابود میشه و به طبع اطلاعاتش هم از بین میره.


حالا اگه بخوام بر عکس این رو داشته باشم برای یک مسابقه که مدت داره و این مدت رو من سیستم تعیین میکنم نه هر زمان که کاربر خواست طول بده
برای برعکس این حالت، باید زمان کل از زمانی سپری شده کم بشه یا یک واحد همینطوری ازش کم بشه، مثلا برای trackBar1، قبلش یک طول حداکثر را براش مشخص میکنیم و مقدار فعلی Scroll را روی حداکثر تنظیم میکنیم:


trackBar1.Maximum = 100;
trackBar1.Value = 100;

بعد باید کد زیر رو در رویداد Tick از کنترل timer1 بنویسم تا هر بار که یک ثانیه میگذره (Interval = 1000)، اون وقت trackBar1 مقدارش عوض بشه تا کاربر متوجه بشه که چقدر مهلت داره تا به سوال پاسخ بده، یعنی مینویسیم:


private void timer1_Tick(object sender, EventArgs e)
{
if (trackBar1.Value != 0)
trackBar1.Value--;
}

همین... نمیدونم منظورت همین بود یا چیز دیگه...

mina1363
سه شنبه 30 مرداد 1386, 18:11 عصر
اینها در ست پس چه طوری زمان مثلا یک دقیقه برای پاسخ دادن را در کد مشخص کنم ؟

PC2st
سه شنبه 30 مرداد 1386, 18:46 عصر
چون میخوایم زمان یک دقیقه باشه:


trackBar1.Maximum = 60;
trackBar1.Value = 60;


هر وقت trackBar1.Value به صفر رسید یعنی زمان به صفر رسیده، این رو میشه در داخل timer1 تشخیص داد، مثلا:


private void timer1_Tick(object sender, EventArgs e)
{
if (trackBar1.Value > 0)
trackBar1.Value--;
else
{
timer1.Enabled = false;
MessageBox.Show("Your time is over.");
CheckUserAnswerds();
}
}

که مثلا متد CheckUserAnswerds مشخص میکنه که کاربر چند تا سوال رو درست و چند تا رو غلط جواب داده و وقتی timer1.Enabled برابر false باشه، دیگه timer1 کار نمیکنه تا وقتی که true بشه.

mina1363
سه شنبه 30 مرداد 1386, 21:04 عصر
البته ببخشید که من جسارت میکن ولی توی اون چند تا پست قبلی که گفتید \100D رو بنویسم به جای تعداد ثانیه ها عددی با شکل مثلا 567.89 نشان میداد ولی وقتی پاکش کردم درست شد

PC2st
سه شنبه 30 مرداد 1386, 21:19 عصر
امیدوارم ببخشید، چون فکر میکردم میخواستید ازش درصد بگیرید... :بامزه:

mina1363
چهارشنبه 31 مرداد 1386, 20:41 عصر
جناب PC2st.ir وقتی کد بالا رو نوشتم messageBox.show() افتاد تو loop خیلی باهال ولی بد بود
اگر بخوام به جای trachbar زمان باقیمانده توی یه label نشون داده بشه باید چه کنم ؟

PC2st
چهارشنبه 31 مرداد 1386, 22:52 عصر
باید از DateTime استفاده بشه، که مثلا اگر بخوایم یک دقیقه به کاربر مهلت بدیم که به سوالات پاسخ بده:


DateTime dt = new DateTime(1,1,1,0,1,0);

که متغیر dt رو بعنوان یک فیلد در کلاس تعریف میکنیم.
بعدش خاصیت Interval از شیئ timer1 را روی 1000 (یعنی 1 ثانیه) تنظیم میکنیم و در رویداد Tick از timer1 کد زیر رو مینویسیم:


if(this.dt.TimeOfDay.TotalSeconds > 0)
{
this.dt = this.dt.AddSeconds(-1);
this.label1.Text = this.dt.ToString("HH:mm:ss");
}
else
{
this.timer1.Enabled = false;
//more codes here...
}

mina1363
پنج شنبه 01 شهریور 1386, 05:24 صبح
:تشویق:مرسی مرسی PC2st.ir دقیقا همینو میخواستم:چشمک: