Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Графическая библиотека FrameWork.NET MS Visual Studio



Имя

Описание

Пример

MoveTo

Перемещает точку начала рисования линии в указанные координаты x и y

Canvas.MoveTo(50, 100);

LineTo

Рисует линию начиная с текущей позиции (см. MoveTo) до указанных координат x и y.

Canvas.LineTo(50, 100);

Эффект перемещения точки начала рисования линии так же достигается при помощи установки своства PenPos в канвасе... например, "Canvas.PenPos.x := 20;", "Canvas.PenPos.y := 50", или "Canvas.PenPos := Point(20,50);".

По умолчанию, точка начала рисования установлена в (0,0), то есть, если сразу вызвать "Canvas.LineTo(100,100);" то будет нарисована линия из точки (0,0) в точку (100, 100). Точка начала рисования автоматически переместится в (100, 100), то есть, если выполнить команду "Canvas.LineTo(200, 100);", то следующая линия будет нарисована из точки (100, 100) в (200, 100). Поэтому, если мы хотим рисовать линии несоединённые друг с другом, то придётся воспользоваться методом MoveTo.

Линия, нарисованная при помощи LineTo использует текущее перо канваса (типа TPen). Основные свойства пера, это ширина - "Canvas.Pen.Width := 4;" (при помощи которого можно задавать различную ширину линий), и цвет "Canvas.Pen.Color := clLime;".

Для рисования фигур, в TCanvas предусмотрены, например, следующие функции:

ИМЯ

ОПИСАНИЕ

ПРИМЕР

Ellipse

Рисует элипс, вписанный в невидимый квадрат с координатами верхнего левого угла и правого нижнего. Если координаты х и y у углов будут совпадать, то получится круг.

Canvas.Ellipse(0,0,50,50);

FillRect

Заполняет прямоугольник цветом текущей кисти (brush), но никак не за пределами него.

Canvas.FillRect( Bounds(0,0,100,100));

FloodFill

Заполняет данную область цветом текущей кисти, до тех пор пока не будет достигнут край.

Canvas.FloodFill(10, 10, clBlack, fsBorder);

Rectangle

Рисует прямоугольник (или квадрат), заполненный цветом текущей кисти и обрамлённый цветом текущего пера

Canvas.Rectangle( Bounds(20, 20, 50, 50));

RoundRect

Тоже, что и Rectangle, но с загруглёнными углами.

Canvas.RoundRect( 20, 20, 50, 50, 3, 3);

 

{ Пример на Delphi 7.0 }

 

unit Unit1;

 

interface

 

uses

Windows, Messages,
SysUtils, Variants,
  Classes, Graphics,
Controls, Forms,

Dialogs, ExtCtrls,
StdCtrls;

 

type

TForm1 = class(TForm)

Image1: TImage;

CheckBox1: TCheckBox;

Timer1: TTimer;

procedure CheckBox1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

private

{ Private declarations }

public

  { Public declarations }

end;

 

var

Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

procedure TForm1.CheckBox1Click(Sender: TObject);

begin

Timer1.Enabled:=CheckBox1.Checked;

end;

 

VAR     TB: TBitMap;

xx,yy,dx,sn,c35 :integer;

 

procedure TForm1.FormCreate(Sender: TObject);

begin TB:=TBitmap.create;

TB.LoadFromFile('runner.bmp');    //10 по 35х35 пикселей

TB.Transparent:=true;

xx:=0; dx:=1; yy:=100; sn:=0; c35:=35;

end;

 

procedure TForm1.Timer1Timer(Sender: TObject);

var i,j :integer; cc:tcolor;

begin //отрисовка

Image1.Picture.LoadFromFile('fon.bmp'); //320x200

//Image1.Canvas.Draw(xx,yy,TB); //альтернативные функции

//Image1.Canvas.BrushCopy(Rect(xx,yy,xx+35,yy+35),TB,Rect(0,Sn,35,Sn+35),clWhite);

for j:=Sn to Sn+c35-1 do

 for i:=0 to TB.Width-1 do begin

if dx<0 then cc:=TB.Canvas.Pixels[c35-1-i,j] else cc:=TB.Canvas.Pixels[i,j];

if cc<>TB.Canvas.Pixels[0,0] then

Image1.Canvas.Pixels[xx+i,yy+j-Sn]:=cc; end;{}

xx:=xx+dx; if (xx<0)or(xx>320-c35) then dx:=-dx;

yy:=yy+Round(sin(xx/20)*dx);

Sn:=Sn+c35; if Sn>= TB.Height then Sn:=0;

end;

 

end.

 

 

 

В среде С++/С# поддерживается множественное наследование (в отличие от Delphi, где холст+карандаш+кисть+шрифт+художник – это один объект) и поэтому объекты для поддержания растровой и векторной графики не объединены изначально и требуют явных ссылок друг на друга, т.е. нужно отдельно создавать объект карандаш-Pen и кисть-Brush и художника-Graphics и связать его с холстом (например, PictureBox). Идеология FrameWork.NET описана в п.2.

В языках С++/C# существует целая библиотека для создания графики "System.Drawing". Она автоматически подключается при создании проекта.

Самое главное изменение, которое может ввести в тупик новичка, ‑ это кодировка цвета: здесь для него используется 4 байта ARGB, т.е. введен альфа-канал (прозрачность) и, самое непонятное, он должен быть 255 (больше 0), чтобы пиксель рисовался! Если у вас не рисуется пиксель делайте: Pix |= 0xFF000000; может и поможет.

Прямой доступ к пикселям есть в классе BitMap через методы

Status GetPixel(INT x, INT y, Color* color);

Status SetPixel(INT x, INT y, const Color& color);

Эти методы очень медленные, можно использовать групповые методы:

Status LockBits(IN const Rect* recx, IN UINT flags, IN PixelFormat format, OUT BitmapData* lockedBitmapData)

Status UnlockBits();

Прозрачность цвета при копировании делается методом:

MakeTransparent(const Color& color);

Пример, где по нажатию кнопки на форме файл «music.bmp» отображается в PictureBox1 только красной компонентой цвета RGB:

private void Button1_Click(System.Object sender, System.EventArgs e)

{ try { // Retrieve the image.

   image1 = new Bitmap(@"C:\My Music\music.bmp", true);

   int x, y; // Loop through the images pixels to reset color.

   for(x=0; x<image1.Width; x++)

   { for(y=0; y<image1.Height; y++)

       { Color pixelColor = image1.GetPixel(x, y);

           Color newColor = Color.FromArgb(pixelColor.R, 0, 0);

           image1.SetPixel(x, y, newColor);

   } }

   // Set the PictureBox to display the image.

   PictureBox1.Image = image1;

   // Display the pixel format in Label1.

   Label1.Text = "Pixel format: "+image1.PixelFormat.ToString();

} catch(ArgumentException)

{ MessageBox.Show("File not found.");

} }

 



Поделиться:


Последнее изменение этой страницы: 2024-06-17; просмотров: 5; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.133.138.14 (0.007 с.)