Usercontrol компонент

Тема в разделе ".NET", создана пользователем ITC_Phantom, 17 янв 2007.

Статус темы:
Закрыта.
  1. ITC_Phantom

    ITC_Phantom Гость

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

    Visor_ck Гость

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

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

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

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

    Вложения:

    • Chess.rar
      Размер файла:
      11,1 КБ
      Просмотров:
      54
  3. ITC_Phantom

    ITC_Phantom Гость

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

    Visor_ck Гость

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

    Код (Text):
    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 КБ
      Просмотров:
      53
  5. Visor_ck

    Visor_ck Гость

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

    Pasha Гость

  7. ITC_Phantom

    ITC_Phantom Гость

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

    ITC_Phantom Гость

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

    ITC_Phantom Гость

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

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

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

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

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

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

    Visor_ck Гость

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

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

    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();

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

    Visor_ck Гость

    Если я правильно понял то:
    Код (Text):
    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, а дальше в коде основной программы пишешь
    Код (Text):
    int x = 2;
    ChessField();
    Если все так, то и правильно что все клетки белые, ведь, фактически ты работаеш с разными иксами, первый это локальный x класса Chessfield а второй это опять же локальный x основного модуля.

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

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

    Код (Text):
    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)
     
  13. ITC_Phantom

    ITC_Phantom Гость

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

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

    Visor_ck Гость

    попробуй, если не получиться выложи исходник, "вслепую" искать ошибку в исходнике довольно таки сложно, тем более в чужом.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей