Рейтинг:
1
OriginalGriff
Вы не можете просто добавить событие и ожидать, что оно будет автоматически подключено - если вы хотите реагировать на системные события, то класс должен быть таким, который знает о системных событиях: UserControl.
Я быстро построил один, и он работает. Добавьте новый UserControl, назовите его "резистор" и установите для него CS-код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace GeneralTesting
{
public partial class Resistor : UserControl
{
public Resistor()
{
InitializeComponent();
Text = "100R";
}
private void Resistor_Paint(object sender, PaintEventArgs e)
{
e.Graphics.FillRectangle(Brushes.Pink, e.ClipRectangle);
e.Graphics.DrawString(Text, Font, Brushes.Black, e.ClipRectangle);
}
private void Resistor_MouseEnter(object sender, EventArgs e)
{
Text = "Hello";
Invalidate();
}
private void Resistor_MouseLeave(object sender, EventArgs e)
{
Text = "100R";
Invalidate();
}
}
}
Поместите один из них на мою форму в режиме конструктора и запустите приложение. когда мышь входит, она меняет текст, когда мышь уходит, она возвращается.
_Q12_
Спасибо вам, мистер Оригиналгрифф ! Вы даете самый лучший ответ !
Но... Я хочу что-то особенное на этот раз(если это возможно). Я хочу сохранить его только как класс! (не преобразуйте его в UserControl). Почему, спросите вы меня? Разные мотивы. Главное - сохранить прозрачность после контрольного рисунка (без фона). Вот и вся причина, по которой я рисую свои предметы в классе и ссылаюсь на эту краску снаружи в своей Форме1. Я понимаю, что должен создать весь механизм событий с нуля, но это то, что есть, поэтому я сделаю это таким образом. Мой вопрос-как? Это трудный способ сделать это, но это единственный способ, которым моя бедная душа будет довольна результатами.
Спасибо!
OriginalGriff
Ты не можешь. Классы сами по себе не являются "отображаемыми элементами", они не получают и не могут получать или реагировать на действия Windows, включая, но не ограничиваясь, операциями мыши. Только элементы, производные от класса Control (который включает класс Form), могут отображаться и получать действия мыши.
Делать то, что вы хотите с "стандартным классом", означало бы огромный объем работы в "содержащей форме": обрабатывать перемещение мыши для контейнера, вычислять, что он находится над областью, в которой находится ваш класс, и переводить сообщения и вызывать события.
Это огромные инвестиции, большая часть которых заключается в дублировании кода, который уже есть в .NET! Не говоря уже о том, что это также массовый провал Упс, потому что он нарушает независимость вашего нового класса в том, что форма становится ответственной за то, чтобы знать, где она находится, и рисовать ее!
И когда у вас есть принципиальная схема, содержащая 40 резисторов, 60 колпачков, дюжину микросхем, бесчисленные диоды и несколько индукторов, ваша форма должна отвечать за все из них.
Сделайте это "надлежащим образом", и все они станут ответственными за себя, а контейнер станет ответственным за связи между ними - что гораздо более точно соответствует реальной печатной плате и ее компонентам!
Поверьте мне: вы настраиваете себя на огромные усилия, чтобы получить то, что вы могли бы получить с помощью одной строки кода ... :смеяться:
_Q12_
отредактированный:
Сейчас я тестирую ваш код.
я не думаю, что действительно пробовал этот метод, который вы здесь представляете... интригующий. Хотя я много раз сталкивался с подобными(в своих поисках).
_Q12_
InitializeComponent(); не работает!
Ошибка 1 имя 'InitializeComponent' не существует в текущем контексте.
OriginalGriff
Дай угадаю ... Вы добавили ": UserControl" в конец вашего существующего определения класса?
Вы не создаете UserControl подобным образом, так же как добавление ": Form" к классу не превратит его в рабочую форму. Или, если хотите, добавление логотипа Ferrari к велосипеду сделает его гоночным автомобилем! Элементы управления имеют файлы Designer.cs, которые создают элемент управления точно так же, как это делают формы (и по той же причине формы являются элементами управления!).
Добавьте новый элемент управления UserControl в свой проект и скопируйте в него свой код.
_Q12_
спасибо за ваш ответ. Я сделал новый контроль, как вы и предлагали. Но как я могу избавиться от фона элемента управления и рисовать непосредственно на Form1 через событие Paint элемента управления?
Неужели это невыполнимая задача?
вот мой рабочий код, так как ваш ничего не сделал !
Но даже с моим кодом я рисую на фоне элемента управления, а не непосредственно на форме 1, Как я изначально намеревался.
общественный разделяемого класса ResistorXA : элемент управления UserControl
{
общественные ResistorXA()
{
метод InitializeComponent();
Текст = "100р";
этот.Paint += новый PaintEventHandler(ResistorXA_Paint);
этот.События мыши: mouseenter += новое EventHandler в(ResistorXA_MouseEnter);
этот.MouseLeave += новый EventHandler(ResistorXA_MouseLeave);
}
ResistorXA_Paint недействительным(объект отправителя, объект painteventargs е)
{
e.графика.FillRectangle(Кисти.Розовый, 2, 2, 30, 30);
e.графика.DrawString(текст, новый шрифт ("arial", 8f), кисти.Черный, 0, 0);
}
ResistorXA_MouseEnter недействительным(объект отправителя, EventArgs в электронной)
{
Текст = "Привет";
Аннулировать();
}
ResistorXA_MouseLeave недействительным(объект отправителя, EventArgs в электронной)
{
Текст = "100р";
Аннулировать();
}