• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Usercontrol компонент

  • Автор темы ITC_Phantom
  • Дата начала
Статус
Закрыто для дальнейших ответов.
I

ITC_Phantom

В исходных кодах нескольких игр, я увидел что поле игры создается при помощи одного екземпляра компонента UserControl. Может ли кто нибудь привести маленький пример, как я могу при помощи одного такого компонента создать например шахматную доску, и обработку кликов на каждую клетку ? Ну или дать ссылку где объясняется такой прием. Спасибо
 
V

Visor_ck

Вот набросал на скорую руку, надеюсь поможет :)

Кстати, в процессе создания возни вопрос:
При написании кода типа:

(b as Button).MouseClick += new MouseEventHandler(Click1);

мы же как бы добавляем свой обработчик на клавишу, а не перекрываем его, тоесть предидущий обработчик тоже будет выполняться ? Как полностью перекрыть его, тобишь что бы выполнялся только назначенный мною обработчик ?
 

Вложения

  • Chess.rar
    11,1 КБ · Просмотры: 191
I

ITC_Phantom

Спасибо за пример. Но я тоже пользуюсь такой техникой :( Т.е для шахмат мне нужно создать 64 кнопки или панели или ещё чего то. И если я захочу написать сапера с експертным уровнем сложности, то мне уже надо будет создать 480 кнопок ? Очень некрасивый и нерациональный код получится, с большой полосой прокрутки. Примерно ,по моему, это должно выглядеть так: создается один UserControl, затем он копируется в коде в for'e например и каждому екземпляру назначаются новые координаты, клики по моему вычисляются на основе MousePosition. Но как это реализовать я не знаю :(
 
V

Visor_ck

Следующий код создаст поле 8 х 8 кнопок.

Код:
public ChessField()
{
InitializeComponent();

// координита кнопки относитетльно
// верхней границы компонента
int ComponentTop = 0;

// координита кнопки относитетльно
// левой границы компонента
int ComponentLeft = 0;

// промежуток между кнопками 
int Space = 6;

// колличество рядов с кнопками			
int RowCount = 8;

// колличество кнопок в строке
int ColCount = 8;

for (int i = 0; i < RowCount; i++ )
{
for(int q = 0; q < ColCount; q++)
{
Button b = new Button();
b.Name = string.Format("Button {0}",(8*i)+q+1);
b.Parent = this;
b.Width = 50;
b.Height = 50;
b.Top = ComponentTop;
b.Left = ComponentLeft;
b.Text = b.Name;
b.Tag = string.Format("{0} x {1}", q+1, i+1);
b.MouseClick += new MouseEventHandler(Click1);
b.Show();
ComponentLeft += 50 + Space;
}
ComponentTop += 50 + Space;
ComponentLeft = 0;
}
}

Зачем вычислять по позиции крыса, если можно при создании или назначить метод для обработки ?

Кстати, есть в C# конструкция-аналог делфовой with ... do ... ?
 

Вложения

  • Chess.zip
    33 КБ · Просмотры: 193
V

Visor_ck

2 ITC_Phantom: Помогло ?
2 All: Насчет переназначения события может кто-то объяснить, или хотя бы ссылочкой кинуть?
 
P

Pasha

Для: Visor_ck
Outside of the class it is defined in, an event can only add or subtract references.
При попытках сделать что-то еще получишь вот эту ошибку:
 
I

ITC_Phantom

Спасибо. Помогло. Всё замечательно работает.
Ну там в коде есть небольшие недочеты которые я поправил, например определены переменные для высоты и ширины кнопки, а потом статично вбито 50. И если изменить ComponentLeft то это отразится только на первой строке, желательно перенести её например внутрь первого if'а
 
I

ITC_Phantom

Спасибо за помощь. Благодаря ей я наконецто сдвинулся в направлении создания шашек :) Этот сайт мне помог в освоении .NET Если кто то будет изучать PHP возможно вы найдете что то полезное на моем сайте :)
 
I

ITC_Phantom

Вот кстати появился ещё один вопросик.

