Въпрос # 5 514 ... на многоъгълник (многоъгълният компонент е същият като в стандартния Paint,
Общност от програмисти Комуникация, помощ, обмяна на опит
Delphi.int.ru Expert
Други раздели на портала
Преминете към въпрос:
Статистика за днес:
Въпроси:0 Отговори:0 Мини форуми:0
Топ експерти
Въпрос # 5 514
Здравейте скъпи експерти! Как да нарисувате многоъгълник в Delphi (компонентът на полигона е същият като в стандартния Paint, той също трябва да рисува) при щракване на мишката? Каква функция се използва за такова чертане, с какви параметри се задава?
Отговор №1. Експертните отговори:първи вирус
- единица Единица1;
- интерфейс
- използва
- Windows, съобщения, SysUtils, варианти, класове, графики, контроли, формуляри,
- Диалози, бутони, ExtCtrl;
- Тип
- TForm1 = клас (TForm)
- SB_Arroy: TSpeedButton;
- SB_Poly: TSpeedButton;
- PB_Work: TPaintBox;
- процедура PB_WorkMouseDown(Подател: TObject; Бутон: TMouseButton;
- Shift: TShiftState; X, Y: цяло число);
- частен
- NowDrawPoly : boolean;
- публичен
- край;
- вар
- Формуляр1: TForm1;
- изпълнение
- процедура TForm1.PB_WorkMouseDown(Подател: TObject; Бутон: TMouseButton;
- Shift: TShiftState; X, Y: цяло число);
- вар
- RClick,LClick : булево;
- започвам
- LCick := Button = mbLeft;
- RCClick := Бутон = mbRight;
- ако LЩракнете тогава
- започвам
- ако SB_Poly.Надолу тогава
- if NowDrawPoly then PB_Work.Canvas.LineTo(Mouse.CursorPos.X,Mouse.CursorPos.Y)
- друго
- започвам
- NowDrawPoly := true;
- PB_Work.Canvas.MoveTo(Mouse.CursorPos.X,Mouse.CursorPos.Y);
- край;
- край
- иначе ако RCщракнете тогава
- започвам
- SB_Poly.Down := False;
- SB_Arroy.Down := True;
- NowDrawPoly := False;
- край;
- край;
- край.
Въпрос мини-форум
Цитат (булдогер ):
Забравих да поясня, рисуването става с помощта на PaintBox.
Цитат (булдогер ):
многоъгълник не е начертан. Направих молив, запълване и други глупости, но не знам как да направя многоъгълник
Добре, запомнете масива от многоъгълни върхове в паметта и го начертайте с методите TCanvas.PolyLine() и TCanvas.Polygon(). Нещо като това.
когато натиснете бутона за рисуване на полигон, задайте флага, че сега ще рисувате многоъгълник, а не линия. По-нататък при събитие OnClick peint boxing проверете този флаг. след това има проверка кой бутон на мишката е натиснат върху кутията за рисуване, ако е левият, тогава проверката на флага е започнала рисунката. ако не е стартирано, задайте флага за стартиране на чертежа и изпълнете процедурата MoveTo(MouseX,MouseY), в противен случай изпълнете процедурата LineTo(MouseX,MouseY). Ако се натисне десния бутон на мишката, нулирайте флага за начало на чертане и флага за рисуване на многоъгълник. Нещо такова. В момента няма време за писане на код. Утре ще има време.
Как се правят елементи от менюто: копиране, изрязване, поставяне от PaintBox?
Цитат (булдогер ):
Какъв е кодът за тези операции?
Цитат (булдогер ):
Ето няколко функции от моята древна програма. // ------------- Копирайте изображението на платното в клипборда ------------------ procedure CopyCanvasToClipboard(Canvas:TCanvas;ARect:TRect); var bmp:TBitmap; // временноbitmap begin bmp:=TBitmap.Create; // Създайте го опитайте bmp.Width:=ARect.Right-ARect.Left; // Задаване на неговите размери bmp.Height:=ARect.Bottom-ARect.Top; bmp.Canvas.CopyRect(Rect(0,0,bmp.Width,bmp.Height), // Копиране на платното в Canvas,ARect); // растерно платно ClipBoard.Assign(bmp); // Копирайте растерното изображение в клипборда накрая FreeAndNil(bmp); // Унищожаване на ненужното растерно изображение end; край;
// ---- Извличане на картина от клипборда. Върнете True при успех ---- функция PasteCanvasFromClipboard(Picture:TPicture;var ARect:TRect):Boolean; започнете Резултат:=Невярно; // Функционална стойност по подразбиране ако не е ClipBoard.HasFormat(CF_Bitmap) // Ако няма изображение в клипборда, тогава Exit; // след това излезте с резултат False Picture.Assign(Clipboard); // Зареждане на картина от клипборда ARect:=Rect(1,1,Picture.Width,Picture.Height); // Преминаване на размерите на изображението през параметъра ARect Result:=True; // Изход с положителен резултат (True) end;
защо пише Undeclared Identifier ClipBoard и ARect?
Цитат (булдогер ):
моля, кажете ми кои модули трябва да бъдат свързани
Цитат (булдогер ):
Е, най-накрая хората ги мързеливо! Наистина ли е по-лесно да чакате с дни за отговори във форумите, отколкото просто да натиснете F1 и да разрешите собствения си въпрос за 3 минути?
Добре, това са модулите Clipbrd и Types.
Благодаря много за отговорите! И как да направите "изрязване" от PaintBox.
Цитат (булдогер ):