Как нарисовать точку в c
Перейти к содержимому

Как нарисовать точку в c

  • автор:

Графика в оконных приложениях

Для рисования графических примитивов в оконных приложениях используются 4 основных типа объектов:

  • точка (Pixel);
  • перо (Pen);
  • кисть (Brush);
  • фон (Background).

Точка

Цвет точки задается с помощью функции

В случае удачного завершения возвращаемое значение функции дублирует цвет точки, в случае ошибки возвращает -1.

Цвет точки представляет собой 32-битное число, заданное в системе RGB:
RGB

Можно также воспользоваться функцией

Значения красного, зеленого и синего используются в диапазоне 0…255.

Перо используется для рисования линий и контуров замкнутых фигур. Цвет пера задается функцией

Стили пера fnPenStyle могут быть заданы согласно таблице

Значение Тип Описание
PS_SOLID 0 PS_SOLID Сплошное перо
PS_DASH 1 PS_DASH Прерывистое (пунктирное) перо.
PS_DOT 2 PS_DOT Точечное (штриховое) перо.
PS_DASHDOT 3 PS_DASHDOT Штрих-пунктир
PS_DASHDOTDOT 4 PS_DASHDOTDOT Две точки — пунктир
PS_NULL 5 Невидимое перо

При успешном завершении функция возвращает дескриптор пера, в случае неудачи — константу NULL .

Кисть

Кисть используется для закрашивания замкнутых объектов. Цвет кисти задается с помощью функции

При успешном завершении функция возвращает дескриптор кисти, в случае неудачи — константу NULL .
Эта же функция используется для задания цвета фона .

Можно заранее создать несколько кистей и перьев, а затем выбирать нужные с помощью функции

Рисование графических примитивов

Перемещение в указанную точку осуществляется функцией:

Координаты точки x и у определяются в пикселях относительно левого верхнего угла.
В случае успешного выполнения возвращает ненулевое значение.

Структура POINT имеет вид

Рисование отрезков осуществляется функцией:

В случае успешного выполнения возвращает ненулевое значение.

Рисование прямоугольника осуществляется функцией:

Рисование прямоугольника начинается из точки, в которую осуществлено перемещение с помощью функции MoveTo() .
В случае успешного выполнения возвращает ненулевое значение.

Рисование эллипса осуществляется функцией:

Овал
В случае успешного выполнения возвращает ненулевое значение.

Рисование дуги осуществляется функцией:

Дуга
В случае успешного выполнения возвращает ненулевое значение.

Вывод текста в окно

Для вывода текста в поле окна используется функция

В случае успешного выполнения возвращает ненулевое значение.

Задать цвет фона под буквами можно с помощью функции

Задать цвет букв можно с помощью функции

В случае неудачного завершения эти функции возвращают константу CLR_INVALID=0xFFFF .

Использование графических функций

Для перерисовки окна, в котором будут отображаться графические объекты, будем использовать обработку сообщения WM_PAINT .

Обработка сообщения WM_PAINT почти всегда начинается с вызова функции:

При обработке вызова BeginPaint() , Windows обновляет фон рабочей области с помощью кисти, заданной в поле hbrBackground структуры WNDCLASS , описанной здесь. Вызов BeginPaint() делает всю рабочую область действительной (не требующей перерисовки) и возвращает описатель контекста устройства. Контекст устройства описывает физическое устройство вывода информации (например, экран) и его драйвер. Описатель контекста устройства необходим для вывода в рабочую область окна текста и графики.

  • hwnd – дескриптор окна;
  • lpPaint – указатель на структуру PAINTSTRUCT .

Структура PAINTSTRUCT имеет вид

  • hdc – дескриптор контекста устройства.
  • fErase – ненулевое значение стирает фон.
  • rcPaint – структура RECT , определяющая верхний левый и нижний правый углы рабочей области.

Обработка сообщения WM_PAINT почти всегда заканчивается вызовом функции:

Функция EndPaint() освобождает описатель контекста устройства, после чего его значение нельзя использовать. Возвращает всегда ненулевое значение.

Получение дескриптора контекста устройства осуществляется вызовом функции:

hWnd – дескриптор окна, для которого используется контекст устройства.
Возвращаемое значение – дескриптор контекста устройства.

освобождает контекст устройства hDC для данного окна hWnd , после чего значение контекста устройства нельзя использовать. Возвращает всегда ненулевое значение.

Комментариев к записи: 3

LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
<
switch (message)
<
//.
case WM_PAINT :
PaintAll(hwnd);
return 0;
case WM_ERASEBKGND:
return 0;
//.
>
return DefWindowProc (hwnd, message, wparam, lparam);
>

namespace e
<
extern HWND hpicturebox; // это окно где что-то рисуется
>

Как нарисовать точку?

подскажите, пожалуйста, как нарисовать точку в один пиксель?

8 ответов

получилось вот так:

private: System::Void panel1_Paint(System::Object^ sender,
System::Windows::Forms::PaintEventArgs^ e) <
Bitmap^ myBitmap = gcnew Bitmap(600,200);
Pen^ redPen = gcnew Pen(Color::Red);
System::Drawing::Font^ drawFont =
gcnew System::Drawing::Font( «Arial»,10 );
SolidBrush^ drawBrush = gcnew SolidBrush(Color::Yellow);
e->Graphics->Clear(Color::Black);

//координатные оси
redPen->Width = 1;
e->Graphics->DrawLine(redPen, 0, 100, 600, 100);
e->Graphics->DrawLine(redPen, 10, 0, 10, 200);
//!координатные оси

