if (array[i,j]>48 && array[i,j]<58){
Number n = new Number (...);
n.Drawing (...); //рисуется клетка с цифрой
}
if (array[i,j]=='*'){
Letter l = new Letter (...);
l.Drawing (...); //клетка, в которой потом надо писать букву
}
Обработка событий в C#
Объектом является клетка - рисуется через Rectangle.
Как теперь установить букву в клетку? Нужно обработать события мыши, курсора, нажатия клавиши или что-то еще? Как вообще? Может есть еще какие-то способы (не затрагивающие обработку событий, не знаю, может через массив...)
Но мне нужно рисовать кроссворд с помощью каких-нибудь TextBoks из ToolBar. (это мне не подходит)
обрабатывай событие Click(MouseDown) объекта на котором нарисован кроссворд, а там по координатам разбирайся, где и как надо рисовать букву. конечно если сделать массив объектов, т.е. для каждой клеточки свой объект, тогда задача упрощается тем, что не надо определять по координатам клика, где именно надо рисовать букву. для данной цели и labels и textBox'ы подойдут.
Цитата: OlgaKr
обрабатывай событие Click(MouseDown) объекта на котором нарисован кроссворд, а там по координатам разбирайся, где и как надо рисовать букву. конечно если сделать массив объектов, т.е. для каждой клеточки свой объект, тогда задача упрощается тем, что не надо определять по координатам клика, где именно надо рисовать букву. для данной цели и labels и textBox'ы подойдут.
Спасибо, Ольга. Сегодня попробую что-нибудь сделать... может что-то получиться.
Как сделать массив моих клеточек (элементов кроссворда), если эти объекты у меня создаются примерно так:
Код:
в array хранится образ кроссворда.
С учетом, что я работаю на 2003 вижале, т.е. например, в 2005 я просто могла бы создать шаблонный List, и вызывать ф-ию Add. А в 2003 как сделать?
И второй вопрос:
Как обработать событие MouseDown and MouseUp таким образом, чтобы в нужной клетке замигал курсор (типа для ввода буквы)? А то обычно все примеры сходятся к отрисовке каких-то линий и подобного. А блин еще привыкла c текстом работать в консоле в С++. Блин взял и написал сout для вывода и cin для ввода.
Цитата:
С учетом, что я работаю на 2003 вижале, т.е. например, в 2005 я просто могла бы создать шаблонный List, и вызывать ф-ию Add. А в 2003 как сделать?
насколько я поняла твой вопрос - используй ArrayList и его метод Add.
Цитата:
Как обработать событие MouseDown and MouseUp таким образом, чтобы в нужной клетке замигал курсор (типа для ввода буквы)?
Тогда наверно стоит делать кроссворд из TextBox'ов.
public ArrayList knumber = new ArrayList();
public ArrayList kletter = new ArrayList();
потом в условиях добавляю туда элементы.
теперь как их эти ArrayList вывести?
int myFixedSize = (int)ArrayList.FixedSize( kletter );
for (int i = 0; i<myFixedSize; i++)
kletter.Drawing(e, xbaseOffset, ybaseOffset);
ошибка про kletter, такая: 'object' does not contain a definition for 'Drawing'
ну и конвертировать в int не может 'System.Collections.ArrayList'
for (int i = 0; i<kletter.Count; i++)
(KLetter)kletter.Drawing(e, xbaseOffset, ybaseOffset);
ошибка такая:'object' does not contain a definition for 'Drawing'
даи что ты здесь пытаешься сделать?
Код:
int myFixedSize = (int)ArrayList.FixedSize( kletter );
kletter - это ссылка на объект ArrayList, а ты приводишь к инт.
есть свойство Length - NameObj.Length - кол-во объектов в контейнере...
я же дала тебе ссылку в предыдущем посте, почитай мсдн, тем более на рус. языке.
Код:
[SIZE=2][COLOR=#0000ff]string[/COLOR][/SIZE][SIZE=2] s = "";[/SIZE]
[SIZE=2]ArrayList mylist = [/SIZE][SIZE=2][COLOR=#0000ff]new[/COLOR][/SIZE][SIZE=2] ArrayList();[/SIZE]
[SIZE=2][COLOR=#0000ff]for[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] i = 0; i < 10; i++)[/SIZE]
[SIZE=2]mylist.Add([/SIZE][SIZE=2][COLOR=#0000ff]new[/COLOR][/SIZE][SIZE=2] ClassExample(i));[/SIZE]
[SIZE=2][COLOR=#0000ff]foreach[/COLOR][/SIZE][SIZE=2](ClassExample obj [/SIZE][SIZE=2][COLOR=#0000ff]in[/COLOR][/SIZE][SIZE=2] mylist)[/SIZE]
[SIZE=2]s += obj.Name + '\n';[/SIZE]
[SIZE=2]s = "";[/SIZE]
[SIZE=2][COLOR=#0000ff]for[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] i = 0; i < mylist.Count; i++)[/SIZE]
[SIZE=2]s+= ((ClassExample)mylist).ToString();[/SIZE]
[SIZE=2]ArrayList mylist = [/SIZE][SIZE=2][COLOR=#0000ff]new[/COLOR][/SIZE][SIZE=2] ArrayList();[/SIZE]
[SIZE=2][COLOR=#0000ff]for[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] i = 0; i < 10; i++)[/SIZE]
[SIZE=2]mylist.Add([/SIZE][SIZE=2][COLOR=#0000ff]new[/COLOR][/SIZE][SIZE=2] ClassExample(i));[/SIZE]
[SIZE=2][COLOR=#0000ff]foreach[/COLOR][/SIZE][SIZE=2](ClassExample obj [/SIZE][SIZE=2][COLOR=#0000ff]in[/COLOR][/SIZE][SIZE=2] mylist)[/SIZE]
[SIZE=2]s += obj.Name + '\n';[/SIZE]
[SIZE=2]s = "";[/SIZE]
[SIZE=2][COLOR=#0000ff]for[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] i = 0; i < mylist.Count; i++)[/SIZE]
[SIZE=2]s+= ((ClassExample)mylist).ToString();[/SIZE]
Код:
[SIZE=2][SIZE=2][COLOR=#0000ff]public [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]class[/COLOR][/SIZE][SIZE=2] ClassExample[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000ff]private [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] age;[/SIZE]
[SIZE=2][COLOR=#0000ff]private [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]string[/COLOR][/SIZE][SIZE=2] name;[/SIZE]
[SIZE=2][COLOR=#0000ff]public[/COLOR][/SIZE][SIZE=2] ClassExample([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] i)[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000ff] this[/COLOR][/SIZE][SIZE=2].age = i;[/SIZE]
[SIZE=2][COLOR=#0000ff] this[/COLOR][/SIZE][SIZE=2].name = "No name" + i;[/SIZE]
[SIZE=2]}[/SIZE]
[SIZE=2][COLOR=#0000ff]public [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]string[/COLOR][/SIZE][SIZE=2] Name[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000ff] get[/COLOR][/SIZE][SIZE=2]{ [/SIZE][SIZE=2][COLOR=#0000ff]return[/COLOR][/SIZE][SIZE=2] name; }[/SIZE]
[SIZE=2][COLOR=#0000ff] set[/COLOR][/SIZE][SIZE=2]{ name=[/SIZE][SIZE=2][COLOR=#0000ff]value[/COLOR][/SIZE][SIZE=2]; }[/SIZE]
[SIZE=2]}[/SIZE]
[SIZE=2][COLOR=#0000ff]public [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] Age[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000ff] get[/COLOR][/SIZE][SIZE=2]{ [/SIZE][SIZE=2][COLOR=#0000ff]return[/COLOR][/SIZE][SIZE=2] age; }[/SIZE]
[SIZE=2][COLOR=#0000ff] set[/COLOR][/SIZE][SIZE=2]{ age=[/SIZE][SIZE=2][COLOR=#0000ff]value[/COLOR][/SIZE][SIZE=2]; }[/SIZE]
[SIZE=2]}[/SIZE]
[SIZE=2][COLOR=#0000ff]public [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]override [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]string[/COLOR][/SIZE][SIZE=2] ToString()[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000ff] return [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]this[/COLOR][/SIZE][SIZE=2].name+' '+[/SIZE][SIZE=2][COLOR=#0000ff]this[/COLOR][/SIZE][SIZE=2].age+'\n';[/SIZE]
[SIZE=2]}[/SIZE]
[SIZE=2]}[/SIZE][/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000ff]private [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] age;[/SIZE]
[SIZE=2][COLOR=#0000ff]private [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]string[/COLOR][/SIZE][SIZE=2] name;[/SIZE]
[SIZE=2][COLOR=#0000ff]public[/COLOR][/SIZE][SIZE=2] ClassExample([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] i)[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000ff] this[/COLOR][/SIZE][SIZE=2].age = i;[/SIZE]
[SIZE=2][COLOR=#0000ff] this[/COLOR][/SIZE][SIZE=2].name = "No name" + i;[/SIZE]
[SIZE=2]}[/SIZE]
[SIZE=2][COLOR=#0000ff]public [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]string[/COLOR][/SIZE][SIZE=2] Name[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000ff] get[/COLOR][/SIZE][SIZE=2]{ [/SIZE][SIZE=2][COLOR=#0000ff]return[/COLOR][/SIZE][SIZE=2] name; }[/SIZE]
[SIZE=2][COLOR=#0000ff] set[/COLOR][/SIZE][SIZE=2]{ name=[/SIZE][SIZE=2][COLOR=#0000ff]value[/COLOR][/SIZE][SIZE=2]; }[/SIZE]
[SIZE=2]}[/SIZE]
[SIZE=2][COLOR=#0000ff]public [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] Age[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000ff] get[/COLOR][/SIZE][SIZE=2]{ [/SIZE][SIZE=2][COLOR=#0000ff]return[/COLOR][/SIZE][SIZE=2] age; }[/SIZE]
[SIZE=2][COLOR=#0000ff] set[/COLOR][/SIZE][SIZE=2]{ age=[/SIZE][SIZE=2][COLOR=#0000ff]value[/COLOR][/SIZE][SIZE=2]; }[/SIZE]
[SIZE=2]}[/SIZE]
[SIZE=2][COLOR=#0000ff]public [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]override [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]string[/COLOR][/SIZE][SIZE=2] ToString()[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000ff] return [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]this[/COLOR][/SIZE][SIZE=2].name+' '+[/SIZE][SIZE=2][COLOR=#0000ff]this[/COLOR][/SIZE][SIZE=2].age+'\n';[/SIZE]
[SIZE=2]}[/SIZE]
[SIZE=2]}[/SIZE][/SIZE]
for (int i = 0; i<kletter.Count; i++)
[COLOR=red]([/COLOR](KLetter)kletter[COLOR=red])[/COLOR].Drawing(e, xbaseOffset, ybaseOffset);
Так про скобочки поняла, только теперь ничего не рисуется. Привожу пример, не судите строго :) впервые программирую на Сишарп и в визуале :) да и программист я плохой :)
Код:
public class KNumber : System.Windows.Forms.Form
{
int number;
int height, wight;
Color clr;
Pen pen;
public KNumber (int height, int wight, Color clr, Pen pen)
{
this.height = height; this.wight = wight;
this.clr = clr;
this.pen = new Pen(clr, 0.5f);
}
public void Drawing(PaintEventArgs e, int xOffset, int yOffset, char num)
{
Graphics g = e.Graphics;
Color color = Color.Green;
Brush brush = new SolidBrush(color);
Pen pen = new Pen(this.clr, 3f);
g.FillRectangle(Brushes.Yellow, xOffset, yOffset, height, wight);
g.DrawRectangle(pen, xOffset, yOffset, height, wight);
g.DrawString((num).ToString(), new Font(Font, FontStyle.Bold), brush, xOffset + 10, yOffset + 10);
}
public class KLetter : System.Windows.Forms.Form
{
int height, wight;
Color clr;
Pen pen;
public KLetter (int height, int wight, Color clr, Pen pen)
{
this.height = height;
this.wight = wight;
this.clr = clr;
this.pen = new Pen(clr, 0.25f);
}
public void Drawing(PaintEventArgs e, int xOffset, int yOffset)
{
Graphics g = e.Graphics;
Pen pen = new Pen(Color.Red, 0.5f);
Pen line = new Pen(Color.Black, 10f);
g.FillRectangle(Brushes.White, xOffset + 1, yOffset + 1, height, wight);
g.DrawRectangle(pen, xOffset + 1, yOffset + 1, height, wight);
}
{
int number;
int height, wight;
Color clr;
Pen pen;
public KNumber (int height, int wight, Color clr, Pen pen)
{
this.height = height; this.wight = wight;
this.clr = clr;
this.pen = new Pen(clr, 0.5f);
}
public void Drawing(PaintEventArgs e, int xOffset, int yOffset, char num)
{
Graphics g = e.Graphics;
Color color = Color.Green;
Brush brush = new SolidBrush(color);
Pen pen = new Pen(this.clr, 3f);
g.FillRectangle(Brushes.Yellow, xOffset, yOffset, height, wight);
g.DrawRectangle(pen, xOffset, yOffset, height, wight);
g.DrawString((num).ToString(), new Font(Font, FontStyle.Bold), brush, xOffset + 10, yOffset + 10);
}
public class KLetter : System.Windows.Forms.Form
{
int height, wight;
Color clr;
Pen pen;
public KLetter (int height, int wight, Color clr, Pen pen)
{
this.height = height;
this.wight = wight;
this.clr = clr;
this.pen = new Pen(clr, 0.25f);
}
public void Drawing(PaintEventArgs e, int xOffset, int yOffset)
{
Graphics g = e.Graphics;
Pen pen = new Pen(Color.Red, 0.5f);
Pen line = new Pen(Color.Black, 10f);
g.FillRectangle(Brushes.White, xOffset + 1, yOffset + 1, height, wight);
g.DrawRectangle(pen, xOffset + 1, yOffset + 1, height, wight);
}
А в главном классе Form1 (который создается автоматически):
Код:
protected override void OnPaint(PaintEventArgs e)
{
Pen fornumber = new Pen(Color.Blue, 0.5f);
Pen penColor = new Pen(Color.Red, 0.5f);
Pen penEmpty = new Pen(Color.White);
int xbaseOffset = 20, ybaseOffset = 20;
char num;
for (int i = 0; i<n1; i++)
{
for (int j = 0; j<n2; j++)
{
if (j != (n2 - 1))
{
if (array[i,j]==' ')
{
xbaseOffset += 40;
}
if (array[i,j]=='*')
{
KLetter kl = new KLetter(40, 40, Color.Red, penColor);
// kl.Drawing(e, xbaseOffset, ybaseOffset);
kletter.Add(kl);
xbaseOffset += 40;
}
if (array[i,j]>48 && array[i,j]<58)
{
num = array[i,j];
KNumber kn = new KNumber(40, 40, Color.Blue, fornumber);
knumber.Add(kn);
// kn.Drawing(e, xbaseOffset, ybaseOffset, num);
xbaseOffset += 40;
}
}
if (j == (n2 - 1))
{
ybaseOffset += 40;
xbaseOffset = 20;
}
}
}
base.OnPaint (e);
}
public void print (PaintEventArgs e, ArrayList kletter, ArrayList knumber, int xbaseOffset, int ybaseOffset, char num)
{
for (int i = 0; i<kletter.Count; i++)
((KLetter)kletter).Drawing(e, xbaseOffset, ybaseOffset);
for (int j = 0; j<knumber.Count; j++)
((KNumber)knumber[j]).Drawing(e, xbaseOffset, ybaseOffset, num);
}
{
Pen fornumber = new Pen(Color.Blue, 0.5f);
Pen penColor = new Pen(Color.Red, 0.5f);
Pen penEmpty = new Pen(Color.White);
int xbaseOffset = 20, ybaseOffset = 20;
char num;
for (int i = 0; i<n1; i++)
{
for (int j = 0; j<n2; j++)
{
if (j != (n2 - 1))
{
if (array[i,j]==' ')
{
xbaseOffset += 40;
}
if (array[i,j]=='*')
{
KLetter kl = new KLetter(40, 40, Color.Red, penColor);
// kl.Drawing(e, xbaseOffset, ybaseOffset);
kletter.Add(kl);
xbaseOffset += 40;
}
if (array[i,j]>48 && array[i,j]<58)
{
num = array[i,j];
KNumber kn = new KNumber(40, 40, Color.Blue, fornumber);
knumber.Add(kn);
// kn.Drawing(e, xbaseOffset, ybaseOffset, num);
xbaseOffset += 40;
}
}
if (j == (n2 - 1))
{
ybaseOffset += 40;
xbaseOffset = 20;
}
}
}
base.OnPaint (e);
}
public void print (PaintEventArgs e, ArrayList kletter, ArrayList knumber, int xbaseOffset, int ybaseOffset, char num)
{
for (int i = 0; i<kletter.Count; i++)
((KLetter)kletter).Drawing(e, xbaseOffset, ybaseOffset);
for (int j = 0; j<knumber.Count; j++)
((KNumber)knumber[j]).Drawing(e, xbaseOffset, ybaseOffset, num);
}
Названия функций придется переделывать потом, наверное.
А все... вроде бы получилось. Все рисуется.