PDA

View Full Version : سوال: نمایش تصویر به صورت topmost جهت استفاده به عنوان tooltip



mehrdad1991h
پنج شنبه 19 اردیبهشت 1392, 19:57 عصر
سلام
خوب الان من یه کلاس دارم که میاد متن را از من دریافت میکنه میزاردش روی یه عکس و مثل tooltip نمایشش میده
برای این این کلاس را استفاده میکنم چون میخواستم نوشته ها (متن tooltip) کنار موس حرکت کنند

خوب الان مشکل کجاست اینجا که وقتی موس به سمت گوشه های فرم حرکت میکنه نوشته و تصویر هم حرکت میکنه و میره زیر کادر فرم (یعنی دیگه قابل مشاهده نیست)
این در حالیه که tooltip خود ویژوال اینجوری نیست و از کادر خارج میشه (به عنوان نمونه روی دکمه ی close برنامه بایستید تا نوشته ی close را مشاهده کنید میبینید که از کادر فرم زده بیرون و کاملا قابل دیدن هست)

الان من میخوام بدونم چه کاری میتونم بکنم که این حالت ایجاد بشه
چی کار کنم نوشته روی همه چیز قرار بگیره و از کادر فرم بزنه بیرون و نوشته هاش قابل خوندن باشن در گوشه های فرم که میریم نروند زیر کادر و نشود دیدشون و خوندشون بلکه بتونیم ببینیم و بخونیم و...!!!
کسی میتونه کمکی کنه
لطفا اهنمایی فرمایید
با تشکر
سپاس

mehrdad1991h
پنج شنبه 19 اردیبهشت 1392, 20:37 عصر
تصویر را در یک فرم قرار بده و فرم را همراه موس جابجا کنید. و یا کلاستون را از فرم ارث بری کنید.

خوب اینجوری با لبه های فرم چی کار کنم ؟
مثلا تصویر من دایره است فرم را که نمیتونم دایره کنمکه ؟ WPF هم اصلا بلد نیستم که بتونم ازش استفاده کنم
و اما در مورد ارث بری ، میشه یه توضیح خیلی مختصر بهم بدید ؟ من مثلا برای ارث بری میام اینجوری کلاس را نام گذاری میکنم :
public class Tooltip : Form
بعد توی فرم اصلی برا اینکه بتونم tooltip که ساختم را نمایش بدم اینجوری ازش استفاده میکنم

private Tooltip t = null;
t = new Tooltip("[تست]");
t.Show();//در حالت عادی

((Form)t).Show(); // در حالتی که ارث بری میکنم



خوب الان اینجوری درسته ؟
با این کد من فقط یه فرم جدید باز میشه ... :/:افسرده:

مختصر توضیحی میشه بدید بهم ؟

plus
پنج شنبه 19 اردیبهشت 1392, 20:54 عصر
خوب شما میتونید از Tooltip خود #C استفاده کنید و برای نمایش عکس در اون، رویداد Draw اون رو Handle کنید.

mehrdad1991h
پنج شنبه 19 اردیبهشت 1392, 21:19 عصر
خوب شما میتونید از Tooltip خود #C استفاده کنید و برای نمایش عکس در اون، رویداد Draw اون رو Handle کنید.

سلام
بابا به اونا فکر کردم ولی نمیشه
میخوام تولتیپ متحرک باشد و هرجا موس میره هم دنبالش بره
همون سوال اول را میشه جواب بدید ؟
یا یه راه حل بگید که چه کنم یا همون ارث بری را یکم توضیح بدید بفهمیم با اون اوکی میشه یا نه که فک کنم با اونم نشه :((
لطفا راهنمایی فرمایید

Mahmoud.Afrad
پنج شنبه 19 اردیبهشت 1392, 22:52 عصر
از این کلاس استفاده کنید:

using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;

class MyTooltip : Form
{
public MyTooltip()
{
this.ShowInTaskbar = false;
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.TopMost = true;
this.BackColor = Color.Lime;
this.TransparencyKey = Color.Lime;
}
~MyTooltip()
{
Form frmOwner = this.Owner;
if (frmOwner != null)
{
GetEventFromOwner(frmOwner);
}
}

protected override void OnBackgroundImageChanged(EventArgs e)
{
base.OnBackgroundImageChanged(e);

if (this.BackgroundImage != null)
{
this.Region = new Region(new Rectangle(this.Location, this.BackgroundImage.Size));
}
}

protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);

Form frmOwner = this.Owner;
if (frmOwner != null)
{
AddEventToOwner(frmOwner);
}
}

private void AddEventToOwner(Control control)
{
control.MouseMove += new MouseEventHandler(control_MouseMove);

foreach (Control c in control.Controls)
{
AddEventToOwner(c);
}
}
private void GetEventFromOwner(Control control)
{
control.MouseMove -= new MouseEventHandler(control_MouseMove);

foreach (Control c in control.Controls)
{
GetEventFromOwner(c);
}
}
void control_MouseMove(object sender, MouseEventArgs e)
{
this.Top = MousePosition.Y - this.BackgroundImage.Height / 2;
this.Left = MousePosition.X + 20;
}
}

برای استفاده باید Owner را ست کنید. تصویر را هم در BackgoundImage قرار بدید:

MyTooltip frmTooltip = new MyTooltip();
frmTooltip.Owner = this;
frmTooltip.BackgroundImage = bmp;
frmTooltip.Show();

mehrdad1991h
جمعه 20 اردیبهشت 1392, 01:12 صبح
بازم سلام :افسرده:
جناب Mahmoud.Afrad (http://barnamenevis.org/member.php?71297-Mahmoud.Afrad) بسیار از لطف شما و وقتی که برای بنده گذاشتید تشکر میکنم
ولی ببخشید من با این کلاسی که قرار دادی هنوز مشکل دارم
این کلاس بسیار عالیه و دقیقا مشکلی که من داشتم را حل میکنه ولی
ببینید با این کلاس ظاهرا فقط یه عکس را میشه نشون داد درسته ؟ من نتونستم متنی روش ست کنم ، میشه متنی روی تصویرش ست کرد / چجوری ؟

ببینید اینجا را (http://barnamenevis.org/showthread.php?384309-tooltip-%D9%85%D8%AA%D8%AD%D8%B1%DA%A9-%D8%AF%D8%B1-%DA%A9%D9%86%D8%A7%D8%B1-%D9%85%D9%88%D8%B3&p=1701927&viewfull=1#post1701927) [+ (http://barnamenevis.org/showthread.php?384309-tooltip-%D9%85%D8%AA%D8%AD%D8%B1%DA%A9-%D8%AF%D8%B1-%DA%A9%D9%86%D8%A7%D8%B1-%D9%85%D9%88%D8%B3&p=1701927&viewfull=1#post1701927)] مثلا ما الان یه کلاس داریم که منم از همون دارم استفاده میکنم
ولی مشکلش همینه که در این تاپیک الان مطرح کردم
به کلاسی که شما اماده کردید هرچقدر دقت کردم و تلاش کردم باز هم نتونستم
این خاصیتی (topmost) که شما اینجا فعال کردی را روی کلاسی که توی لینک بالا هست فعال کنم

ممکنه درخواست من یه مقدار نامعقول باشه ولی اگر وقتتون اجازه میده خوشحال میشم یه نگاه مختصر به اون کلاس بندازید ببینید میشه topmost را براش فعال کرد یا خیر
مزیت کلاس بالا در اینه که متن کاملا میتونه متغیر باشه و روی تصویر قرار میگیره و تصویر متناسب با متن اندازه اش تعیین و ست میشه و...
به هر حال من هر کاری میکنم که topmost شود یا بهم خطا میده یا topmost نمیشه ! :((

ممنون میشوم اگر کسی بتونه راهنمایی کنه
سپاس

Mahmoud.Afrad
جمعه 20 اردیبهشت 1392, 08:15 صبح
کدی که توی اون تاپیک هست رو به این شکل بنویس:

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

public class FixedTooltip : Form
{
private struct FitMargin
{
public int Left, Top, Right, Bottom, HCenter, VCenter;

public FitMargin(int left, int top, int right, int bottom, int hCenter, int vCenter)
{
this.Left = left;
this.Top = top;
this.Right = right;
this.Bottom = bottom;
this.HCenter = hCenter;
this.VCenter = vCenter;
}
}
private string _Text;
private Image _Skin;
private Image _Image;
private Control _OwnerControl;

public Image Image
{
get
{
return _Image;
}
set
{
_Image = value;
if (_Image != null)
{
this.Size = _Image.Size;
}
this.Invalidate();
}
}

public FixedTooltip(string text, Control OwnerControl, Image skin)
{
if (string.IsNullOrEmpty(text))
{
throw new ArgumentOutOfRangeException();
}
this.Text = text;
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.ShowInTaskbar = false;
this.BackColor = Color.DarkGray;
this.TransparencyKey = Color.DarkGray;
_Skin = skin;
_OwnerControl = OwnerControl;
if (_OwnerControl != null)
{
_OwnerControl.MouseEnter += new EventHandler(_OwnerControl_MouseEnter);
_OwnerControl.MouseLeave += new EventHandler(_OwnerControl_MouseLeave);
_OwnerControl.MouseMove += new MouseEventHandler(_OwnerControl_MouseMove);
}
}
public FixedTooltip(string text, Control Owner)
: this(text, Owner, null)
{
}

void _OwnerControl_MouseEnter(object sender, EventArgs e)
{
Show(_OwnerControl.FindForm());
_OwnerControl.FindForm().Focus();
}

void _OwnerControl_MouseLeave(object sender, EventArgs e)
{
Hide();
}

void _OwnerControl_MouseMove(object sender, MouseEventArgs e)
{
ResetLocation();
}

~FixedTooltip()
{
if (_OwnerControl != null)
{
_OwnerControl.MouseEnter -= new EventHandler(_OwnerControl_MouseEnter);
_OwnerControl.MouseLeave -= new EventHandler(_OwnerControl_MouseLeave);
_OwnerControl.MouseMove -= new MouseEventHandler(_OwnerControl_MouseMove);
}
}

protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);

if (_Image != null)
{
e.Graphics.DrawImage(_Image, 0, 0);
}
}

public override string Text
{
get
{
return _Text;
}
set
{
if (string.IsNullOrEmpty(value))
{
throw new ArgumentOutOfRangeException();
}
_Text = value;
Graphics fg = this.CreateGraphics();
Size ts = fg.MeasureString(_Text, this.Font).ToSize();
Bitmap bmp;
if (_Skin == null)
{
bmp = new Bitmap(ts.Width + 10, ts.Height + 8);
using (Graphics g = Graphics.FromImage(bmp))
{
g.Clear(SystemColors.Info);
Rectangle rect = new Rectangle(0, 0, bmp.Width - 1, bmp.Height - 1);
g.DrawRectangle(SystemPens.WindowFrame, rect);
g.DrawString(_Text, this.Font, SystemBrushes.InfoText, 5, 3);
}
}
else
{
bmp = new Bitmap(ts.Width + 17, ts.Height + 11);
using (Graphics g = Graphics.FromImage(bmp))
{
g.Clear(Color.FromArgb(0, 0, 0, 0));
FitMargin margin = new FitMargin(8, 8, 11, 11, 1, 1);
FitPaint(g, _Skin, new Rectangle(0, 0, 20, 20), new Rectangle(0, 0, bmp.Width, bmp.Height), margin);
g.DrawString(_Text, this.Font, SystemBrushes.InfoText, 8, 3);
}
}
this.Image = bmp;
}
}

protected override void OnShown(EventArgs e)
{
base.OnShown(e);

ResetLocation();
this.Size = new System.Drawing.Size(this.Image.Width + 20, this.Image.Height + 10);
}

private void ResetLocation()
{
this.Left = MousePosition.X + 10;
this.Top = MousePosition.Y - 5;
}

private void FitPaint(Graphics graphics, Image img, Rectangle src, Rectangle dst, FitMargin margin)
{
if (graphics == null)
{
return;
}
Rectangle dstRect, srcRect;
int left = Math.Min(dst.Width, margin.Left);
int top = Math.Min(dst.Height, margin.Top);
int right = Math.Min(dst.Width - left, margin.Right);
int bottom = Math.Min(dst.Height - top, margin.Bottom);
int hcenter = dst.Width - left - right;
int vcenter = dst.Height - top - bottom;
if (top > 0)
{
if (left > 0)
{
srcRect = new Rectangle(src.X, src.Y, left, top);
dstRect = new Rectangle(dst.X, dst.Y, left, top);
graphics.DrawImage(img, dstRect, srcRect, GraphicsUnit.Pixel);
}
if (right > 0)
{
srcRect = new Rectangle(src.Right - right, src.Y, right, top);
dstRect = new Rectangle(dst.Right - right, dst.Y, right, top);
graphics.DrawImage(img, dstRect, srcRect, GraphicsUnit.Pixel);
}
if (hcenter > 0)
{
srcRect = new Rectangle(src.X + margin.Left, src.Y, margin.HCenter, top);
dstRect = new Rectangle(dst.X + margin.Left, dst.Y, hcenter, top);
graphics.DrawImage(img, dstRect, srcRect, GraphicsUnit.Pixel);
}
}
if (vcenter > 0)
{
if (left > 0)
{
srcRect = new Rectangle(src.X, src.Y + top, left, margin.VCenter);
dstRect = new Rectangle(dst.X, dst.Y + top, left, vcenter);
graphics.DrawImage(img, dstRect, srcRect, GraphicsUnit.Pixel);
}
if (right > 0)
{
srcRect = new Rectangle(src.Right - right, src.Y + top, right, margin.VCenter);
dstRect = new Rectangle(dst.Right - right, dst.Y + top, right, vcenter);
graphics.DrawImage(img, dstRect, srcRect, GraphicsUnit.Pixel);
}
if (hcenter > 0)
{
srcRect = new Rectangle(src.X + margin.Left, src.Y + margin.Top, margin.HCenter, margin.VCenter);
dstRect = new Rectangle(dst.X + margin.Left, dst.Y + margin.Top, hcenter, vcenter);
graphics.DrawImage(img, dstRect, srcRect, GraphicsUnit.Pixel);
}
}
if (bottom > 0)
{
if (left > 0)
{
srcRect = new Rectangle(src.X, src.Bottom - bottom, left, bottom);
dstRect = new Rectangle(dst.X, dst.Bottom - bottom, left, bottom);
graphics.DrawImage(img, dstRect, srcRect, GraphicsUnit.Pixel);
}
if (right > 0)
{
srcRect = new Rectangle(src.Right - right, src.Bottom - bottom, right, bottom);
dstRect = new Rectangle(dst.Right - right, dst.Bottom - bottom, right, bottom);
graphics.DrawImage(img, dstRect, srcRect, GraphicsUnit.Pixel);
}
if (hcenter > 0)
{
srcRect = new Rectangle(src.X + left, src.Bottom - bottom, margin.HCenter, bottom);
dstRect = new Rectangle(dst.X + left, dst.Bottom - bottom, hcenter, bottom);
graphics.DrawImage(img, dstRect, srcRect, GraphicsUnit.Pixel);
}
}
}
}

mehrdad1991h
جمعه 20 اردیبهشت 1392, 21:05 عصر
سلام
خوب
این کلاس اومد یه سری کار ها را راحت تر کرد ولی یه سری مشکلات را بیشتر کرد !!!
خوب چون داریم از فرم استفاده میکنیم به محض اینکه میریم روی یه کنترل فرم فعال میشه همین TOOLTIP که ساختیم حالا هی پرش ایجاد میشه وقتی رو کنترل ها جا به جا میشیم
یا مثلا وقتی موس را سریع تکنون میدیم دوباره قاطی میکنه
تصویر روش ست نشد اخر
و....
این مشکلات خوب به خاطر اینه که اومدیم فرم کردیمش
یعنی نمیشه کاری کرد که به چنین مشکلاتی نخوریم ؟
راه حلی به نظرتون نمیرسه ؟
چیزی که من به ذهنم رسید اینه که بیایم بگیم اگر مختصات تصویری که نشون میده با توجه به مکان موس و طول متن ایجاد شده
اگر از کادر فرم قراره رد بشه بیاد نگزاره بره
حالا مشکل اونوری ایجاد میشه یه موقع از اینو نمیزاره بره متن پشت کادر متن طولانی باشه از اونور کادر میره پشت کادر
قاطی کردم منم :عصبانی++:
یعنی راه حلی که مناسب باشه مشکل نداشته باشه وجود داره ؟
میشه اطفا اگر کسی راهی داره بیان کنه /
سپاس

Mahmoud.Afrad
شنبه 21 اردیبهشت 1392, 01:13 صبح
این هم یک نمونه

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

public class PopupWindow : ToolStripDropDown
{
private struct FitMargin
{
public int Left, Top, Right, Bottom, HCenter, VCenter;

public FitMargin(int left, int top, int right, int bottom, int hCenter, int vCenter)
{
this.Left = left;
this.Top = top;
this.Right = right;
this.Bottom = bottom;
this.HCenter = hCenter;
this.VCenter = vCenter;
}
}
private string text;
private Control owner;
private Image image;
public Image Image
{
get
{
return image;
}
private set
{
image = value;
if (image != null)
{
this.Size = image.Size;

this.BackgroundImage = value;
this.BackgroundImageLayout = ImageLayout.Stretch;
}
this.Invalidate();
}
}

public PopupWindow(string text, Control owner, Image skin)
{
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.ContainerControl, false);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.Selectable, false);
SetStyle(ControlStyles.SupportsTransparentBackColo r, true);
SetStyle(ControlStyles.UserPaint, true);

this.Text = text;
this.owner = owner;
this.image = skin;
this.DoubleBuffered = true;
this.ResizeRedraw = true;
this.TabStop = false;
this.Items.Add(text);

this.AutoClose = false;

if (owner != null)
{
owner.MouseEnter += new EventHandler(Owner_MouseEnter);
owner.MouseLeave += new EventHandler(Owner_MouseLeave);
owner.MouseMove += new MouseEventHandler(Owner_MouseMove);
}
}
public PopupWindow(string text, Control Owner)
: this(text, Owner, null)
{ }

~PopupWindow()
{
if (owner != null)
{
owner.MouseEnter -= new EventHandler(Owner_MouseEnter);
owner.MouseLeave -= new EventHandler(Owner_MouseLeave);
owner.MouseMove -= new MouseEventHandler(Owner_MouseMove);
}
}

void Owner_MouseEnter(object sender, EventArgs e)
{
this.Show();
}

void Owner_MouseLeave(object sender, EventArgs e)
{
this.Close();
}

void Owner_MouseMove(object sender, MouseEventArgs e)
{
this.SuspendLayout();
this.Left = MousePosition.X + 10;
this.Top = MousePosition.Y;
this.ResumeLayout(true);
}

public override string Text
{
get
{
return text;
}
set
{
if (string.IsNullOrEmpty(value))
{
throw new ArgumentOutOfRangeException();
}
text = value;
using (Graphics g = this.CreateGraphics())
{
Size size = g.MeasureString(text, this.Font).ToSize();
Bitmap bmp;

if (this.image == null)
{
bmp = new Bitmap(size.Width + 10, size.Height + 8);
using (Graphics bmpGraphic = Graphics.FromImage(bmp))
{
bmpGraphic.Clear(SystemColors.Info);
Rectangle rect = new Rectangle(0, 0, bmp.Width - 1, bmp.Height - 1);
bmpGraphic.DrawRectangle(SystemPens.WindowFrame, rect);
bmpGraphic.DrawString(text, this.Font, SystemBrushes.InfoText, 5, 4);
}
}
else
{
bmp = new Bitmap(size.Width + 20, size.Height + 12);
using (Graphics g3 = Graphics.FromImage(bmp))
{
g3.Clear(Color.FromArgb(0, 0, 0, 0));
FitMargin margin = new FitMargin(8, 8, 11, 11, 1, 1);
FitPaint(g3, this.image, new Rectangle(0, 0, 20, 20), new Rectangle(0, 0, bmp.Width, bmp.Height), margin);
g3.DrawString(text, this.Font, SystemBrushes.InfoText, 8, 3);
}
}

this.Image = bmp;
}
}
}


protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);

if (image != null)
{
e.Graphics.DrawImage(image, 0, 0);
}
}

private void FitPaint(Graphics graphics, Image img, Rectangle src, Rectangle dst, FitMargin margin)
{
if (graphics == null)
{
return;
}
Rectangle dstRect, srcRect;
int left = Math.Min(dst.Width, margin.Left);
int top = Math.Min(dst.Height, margin.Top);
int right = Math.Min(dst.Width - left, margin.Right);
int bottom = Math.Min(dst.Height - top, margin.Bottom);
int hcenter = dst.Width - left - right;
int vcenter = dst.Height - top - bottom;
if (top > 0)
{
if (left > 0)
{
srcRect = new Rectangle(src.X, src.Y, left, top);
dstRect = new Rectangle(dst.X, dst.Y, left, top);
graphics.DrawImage(img, dstRect, srcRect, GraphicsUnit.Pixel);
}
if (right > 0)
{
srcRect = new Rectangle(src.Right - right, src.Y, right, top);
dstRect = new Rectangle(dst.Right - right, dst.Y, right, top);
graphics.DrawImage(img, dstRect, srcRect, GraphicsUnit.Pixel);
}
if (hcenter > 0)
{
srcRect = new Rectangle(src.X + margin.Left, src.Y, margin.HCenter, top);
dstRect = new Rectangle(dst.X + margin.Left, dst.Y, hcenter, top);
graphics.DrawImage(img, dstRect, srcRect, GraphicsUnit.Pixel);
}
}
if (vcenter > 0)
{
if (left > 0)
{
srcRect = new Rectangle(src.X, src.Y + top, left, margin.VCenter);
dstRect = new Rectangle(dst.X, dst.Y + top, left, vcenter);
graphics.DrawImage(img, dstRect, srcRect, GraphicsUnit.Pixel);
}
if (right > 0)
{
srcRect = new Rectangle(src.Right - right, src.Y + top, right, margin.VCenter);
dstRect = new Rectangle(dst.Right - right, dst.Y + top, right, vcenter);
graphics.DrawImage(img, dstRect, srcRect, GraphicsUnit.Pixel);
}
if (hcenter > 0)
{
srcRect = new Rectangle(src.X + margin.Left, src.Y + margin.Top, margin.HCenter, margin.VCenter);
dstRect = new Rectangle(dst.X + margin.Left, dst.Y + margin.Top, hcenter, vcenter);
graphics.DrawImage(img, dstRect, srcRect, GraphicsUnit.Pixel);
}
}
if (bottom > 0)
{
if (left > 0)
{
srcRect = new Rectangle(src.X, src.Bottom - bottom, left, bottom);
dstRect = new Rectangle(dst.X, dst.Bottom - bottom, left, bottom);
graphics.DrawImage(img, dstRect, srcRect, GraphicsUnit.Pixel);
}
if (right > 0)
{
srcRect = new Rectangle(src.Right - right, src.Bottom - bottom, right, bottom);
dstRect = new Rectangle(dst.Right - right, dst.Bottom - bottom, right, bottom);
graphics.DrawImage(img, dstRect, srcRect, GraphicsUnit.Pixel);
}
if (hcenter > 0)
{
srcRect = new Rectangle(src.X + left, src.Bottom - bottom, margin.HCenter, bottom);
dstRect = new Rectangle(dst.X + left, dst.Bottom - bottom, hcenter, bottom);
graphics.DrawImage(img, dstRect, srcRect, GraphicsUnit.Pixel);
}
}
}
}