Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Ещё один Bug или... ?  [new]
M234
Member

Откуда: Оттуда...
Сообщений: 26653
Ну и денёк сегодня ! За что ни возьмись всё из рук валится.

Пытаюсь сам нарисовать итем в контекстном меню.
Взял пример из хелпа, ничего не рисует зараза !

private void menuItem1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
		{

			string myCaption = "Owner Draw Item1";

			// Create a Brush and a Font with which to draw the item.
			Brush myBrush = System.Drawing.Brushes.AliceBlue;
			Font myFont = new Font(FontFamily.GenericSerif, 14, FontStyle.Underline, GraphicsUnit.Pixel);
			SizeF mySizeF = e.Graphics.MeasureString(myCaption, myFont);

			// Draw the item, and then draw a Rectangle around it.
		
			e.Graphics.DrawString(myCaption, myFont, myBrush, e.Bounds.X, e.Bounds.Y);
			e.Graphics.DrawRectangle(Pens.Black, new Rectangle(e.Bounds.X, e.Bounds.Y, Convert.ToInt32(mySizeF.Width), Convert.ToInt32(mySizeF.Height)));
			
		}
-------------------------------------------------------------------------
Нет худа без добра, да и добро без худа - чудо.
28 фев 05, 17:37    [1350407]     Ответить | Цитировать Сообщить модератору
 Re: Ещё один Bug или... ?  [new]
maratic_net
Member

Откуда: Moscow
Сообщений: 263
А Owner Draw у меню какое ?
28 фев 05, 17:44    [1350431]     Ответить | Цитировать Сообщить модератору
 Re: Ещё один Bug или... ?  [new]
M234
Member

Откуда: Оттуда...
Сообщений: 26653
maratic_net
А Owner Draw у меню какое ?


Owner Draw у меню - правильное, т.е. true
28 фев 05, 17:49    [1350438]     Ответить | Цитировать Сообщить модератору
 Re: Ещё один Bug или... ?  [new]
кузя
Member

Откуда:
Сообщений: 1703
а событие MeasureItem отрабатываешь правильно ?
1 мар 05, 03:00    [1351044]     Ответить | Цитировать Сообщить модератору
 Re: Ещё один Bug или... ?  [new]
кузя
Member

Откуда:
Сообщений: 1703
Ну и денёк сегодня ! За что ни возьмись всё из рук валится.
я в такие дни обычно занимаюсь подчисткой хвостов - документация, доп. комментрии, перекуры ...
:)
1 мар 05, 03:48    [1351053]     Ответить | Цитировать Сообщить модератору
 ...  [new]
Алексей Р.
Member

Откуда:
Сообщений: 304
сдается мне, не задается высота итема...

так и есть...

private void menuItem1_MeasureItem(object sender, System.Windows.Forms.MeasureItemEventArgs e)
{
e.ItemHeight = 20;
e.ItemWidth = 100;
}
1 мар 05, 08:26    [1351248]     Ответить | Цитировать Сообщить модератору
 Re: Ещё один Bug или... ?  [new]
M234
Member

Откуда: Оттуда...
Сообщений: 26653
public class CustomMenuItem : System.Windows.Forms.MenuItem
	{
		public CustomMenuItem()
		{
			OwnerDraw = true;
		}

		protected override void OnDrawItem(DrawItemEventArgs e)
		{
			base.OnDrawItem (e);
			e.Graphics.FillRectangle(Brushes.White, e.Bounds);
			e.Graphics.DrawString(this.Text, new Font("Arial", 9), Brushes.Black, 0, 0);
		}

		protected override void OnMeasureItem(MeasureItemEventArgs e)
		{
			base.OnMeasureItem (e);
			e.ItemHeight = 20;
			e.ItemWidth = 200;
		}
	}

Меню теперь отрисовывается, но ведёт себя не правильно. Не подсвечивается пункт меню при наведении на него мышью.
Использовать его в таком виде не представляется возможным.
Кто-нибудь может помочь?
-------------------------------------------------------------------------
Нет худа без добра, да и добро без худа - чудо.
1 мар 05, 10:40    [1351657]     Ответить | Цитировать Сообщить модератору
 Re: Ещё один Bug или... ?  [new]
M234
Member

Откуда: Оттуда...
Сообщений: 26653
кузя
Ну и денёк сегодня ! За что ни возьмись всё из рук валится.
я в такие дни обычно занимаюсь подчисткой хвостов - документация, доп. комментрии, перекуры ...
:)


Так я вчера в конце-концов и поступил....
1 мар 05, 10:41    [1351659]     Ответить | Цитировать Сообщить модератору
 Re: Ещё один Bug или... ?  [new]
кузя
Member

Откуда:
Сообщений: 1703
protected override void OnDrawItem(DrawItemEventArgs e)
{
  base.OnDrawItem (e);
  //e.Graphics.FillRectangle(Brushes.White, e.Bounds);
  e.Graphics.FillRectangle(((e.State & DrawItemState.Selected) == DrawItemState.Selected) ? SystemBrushes.Highlight : SystemBrushes.Menu, e.Bounds);
  e.Graphics.DrawString(this.Text, new Font("Arial", 9), Brushes.Black, 0, 0);
}
1 мар 05, 12:22    [1352109]     Ответить | Цитировать Сообщить модератору
 Re: Ещё один Bug или... ?  [new]
M234
Member

Откуда: Оттуда...
Сообщений: 26653
кузя
protected override void OnDrawItem(DrawItemEventArgs e)
{
  base.OnDrawItem (e);
  //e.Graphics.FillRectangle(Brushes.White, e.Bounds);
  e.Graphics.FillRectangle(((e.State & DrawItemState.Selected) == DrawItemState.Selected) ? SystemBrushes.Highlight : SystemBrushes.Menu, e.Bounds);
  e.Graphics.DrawString(this.Text, new Font("Arial", 9), Brushes.Black, 0, 0);
}


Спасибо. Почти помогло. Разрешите ещё немного вас помучить ? :)

Вот исходный код моей тестпрограммы. Вы можете сделать копи-пасте и откомпилировать его.

Появилась проблема со шрифтом "Wingdigns", если вызвать меню и начать выбирать то Итем1, то Итем2, то у Итема2 не перерисовываются символы под курсором мыши и выглядит это плохо.

Нельзя ли как то это исправить? Очень надо использовать этот шрифт.

Код
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace CustomContextMnu
{
	
	public class Form1 : System.Windows.Forms.Form
	{
		private System.Windows.Forms.RichTextBox richTextBox1;
		private System.Windows.Forms.ContextMenu contextMenu1;
		private CustomMenuItem menuItem1;
		private CustomMenuItem menuItem2;
		
		private System.ComponentModel.Container components = null;

		public Form1()
		{
			
			InitializeComponent();

		
		}

		
		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if (components != null) 
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}

		#region Vom Windows Form-Designer generierter Code
		
		private void InitializeComponent()
		{
			this.richTextBox1 = new System.Windows.Forms.RichTextBox();
			this.contextMenu1 = new System.Windows.Forms.ContextMenu();
			this.menuItem1 = new CustomContextMnu.CustomMenuItem();
			this.menuItem2 = new CustomContextMnu.CustomMenuItem();
			this.SuspendLayout();
			// 
			// richTextBox1
			// 
			this.richTextBox1.ContextMenu = this.contextMenu1;
			this.richTextBox1.Font = new System.Drawing.Font("Arial", 36F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
			this.richTextBox1.Location = new System.Drawing.Point(40, 40);
			this.richTextBox1.Name = "richTextBox1";
			this.richTextBox1.Size = new System.Drawing.Size(536, 448);
			this.richTextBox1.TabIndex = 0;
			this.richTextBox1.Text = "richTextBox1";
			// 
			// contextMenu1
			// 
			this.contextMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
																						 this.menuItem1,
																						 this.menuItem2});
			// 
			// menuItem1
			// 
			this.menuItem1.Index = 0;
			this.menuItem1.OwnerDraw = true;
			this.menuItem1.Text = "Item1";
			// 
			// menuItem2
			// 
			this.menuItem2.Index = 1;
			this.menuItem2.OwnerDraw = true;
			this.menuItem2.Text = "Item2";
			// 
			// Form1
			// 
			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
			this.ClientSize = new System.Drawing.Size(616, 534);
			this.Controls.Add(this.richTextBox1);
			this.Name = "Form1";
			this.Text = "Form1";
			this.ResumeLayout(false);

		}
		#endregion

		
		[STAThread]
		static void Main() 
		{
			Application.Run(new Form1());
		}
	}
	
	
	public class CustomMenuItem : System.Windows.Forms.MenuItem
	{
		public CustomMenuItem()
		{
			OwnerDraw = true;
		}

		protected override void OnDrawItem(DrawItemEventArgs e)
		{
			base.OnDrawItem (e);
			e.Graphics.FillRectangle(((e.State & DrawItemState.Selected) == DrawItemState.Selected) ? SystemBrushes.Highlight : SystemBrushes.Menu, e.Bounds);
			e.Graphics.DrawString(this.Text, new Font("Wingdings", 10), Brushes.Black,0, (e.Index * 20));
		}

		protected override void OnMeasureItem(MeasureItemEventArgs e)
		{
			base.OnMeasureItem (e);
			e.ItemHeight = 20;
			e.ItemWidth = 200;
		}
		
		protected override void OnSelect(EventArgs e)
		{
			base.OnSelect (e);
		}
	}

}

