Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Помогите переделать!


Автор: OutlawZ 27.7.2010, 22:39
Приветствую, есть код который рисует на форме клетку с определенной шириной и высотой клетки. Взято из книги Культина про игру сапер. 

Код

#define LEFT 0 // по X
#define TOP 1  // по Y
#define W 40 // ширина клетки поля
#define H 40 // высота клетки поля

void fastcall TMain::FormPaint(TObject *Sender)
{
 ShowPole(status);
}

// Показывает поле
void fastcall TMain::ShowPole( int status)
{
 for ( int row = 1; row <= MR; row++ )
  for ( int col = 1; col <= MC; col++ )
    Kletka(row, col, status);
}

// рисует на экране клетку
void fastcall TMain::Kletka(int row, int col, int status)
{
 int X = LEFT + (col-1)* W; .
 int у = TOP + (row-1)* H;

  // клетка - серый квадрат
  Canvas->Brush->Color = clBtnFace;
  Canvas->Rectangle(x-1,y-1,x+W,y+H);
  return;
}


Помогите сделать так когда я нажимаю левой кнопкой мыши по любому квадрату в клетке внутри нажатого квадрата рисовалась линия. Я уже повеситься готов, пробовал по разному но линия рисуется во всех  квадратах.  Помогите пожалуйста.  smile  smile 

Автор: 586 27.7.2010, 23:56
Код
#define LEFT 100 // по X
#define TOP 101  // по Y
#define W 40 // ширина клетки поля
#define H 40 // высота клетки поля

#define MR 10
#define MC 10

TPoint selPos(0, 0);
bool bSelect = false;

void __fastcall TForm1::FormPaint(TObject *Sender)
{
    ShowPole(0);
}
//---------------------------------------------------------------------------

// Показывает поле
void __fastcall TForm1::ShowPole(int status)
{
 for ( int row = 0; row < MR; row++ )
  for ( int col = 0; col < MC; col++ )
    Kletka(row, col, status);
}
// рисует на экране клетку
void __fastcall TForm1::Kletka(int row, int col, int status)
{
 int x = LEFT + col* W;
 int y = TOP + row* H;
  // клетка - серый квадрат
  Canvas->Brush->Color = clBtnFace;
  Canvas->Rectangle(x-1,y-1,x+W,y+H);
  if(bSelect && selPos.x == col && selPos.y == row)
  {
    Canvas->MoveTo(x, y);
    Canvas->LineTo(x+W, y+H);
    Canvas->MoveTo(x+W, y);
    Canvas->LineTo(x, y+H);
  }
  return;
}

void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
    if(Button == mbLeft)
    {
        int posX = (X-LEFT) / W, posY = (Y-TOP) / H;

        if(X < LEFT || posX >= MR || Y < TOP || posY >= MC)
        {
            bSelect = false;
        }
        else
        {
            bSelect = true;
            selPos.x = posX;
            selPos.y = posY;
        }
        Paint();
    }
}

Автор: OutlawZ 28.7.2010, 04:59
Спасибо все работает!

Автор: OutlawZ 13.8.2010, 03:37
Вопрос по этой же теме только в другом суть, при рисовании клетки она может иметь размер больше чем размер формы, включал ScrollBar но он не работает точнее не показывает оставшейся часть клетки. Помогите правильно скроилить нарисованную клетку. 
user posted image
Результат, скролинг не работает!

Автор: Platov 23.8.2010, 15:32
Масштабируй при рисовании. 
Посчитай какого размера должны быть клетки чтобы вписаться в форму и всё.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)