| 
			| 
					
						| Dr.CODE | 
								|  | «  : 03-02-2010 12:37 »  |  | 
 
 Ребят, прошу помощи в первом знакомстве с канвой! __fastcall TMyForm5::TMyForm5(TComponent* Owner): TForm(Owner)
 {
 
 MyForm5 -> Canvas -> Pen -> Color = clRed;
 MyForm5 -> Canvas -> Pen -> Width = 5;
 
 }
 
 void __fastcall TMyForm5::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
 int X, int Y)
 {
 
 if (Button == mbLeft) {
 
 MyForm5 -> Canvas -> MoveTo(X,Y);
 
 }
 
 }
 
По идее мне нужно, чтобы за четыре клика мышки по форме можно было бы нарисовать треугольник. Т.е. первый шекчок ничего не рисует, а уже второй шелчок рисует линию от координат точки запомненных от первого клика. Помогите пожалуйста советом!Upd: Я предполагаю, что нужен второй обработчик OnMouseDown(FormMouseDown2) и как-то их оба связать между собой. Никто не знает как это осуществить? |  
						| 
								|  |  
								| « Последнее редактирование: 03-02-2010 12:45 от Dr.CODE » |  Записан | 
 
 Краткость - сестра таланта, некраткость - сам талант! |  |  | 
	| 
			| 
					
						| Вад | 
								|  | « Ответ #1 : 03-02-2010 13:43 »  |  | 
 
 Опиши точнее, как именно хочешь рисовать треугольник за 4 клика - пока непонятно, почему 4   Самое простое решение - запоминать текущее состояние и отмеченные точки. То есть, например, заводим флаг "есть точка" и по очередному onMouseDown смотрим, стоит ли флаг. Если стоит - рисуем линию из сохранённой точки в текущую. И вне зависимости от флага, новую точку ставим в качестве текущей и устанавливаем значение флага. Тогда хватит и одного обработчика (разве что, придётся ещё очистку флага предусмотреть при потере фокуса канвой).  |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Kivals | 
								|  | « Ответ #2 : 03-02-2010 13:43 »  |  | 
 
 Во-первых рисовать нужно по событию OnPaint формы, т.к. форма может быть перекрыта и возникнет необходимость ее перерисовывать. Я бы завел массив и счетчик, счетчик бы инкрементировал на 1 при каждом клике и брал остаток от деления на длину массива, таким образом счетчик бы при каждом клике менялся по кругу: 0->1->2->...N->0->1 (в твоем случае N=2). В соответствующий элемент массива (типа TPoint) писал бы координаты нажатия. В событии OnPaint анализировал бы счетчик и в случае заполнения массива (Сч=N) рисовал бы линии по всему массиву: Canvas->MoveTo(Pt[N].X,Pt[N].Y); // В последнюю точку чтобы замкнуть фигуруfor (i=0;i<=N;i++) Canvas->LineTo(Pt[i].X,Pt[i].Y);
P.S. Я работал с Delphi и то давно, так что названия типов и событий "могут отличаться от реальных"   |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Dr.CODE | 
								|  | « Ответ #3 : 03-02-2010 15:50 »  |  | 
 
 Опиши точнее, как именно хочешь рисовать треугольник за 4 клика - пока непонятно, почему 4   Сейчас попробую объяснить. Т.е., к примеру, если проецировать на бумагу - ставлю 3 точки (A,B,C) - они вершины. Координаты вершины A запоминаются при первом клике мышкой, а дальше соединяем остальные вершины. Итого четыре клика. Самое простое решение - запоминать текущее состояние и отмеченные точки. То есть, например, заводим флаг "есть точка" и по очередному onMouseDown смотрим, стоит ли флаг. Если стоит - рисуем линию из сохранённой точки в текущую. И вне зависимости от флага, новую точку ставим в качестве текущей и устанавливаем значение флага.
 Тогда хватит и одного обработчика (разве что, придётся ещё очистку флага предусмотреть при потере фокуса канвой).
 
 Пробую... |  
						| 
								|  |  
								|  |  Записан | 
 
 Краткость - сестра таланта, некраткость - сам талант! |  |  | 
	| 
			| 
					
						| Dr.CODE | 
								|  | « Ответ #4 : 03-02-2010 16:40 »  |  | 
 
 Реализовал:Вадbool tochka = false; // глобально объявленная переменная;....
 __fastcall TMyForm5::TMyForm5(TComponent* Owner) : TForm(Owner)
 {
 MyForm5 -> Canvas -> Pen -> Color = clRed;
 MyForm5 -> Canvas -> Pen -> Width = 5;
 }
 void __fastcall TMyForm5::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
 int X, int Y)
 {
 if (!tochka) {
 MyForm5 -> Canvas -> MoveTo(X,Y);
 tochka = true;
 }
 else {
 MyForm5 -> Canvas -> LineTo(X,Y);
 }
 }
 
, спасибо большое за совет! |  
						| 
								|  |  
								|  |  Записан | 
 
 Краткость - сестра таланта, некраткость - сам талант! |  |  | 
	| 
			| 
					
						| Вад | 
								|  | « Ответ #5 : 03-02-2010 18:10 »  |  | 
 
 Угу, только переменную, наверное, стоит сделать членом класса TMyForm5. И предусмотреть сброс флага, если фокус уходит из канвы: а то ерунда получится - ты клацнулся куда-то в другой контрол, потом клацнул опять по канве, а он тебе продолжает линию из того места, где закончил. Или так и задумано? Да и треугольник довольно сложно будет точно нарисовать - это же нужно в исходную точку суметь попасть   |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Dr.CODE | 
								|  | « Ответ #6 : 09-02-2010 18:17 »  |  | 
 
 Угу, только переменную, наверное, стоит сделать членом класса TMyForm5.Вад
 , а как переменную можно сделать членом класса? Только можно более подробней? И предусмотреть сброс флага, если фокус уходит из канвы: а то ерунда получится - ты клацнулся куда-то в другой контрол, потом клацнул опять по канве, а он тебе продолжает линию из того места, где закончил. Или так и задумано? Да и треугольник довольно сложно будет точно нарисовать - это же нужно в исходную точку суметь попасть  Действительно, проблемы увидел! Сейчас взялся за доработку! |  
						| 
								|  |  
								|  |  Записан | 
 
 Краткость - сестра таланта, некраткость - сам талант! |  |  | 
	| 
			| 
					
						| Вад | 
								|  | « Ответ #7 :  09-02-2010 19:21 »   |  | 
 
 Угу, только переменную, наверное, стоит сделать членом класса TMyForm5.Вад
 , а как переменную можно сделать членом класса? Только можно более подробней?Думаю, поподробнее - это будет слишком длинно    Нужно объявить эту переменную не локально, а в определении класса. Если это описание ничего не говорит, очень советую почитать про объектно-ориентированное программирование (ООП) в целом, и про его применение в C++ в частности. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  |