Рисую скажем вышеописанным методом не 8х8, а поле 1х2 клеточки. PictureBox'ами

Первой делаю pb.BackColor = Color.White;
Второй делаю pb.BackColor = Color.Black;

А потом опять вызываю функцию ChessField(); И во время второго вызова хочу поменять их цвета местами:

Первой pb.BackColor = Color.Black;
Второй pb.BackColor = Color.White;

Но ничего не перерисовывается ;) В чем проблема ?
 
V

Visor_ck

Вот кстати появился ещё один вопросик.

Рисую скажем вышеописанным методом не 8х8, а поле 1х2 клеточки. PictureBox'ами

Первой делаю pb.BackColor = Color.White;
Второй делаю pb.BackColor = Color.Black;

А потом опять вызываю функцию ChessField(); И во время второго вызова хочу поменять их цвета местами:

Первой pb.BackColor = Color.Black;
Второй pb.BackColor = Color.White;

Но ничего не перерисовывается ;) В чем проблема ?

ты pb.parent и pb.show прописывал ?

Если да, то хз в чем проблема, только что попробовал, все рисует вроде %).
Выложи исходник, или хотя бы процедуру в которой создаеш.
 
I

ITC_Phantom

Ну смотри. Пишу например так:

int x = 1;


if (x == 1) {
pb.BackColor = Color.White;
}

if (x == 2) {
pb.BackColor = Color.Black;
}

pb.MouseClick += new MouseEventHandler(Click1);
pb.Show();

Все клеточки белые получаются, так ?

Дальше в коде :

int x = 2;

и опять вызов функции ChessField();

Поле должно перерисоваться и клеточки стать черными, однако увы они остаются белыми
 
V

Visor_ck

Если я правильно понял то:
Код:
int x = 1;
if (x == 1) 
{ pb.BackColor = Color.White; }
if (x == 2) 
{ pb.BackColor = Color.Black; }
pb.MouseClick += new MouseEventHandler(Click1);
pb.Show();

У тебя написано в классе ChessField, а дальше в коде основной программы пишешь
Код:
int x = 2;
ChessField();

Если все так, то и правильно что все клетки белые, ведь, фактически ты работаеш с разными иксами, первый это локальный x класса Chessfield а второй это опять же локальный x основного модуля.

Что бы заставить этот код работать пиши не
Код:
int x = 1;
if (x == 1) 
{ pb.BackColor = Color.White; }
if (x == 2) 
{ pb.BackColor = Color.Black; }

а чето типа
Код:
if (MainForm.x == 1) 
{ pb.BackColor = Color.White; }
if (MainForm.x == 2) 
{ pb.BackColor = Color.Black; }

а потом уже в основном модуле меняй икс.

Но ИМХО, если тебе из кода основной программы надо указывать какой цвет присваивать клетке, лучше делать так:

Код:
public ChessField(Color cellColor)
{
InitializeComponent();
...
for (int i = 0; i < RowCount; i++ )
{
for(int q = 0; q < ColCount; q++)
{
PictureBox pb = new PictureBox();
...
pb.BackColor = cellColor;
...
pb.Show();
}
...
}
}

А потом вызывай конструктор с нужным тебе цветом, например: ChessField(Color.DeepSkyBlue)
 
I

ITC_Phantom

Да , ты всё правильно понял до того места где у меня локальный x. Он у меня не локальный, а в самом верху файла объявлен как public int x.

Уже сто раз я всё перепроверил, во второй иф попадает, распечатывает внутри второго ифа что х = 2,
и т.д. и т.п. Но клетки остаются белыми. Может новые рисуются под старыми или чето типа того ? Перед тем как рисовать новые прибить все старые ? Даже и не знаю в чем проблема :)
 
V

Visor_ck

Да , ты всё правильно понял до того места где у меня локальный x. Он у меня не локальный, а в самом верху файла объявлен как public int x.
попробуй, если не получиться выложи исходник, "вслепую" искать ошибку в исходнике довольно таки сложно, тем более в чужом.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!