1 мар 05, 13:12    [1352439]     Ответить | Цитировать Сообщить модератору
 Re: Ещё один Bug или... ?  [new]
кузя
Member

Откуда:
Сообщений: 1703
Появилась проблема со шрифтом "Wingdigns", если вызвать меню и начать выбирать то Итем1, то Итем2, то у Итема2 не перерисовываются символы под курсором мыши и выглядит это плохо.
честно говоря не понятен вопрос. что не перерисовывается у Итем2 и что ожидалось ?

немного модифицированный текст. вроде работает, как надо ?
protected override void OnDrawItem(DrawItemEventArgs e)
{
  base.OnDrawItem (e);
  e.Graphics.FillRectangle(((e.State & DrawItemState.Selected) == DrawItemState.Selected) ? SystemBrushes.Highlight : SystemBrushes.Menu, e.Bounds);
  e.Graphics.DrawString(this.Text, new Font("Wingdings", 10), ((e.State & DrawItemState.Selected) == DrawItemState.Selected) ? SystemBrushes.HighlightText : SystemBrushes.WindowText, 0, (e.Index * 20));
}
1 мар 05, 16:55    [1353597]     Ответить | Цитировать Сообщить модератору
 Re: Ещё один Bug или... ?  [new]
M234
Member

Откуда: Оттуда...
Сообщений: 26653
кузя
Появилась проблема со шрифтом "Wingdigns", если вызвать меню и начать выбирать то Итем1, то Итем2, то у Итема2 не перерисовываются символы под курсором мыши и выглядит это плохо.
честно говоря не понятен вопрос. что не перерисовывается у Итем2 и что ожидалось ?

немного модифицированный текст. вроде работает, как надо ?
protected override void OnDrawItem(DrawItemEventArgs e)
{
  base.OnDrawItem (e);
  e.Graphics.FillRectangle(((e.State & DrawItemState.Selected) == DrawItemState.Selected) ? SystemBrushes.Highlight : SystemBrushes.Menu, e.Bounds);
  e.Graphics.DrawString(this.Text, new Font("Wingdings", 10), ((e.State & DrawItemState.Selected) == DrawItemState.Selected) ? SystemBrushes.HighlightText : SystemBrushes.WindowText, 0, (e.Index * 20));
}


Нет, к сожалению не как надо.
Лучше раз увидеть....

К сообщению приложен файл. Размер - 0Kb
1 мар 05, 17:55    [1353853]     Ответить | Цитировать Сообщить модератору
 Re: Ещё один Bug или... ?  [new]
M234
Member

Откуда: Оттуда...
Сообщений: 26653
Вы "поездите" по меню. Текст не всегда перерисовывается.

Курсор мыши работает как стирательная резинка и затирает текст.


-------------------------------------------------------------------------
Нет худа без добра, да и добро без худа - чудо.

К сообщению приложен файл. Размер - 0Kb
1 мар 05, 17:57    [1353866]     Ответить | Цитировать Сообщить модератору
 Re: Ещё один Bug или... ?  [new]
кузя
Member

Откуда:
Сообщений: 1703
сделал в твоем тексте исправления для текста и рисования:
this.menuItem1.Text =new string((char)0x00EF, 1);// "Item1";
this.menuItem2.Text =new string((char)0x00F0, 1);// "Item2";
...
e.Graphics.DrawString(this.Text, new Font("Wingdings", 10), ((e.State & DrawItemState.Selected) == DrawItemState.Selected) ? SystemBrushes.HighlightText : SystemBrushes.WindowText, e.Bounds);
...
и получил (никаких аномалий):

К сообщению приложен файл. Размер - 0Kb
1 мар 05, 18:17    [1353953]     Ответить | Цитировать Сообщить модератору
 Re: Ещё один Bug или... ?  [new]
кузя
Member

Откуда:
Сообщений: 1703
судя по картинкам, у нас с тобой разные тексты программ. у меня используется текст, котрый приведен тобой выше (copy/paste).
а у тебя ???

иначе наш разговор просто затянется до бесконечности...
1 мар 05, 18:40    [1354042]     Ответить | Цитировать Сообщить модератору
 Re: Ещё один Bug или... ?  [new]
M234
Member

Откуда: Оттуда...
Сообщений: 26653
кузя
судя по картинкам, у нас с тобой разные тексты программ. у меня используется текст, котрый приведен тобой выше (copy/paste).
а у тебя ???

иначе наш разговор просто затянется до бесконечности...


Код вроде должОн совпадать.
Проблема осталась.
Вы поводите мышью прямо по стрелочкам нарисованным в меню а не по пустому пространству справа. Работает как стирательная резинка.

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

namespace CustomContextMnu
{
	
	public class Form1 : System.Windows.Forms.Form
	{
		private System.Windows.Forms.RichTextBox richTextBox1;
		private System.Windows.Forms.ContextMenu contextMenu1;
		private CustomMenuItem menuItem1;
		private CustomMenuItem menuItem2;
		
		private System.ComponentModel.Container components = null;

		public Form1()
		{
			
			InitializeComponent();

		
		}

		
		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if (components != null) 
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}

		#region Vom Windows Form-Designer generierter Code
		
		private void InitializeComponent()
		{
			this.richTextBox1 = new System.Windows.Forms.RichTextBox();
			this.contextMenu1 = new System.Windows.Forms.ContextMenu();
			this.menuItem1 = new CustomContextMnu.CustomMenuItem();
			this.menuItem2 = new CustomContextMnu.CustomMenuItem();
			this.SuspendLayout();
			// 
			// richTextBox1
			// 
			this.richTextBox1.ContextMenu = this.contextMenu1;
			this.richTextBox1.Font = new System.Drawing.Font("Arial", 36F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
			this.richTextBox1.Location = new System.Drawing.Point(40, 40);
			this.richTextBox1.Name = "richTextBox1";
			this.richTextBox1.Size = new System.Drawing.Size(536, 448);
			this.richTextBox1.TabIndex = 0;
			this.richTextBox1.Text = "richTextBox1";
			// 
			// contextMenu1
			// 
			this.contextMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
																						 this.menuItem1,
																						 this.menuItem2});
			// 
			// menuItem1
			// 
			this.menuItem1.Index = 0;
			this.menuItem1.OwnerDraw = true;
			this.menuItem1.Text = new string((char)0x00EF, 1);
			this.menuItem1.Click += new System.EventHandler(this.CmenuItem_Click);
			// 
			// menuItem2
			// 
			this.menuItem2.Index = 1;
			this.menuItem2.OwnerDraw = true;
			this.menuItem2.Text = new string((char)0x00F0, 1);
			this.menuItem2.Click += new System.EventHandler(this.CmenuItem_Click);
			// 
			// Form1
			// 
			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
			this.ClientSize = new System.Drawing.Size(616, 534);
			this.Controls.Add(this.richTextBox1);
			this.Name = "Form1";
			this.Text = "Form1";
			this.ResumeLayout(false);

		}
		#endregion

		
		[STAThread]
		static void Main() 
		{
			Application.Run(new Form1());
		}

		private void CmenuItem_Click(object sender, System.EventArgs e)
		{
			Clipboard.SetDataObject(((CustomMenuItem)sender).Text,false);
			this.richTextBox1.Paste();
			this.richTextBox1.Select(this.richTextBox1.SelectionStart-1,1);
			this.richTextBox1.SelectionFont = new Font("Wingdings",36.00f);
		}	

		
	}
	
	
	public class CustomMenuItem : System.Windows.Forms.MenuItem
	{
		public CustomMenuItem()
		{
			OwnerDraw = true;
		}

		protected override void OnDrawItem(DrawItemEventArgs e)
		{
			base.OnDrawItem (e);
			e.Graphics.FillRectangle(((e.State & DrawItemState.Selected) == DrawItemState.Selected) ? SystemBrushes.Highlight : SystemBrushes.Menu, e.Bounds);
			e.Graphics.DrawString(this.Text, new Font("Wingdings", 9), ((e.State & DrawItemState.Selected) == DrawItemState.Selected) ? SystemBrushes.HighlightText : SystemBrushes.WindowText, 0, (e.Index * 20));
		}

		protected override void OnMeasureItem(MeasureItemEventArgs e)
		{
			base.OnMeasureItem (e);
			e.ItemHeight = 20;
			e.ItemWidth = 25;
		}
		
			
	}

}

1 мар 05, 18:56    [1354081]     Ответить | Цитировать Сообщить модератору
 Re: Ещё один Bug или... ?  [new]
кузя
Member

Откуда:
Сообщений: 1703
в нечистую силу (не к ночи будет помянута) - не верю :)
поскольку все работает, так как и ожидалось (т.е. все прорисовывается правильно) давай искать отличия:
XP SP2
VS 2003
FW 1.1 SP1
1 мар 05, 19:18    [1354136]     Ответить | Цитировать Сообщить модератору
 Re: Ещё один Bug или... ?  [new]
кузя
Member

Откуда:
Сообщений: 1703
+
почему на твоих картинках цвет фона меню - белый ???
1 мар 05, 19:22    [1354144]     Ответить | Цитировать Сообщить модератору
 Re: Ещё один Bug или... ?  [new]
кузя
Member

Откуда:
Сообщений: 1703
запустил exe на:
Win2003 сервер + SP1 (RC1)
FW 2.0 (build 40607 beta 1)
эффект тот же - все прорисовывает правильно, где бы не елозил мышью
1 мар 05, 19:46    [1354187]     Ответить | Цитировать Сообщить модератору
 Re: Ещё один Bug или... ?  [new]
Sa
Member

Откуда: Ekaterinburg
Сообщений: 4019
кузя

поскольку все работает, так как и ожидалось (т.е. все прорисовывается правильно) давай искать отличия:

прикрепи сюда скомпилированный exe-шник

P.S. только без всяких вредоносных кодов :-)

uid = Sa
2 мар 05, 07:01    [1354534]     Ответить | Цитировать Сообщить модератору
 Re: Ещё один Bug или... ?  [new]
M234
Member

Откуда: Оттуда...
Сообщений: 26653
кузя
в нечистую силу (не к ночи будет помянута) - не верю :)
поскольку все работает, так как и ожидалось (т.е. все прорисовывается правильно) давай искать отличия:
XP SP2
VS 2003
FW 1.1 SP1


У меня полностью аналогичная конфигурация

XP Professional SP2
VS 2003 Enterprise-Architekt
FW 1.1 SP1
3 мар 05, 09:59    [1358639]     Ответить | Цитировать Сообщить модератору
 Re: Ещё один Bug или... ?  [new]
M234
Member

Откуда: Оттуда...
Сообщений: 26653
кузя
+
почему на твоих картинках цвет фона меню - белый ???


??? Не знаю. Всегда такой цвет был (недоумённое пожатие плечами)
3 мар 05, 10:03    [1358656]     Ответить | Цитировать Сообщить модератору
 Re: Ещё один Bug или... ?  [new]
M234
Member

Откуда: Оттуда...
Сообщений: 26653
Sa
кузя

поскольку все работает, так как и ожидалось (т.е. все прорисовывается правильно) давай искать отличия:

прикрепи сюда скомпилированный exe-шник

P.S. только без всяких вредоносных кодов :-)

uid = Sa


Прикрепляю. Без посторонних кодов. ;)

К сообщению приложен файл (CustomContextMnu.zip - 4Kb) cкачать
3 мар 05, 10:05    [1358662]     Ответить | Цитировать Сообщить модератору
 Re: Ещё один Bug или... ?  [new]
кузя
Member

Откуда:
Сообщений: 1703
все работает, как доктор прописал ...

и для classic и для xp (действительно, белый фон) стилей

ты сам пробовал этот EXE запускать на др. машинах ?

К сообщению приложен файл. Размер - 0Kb
3 мар 05, 12:43    [1359470]     Ответить | Цитировать Сообщить модератору
 Re: Ещё один Bug или... ?  [new]
M234
Member

Откуда: Оттуда...
Сообщений: 26653
кузя
все работает, как доктор прописал ...

и для classic и для xp (действительно, белый фон) стилей

ты сам пробовал этот EXE запускать на др. машинах ?


Да. Только что пробовал. Нахожусь в состоянии лёгкого шока, т.к. везде работает "как доктор прописал" кроме меня. А установить причину не удаётся пока.

Проблема: Если оно так у меня работает, то ведь и у клиента когда-нибудь да вылезти может. Это как раз из тех мелочей, которые не жизненно важны, но досаждают и мазолят глаза.(И портят впечатление от ПО).
3 мар 05, 12:50    [1359516]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / WinForms, .Net Framework Ответить