Въпрос # 5 514 ... на многоъгълник (многоъгълният компонент е същият като в стандартния Paint,

Общност от програмисти Комуникация, помощ, обмяна на опит

Delphi.int.ru Expert

Други раздели на портала

Преминете към въпрос:

Статистика за днес:

Въпроси:0 Отговори:0 Мини форуми:0

Топ експерти

Въпрос # 5 514

Здравейте скъпи експерти! Как да нарисувате многоъгълник в Delphi (компонентът на полигона е същият като в стандартния Paint, той също трябва да рисува) при щракване на мишката? Каква функция се използва за такова чертане, с какви параметри се задава?

Отговор №1. Експертните отговори:първи вирус

  1. единица Единица1;
  2. интерфейс
  3. използва
  4. Windows, съобщения, SysUtils, варианти, класове, графики, контроли, формуляри,
  5. Диалози, бутони, ExtCtrl;
  6. Тип
  7. TForm1 = клас (TForm)
  8. SB_Arroy: TSpeedButton;
  9. SB_Poly: TSpeedButton;
  10. PB_Work: TPaintBox;
  11. процедура PB_WorkMouseDown(Подател: TObject; Бутон: TMouseButton;
  12. Shift: TShiftState; X, Y: цяло число);
  13. частен
  14. NowDrawPoly : boolean;
  15. публичен
  16. край;
  17. вар
  18. Формуляр1: TForm1;
  19. изпълнение
  20. процедура TForm1.PB_WorkMouseDown(Подател: TObject; Бутон: TMouseButton;
  21. Shift: TShiftState; X, Y: цяло число);
  22. вар
  23. RClick,LClick : булево;
  24. започвам
  25. LCick := Button = mbLeft;
  26. RCClick := Бутон = mbRight;
  27. ако LЩракнете тогава
  28. започвам
  29. ако SB_Poly.Надолу тогава
  30. if NowDrawPoly then PB_Work.Canvas.LineTo(Mouse.CursorPos.X,Mouse.CursorPos.Y)
  31. друго
  32. започвам
  33. NowDrawPoly := true;
  34. PB_Work.Canvas.MoveTo(Mouse.CursorPos.X,Mouse.CursorPos.Y);
  35. край;
  36. край
  37. иначе ако RCщракнете тогава
  38. започвам
  39. SB_Poly.Down := False;
  40. SB_Arroy.Down := True;
  41. NowDrawPoly := False;
  42. край;
  43. край;
  44. край.

Въпрос мини-форум

Цитат (булдогер ):

Забравих да поясня, рисуването става с помощта на 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.

Цитат (булдогер ):