PDA

View Full Version : استفاده از hot spot در کنترل ها



bahar_engineer
پنج شنبه 20 فروردین 1388, 15:02 عصر
می خوام در برنامه ام اگه بشه از hot spot استفاده کنم ... با استفاده از hot spot یک منطقه مشخص از فرم را انتخاب می کنیم و در رویداد کلیک اون منطقه هر دستوری که بنویسیم ...
وقتی موس روی هر بخش از اون منطقه کلیک کند ... اون دستورات اجرا می شوند.

کسی می دونه توی سی شارپ چطور می شه از hot spot استفاده کرد ؟؟

meysam_pro
پنج شنبه 20 فروردین 1388, 15:58 عصر
اصطلاح hotSpot فکر کنم واسه MMB باشه نه؟
1.توی رویدادهای موس ِ مربوط به فرم میتونی کنترلش بکنی.
2.یک PictureBox خالی بزار و رویداد های اونرو کنترل کن.

bahar_engineer
شنبه 22 فروردین 1388, 10:15 صبح
سلام
کسی نمی دونه معادل hot spot در سی شارپ چیه ؟

من یه کد پیدا کردم با عنوان hot spot در سی شارپ اما نمی دونم چکار می کنه اگه ممکنه یه نگاه بهش بندازین...

لینک : http://www.gamedev.net/community/forums/topic.asp?topic_id=524696



using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace HotspotControl
{
[DefaultEvent("Click")]
[DefaultProperty("Image")]
public partial class Hotspot : UserControl
{
public Hotspot()
{
InitializeComponent();
}

private bool _isMouseOver = false;
private bool IsMouseOver
{
get
{
return _isMouseOver;
}
set
{
if (_isMouseOver != value)
{
_isMouseOver = value;
InvalidateEx();
}
}
}

private Bitmap _image;

[Browsable(true)]
public Bitmap Image
{
get
{
return _image;
}
set
{
_image = value;
InvalidateEx();
}
}

private Bitmap _imageHighlighted;

[Browsable(true)]
public Bitmap ImageHighlighted
{
get
{
return _imageHighlighted;
}
set
{
_imageHighlighted = value;
}
}

protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT
return cp;
}
}

protected void InvalidateEx()
{
if (Parent == null)
return;

Rectangle rc = new Rectangle(this.Location, this.Size);
Parent.Invalidate(rc, true);
}



protected override void OnPaintBackground(PaintEventArgs pevent)
{
//do nothing to prevent the background from being painted
}


protected override void OnPaint(PaintEventArgs e)
{
if (IsMouseOver && _imageHighlighted != null)
{
e.Graphics.DrawImageUnscaled(_imageHighlighted, 0, 0);
}
else if(_image != null)
{
e.Graphics.DrawImageUnscaled(_image, 0, 0);
}
}

private void Hotspot_MouseEnter(object sender, EventArgs e)
{
IsMouseOver = Hittest(this.PointToClient(MousePosition));
}

private void Hotspot_MouseLeave(object sender, EventArgs e)
{
IsMouseOver = Hittest(this.PointToClient(MousePosition));
}

private void Hotspot_MouseMove(object sender, MouseEventArgs e)
{
IsMouseOver = Hittest(this.PointToClient(MousePosition));
}

protected override void OnMouseClick(MouseEventArgs e)
{
if(Hittest(this.PointToClient(MousePosition)))
{
base.OnMouseClick(e);
}
}

private bool Hittest(Point point)
{
bool hit = false;
Bitmap image = _image;
if (IsMouseOver)
{
image = _imageHighlighted;
}
if (image != null &&
point.X >= 0 && point.X < image.Width &&
point.Y >= 0 && point.Y < image.Height)
{
hit = (image.GetPixel(point.X, point.Y).A != 0);
}
return hit;
}
}
}

NewFoxStudent
شنبه 22 فروردین 1388, 14:55 عصر
این کد یه یوزر کنترل میسازه که میتونی بجای PicturBox ازش استفاده کنی
میتونی رویدادهای دلخواهت رو هم بهش اضافه کنی و ازش استفاده کنی

NewFoxStudent
شنبه 22 فروردین 1388, 15:06 عصر
http://www.codeproject.com/KB/buttons/hotspot.aspx

اگه یه سرچ توی CodeProject بزنی مثالهای فراوون و بدرد بخور دیگه ای هم پیدا میکنی

jalalx
شنبه 22 فروردین 1388, 15:24 عصر
سلام!
راستي

[Browsable(true)]
يعني چه؟!

bahar_engineer
شنبه 22 فروردین 1388, 15:26 عصر
اما من این کد رو که اجرا می کنم اصلاً چیزی شبیه به دمو به من نمی ده
یه فرم می ده که هر چی حرکتش بدم به تعداد خطهایی که داخل فرم می افته اضافه می شه
انگار فرم جا می مونه مثل زمان هایی که کامپیوتر هنگ می کنه

من می خوام یه منطقه را انتخاب کنم و هر وقت توی اون منطقه کلیک کردم یه دستور اجرا بشه

NewFoxStudent
یک شنبه 23 فروردین 1388, 09:40 صبح
باید یه پروژه windows forms control بسازید
بعد این کد رو توی یه فایل با پسوند cs ذخیره کنید و بعد این فایل رو به پروژه اضافه کنید

bahar_engineer
چهارشنبه 26 فروردین 1388, 09:56 صبح
سلام
منظورتون اینه که یه پروژه ویندوز کنترل لایبراری بسازم ؟؟ بعد داخل اون یه کلاس تعریف کنم که این کدها رو توی اون ذخیره کنم؟؟؟ بعد کلاس رو به پروژه خودم اضافه کنم؟؟؟

اینطوری درست می شه ؟

NewFoxStudent
چهارشنبه 26 فروردین 1388, 10:13 صبح
یه پروژه WindowsControlLib بسازید
این کد ها رو هم از همینجا کپی کنید و توی یه فایل تکست بنویسید و با پسوند cs ذخیره کنید
بعد اون فایل رو به پرژه اضافه کنید

حامد مصافی
چهارشنبه 26 فروردین 1388, 10:36 صبح
سلام!
راستي

[Browsable(true)]يعني چه؟!

اگر مقدار پارامتر true باشد این خصوصیت در پنجره Properties ظاهر خواهد شد. والّا، خیر.


@ bahar_engineer (http://barnamenevis.org/forum/member.php?u=90222) :
اگر قرار باشد کنترل های زیر این hot spot قابل رویت باشند چنین کاری غیر ممکن است. مگر اینکه واقعی نباشند و یک تصویر از چنین چیزی باشند.

bahar_engineer
چهارشنبه 26 فروردین 1388, 11:55 صبح
ممنون :تشویق::تشویق::تشویق::تشویق:: شویق::تشویق::تشویق:

عالی بود همون طور که گفتین یه windows control lib ساختم و کد ها رو کپی کردم...

درست شد ....

دقیقاً همون که می خواستم

مرسی