//график
for(int i=0; i<1000; i++) <
int g=(int)(30*sin(i*3.1415926536/180*3));
myBitmap->SetPixel(10+i/3,100+g,Color::Green);
>
e->Graphics->DrawImage( myBitmap, 0, 0, 600, 200 );
//!график

//подписи
for(int i=0; i<=10; i++) <
PointF drawPoint = PointF(i*40,100);
e->Graphics->DrawString((i*40).ToString(),
drawFont,drawBrush,drawPoint);
>
//!подписи
>

Рисование точки

Функция рисования точки SetPixel устанавливает цвет точки с заданными координатами:

COLORREF WINAPI SetPixel(

HDC hdc, // контекст отображения

int nXPos, // x-координата точки (логическая, а в сообщениях

передаются физические координаты!)

int nYPos, // y-координата точки

COLORREF clrref); // цвет точки

Рисование линий

Для рисования прямых линий в контексте отображения хранятся координаты текущей позиции пера. Для изменения текущей позиции пера предназначена функция MoveToEx.

BOOL WINAPI MoveToEx(

HDC hdc, // идентификатор контекста отображения

int x, // x-координата

int y, // y-координата

POINT FAR* lppt); // указатель на структуру POINT, старые координаты пера.

Чтобы узнать текущую позицию пера, приложение может использовать функцию GetCurrentPositionEx:

BOOL WINAPI GetCurrentPositionEx(HDC hdc, POINT FAR* lppt);

Для того чтобы нарисовать прямую линию, приложение должно воспользоваться функцией LineTo :

BOOL WINAPI LineTo(HDC hdc, int xEnd, int yEnd);

Эта функция рисует линию из текущей позиции пера, установленной ранее функцией MoveToEx, в точку с координатами (xEnd,yEnd). После того как линия будет нарисована, текущая позиция пера станет равной (xEnd,yEnd).

Особенностью функции LineTo является то, что она немного не дорисовывает линию: эта функция рисует всю линию, не включая точку (xEnd,yEnd).

Можно создать свою собственную функцию рисования линии, например такую:

BOOL DrawLine(HDC hdc, int x1, int y1, int x2, int y1)

MoveToEx(hdc, x1, y1, &pt);

return LineTo(hdc, x2, y2);

Рисование ломаной линии

BOOL WINAPI Polyline(

HDC hdc, // идентификатор контекста отображения

const POINT FAR* lppt,// указатель на массив структур POINT

int cPoints); // размер массива

Рисование дуги эллипса

Ксожалению, возможности рисования кривых линий при помощи функций GDI ограничены — единственная функция Arc позволяет нарисовать дугу эллипса или окружности:

BOOL WINAPI Arc(

HDC hdc, // идентификатор контекста отображения

int nxLeft, int nyTop, // верхий левый угол

int nxRight, int nyBottom, // правый нижний угол

int nxStart, int nyStart, // начало дуги

int nxEnd, int nyEnd); // конец дуги

Дуга рисуется в направлении против часовой стрелки. Координаты центра эллипса (если это потребуется) можно вычислить следующим образом:

xC = (nxLeft + nxRight) / 2;

yC = (nyTop + nyBottom) / 2;

Рисование геометрических фигур

BOOL WINAPI Rectangle(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, nBottomRect);

BOOL WINAPI Ellips(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);

Рисование точки на изображении в C#

У меня есть изображение размером 100х50 и я хочу нарисовать точку в центре — т.е. 50х25. Как бы я это сделал?

добавить точку в изображение. что ты на самом деле пытаешься сделать, приятель? — Abhijeetchindhe

4 ответы

вы могли бы использовать установитьPixle() функции.

ответ дан 14 авг.

когда я пытаюсь вызвать метод, он показывает ошибку, например Ошибка. Нет перегрузки для метода «SetPixel_Example», принимает аргументы «0» — user1578358

@user1578358 userXNUMX можешь прислать мне свой код? моя почта: elyashi.horovitz на gmail.com. — Эльяшив

смотреть здесь для сохранения картинки

он не рисует при загрузке формы, поэтому вы должны добавить свой код в форму paint мероприятие :

ответ дан 23 мая ’17, 12:05

@user1578358 userXNUMX это так, мой друг, я только что протестировал его, покажи мне свой код, и я скажу тебе, в чем проблема. Вы правильно назвали Controls? — Махди Тахсильдари

используя System.Collections.Generic; используя System.ComponentModel; используя System.Data; с помощью System.Drawing; используя System.Drawing.Imaging; используя System.Drawing.Drawing2D; используя System.Drawing.Text; с помощью System.Linq; используя System.Text; используя System.Windows.Forms; пространство имен chkcenter < общедоступный частичный класс Form1 : Form < public Form1() < InitializeComponent(); >private void Form1_Load (отправитель объекта, EventArgs e) < Graphics g = pictureBox1.CreateGraphics(); g.DrawEllipse(Pens.DarkBlue, новый прямоугольник(120, 90, 1, 1)); >>> — user1578358

Я сохранил изображение прямо в окне изображения — user1578358

@user1578358 user100 вы сказали, что размер вашего окна с картинками 50xXNUMX, но вы используете new Rectangle(120, 90, 1, 1) он не рисуется, потому что он находится за пределами вашего поля изображения. — Махди Тахсильдари

вы должны использовать new Rectangle(halfOfPictureBoxWidth, halfOfPictureBoxHeight, 1, 1) — Махди Тахсильдари

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *