Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Цвет задается функцией RGB. Как уже отмечалось выше, если в физической палитре нет данного цвета, задаваемого фактическим параметром, Windows устанавливает наиболее близкий цвет. Он-то и возвращается методом SetPixel. Следует также отметить, что, хотя координаты являются логическими, устанавливается цвет только одного пикселя, даже если единица измерения для текущей системы координат иная.
Линии
Прежде, чем описывать методы для рисования линий, рассмотрим два важных для них атрибута контекста устройства.
Первый называют текущим пером. Его значением является перо как объект GDI. Любая линия (в том числе и ограничивающая фигуру) рисуется пером. Если метод не содержит явного параметра, задающего перо, то для рисования берется текущее перо, которое можно установить методом SelectObject. Или, если в качестве параметра передать одну из констант BLACK_PEN, NULL_PEN, WHITE_PEN, то методом SelectStockObject
Второй важный атрибут - текущая позиция пера. Чтобы изменить координаты текущей позиции пера, используются метод MoveTo. Чтобы нарисовать прямую линию от текущей позиции пера до нужной точки с логическими координатами (x, y), используется метод LineTo. После выполнения метода LineTo заданная в нем точка становится текущей позицией пера.
Если имеется массив точек и требуется соединить линией каждую следующую точку с предыдущей, можно использовать метод PolyLine, в котором первый параметр - указатель на массив элементов типа POINT, а второй равен количеству точек. При выполнении этого метода текущая позиция пера не изменяется.
Следующий метод аналогичен PolyLine за исключением того, что он устанавливает текущую позицию пера равной последней точке массива - PolyLineTo.
Если же требуется соединить между собой все точки, содержащиеся в массиве, можно вызвать метод PolyPolyline.
Фигуры
В Visual C++ имеются методы для рисования: прямоугольника (Rectangle); эллипса (Ellipse); скругленного прямоугольника (RoundRect); сегмента эллипса (Chord); сектора эллипса (Pie); замкнутого многоугольника; составного замкнутого многоугольника.
Для рисования фигур важен атрибут контекста устройства, называемый текущей кистью. Он задает кисть как объект GDI, с помощью которого производится закрашивание внутренней области фигуры. Текущая кисть устанавливается методом SelectObject или SelectStockObject, если в качестве параметра передать одну из констант: BLACK_BRUSH, DKGRAY_BRUSH, GRAY_BRUSH, HOLLOW_BRUSH, LTGRAY_BRUSH, NULL_BRUSH, WHITE_BRUSH.
5. Пример графической программы с оптимизацией
Отсюда можно взять рабочую программу в диалоговом режиме, с оптимизированной графикой.
Во многих книжках работа с графикой описывается следующим образом:
1. Все графические функции описывабтся в OnPaint().
2. Далее в другом месте программы вызываются функции Invalidate, InvalidateRect или InvalidateRgn.
3. Такой тип построения программы не совсем верен, так как в таком случае обычно всё мигает и это нервирует.
4. Есть немного другой способ работы с графикой и ниже он будет описан.
Этот метод заключается в следующем :
1. Вся графика рисуется в какой-то функции F().
2. По событию таймера или по другим событиям вызывается F().
3. Эдементы графики рисуются сначала в памяти, а потом выводятся на экран.
4. Предворительные расчёты можно вести как в F() так и в других частях программы.
5. Функция OnPaint() содержит копию функции F(), это нужно только для перерисовки окна при изменении его положения или размера.
15. Создание собственных диалоговых окон
Для того, что бы создать собственное диалоговое окно надо сделать следующее:
1) Создайте программу в диалоговом режиме ( с поддежкой MFC )
2) Назовите её TEST, что бы было лучше сравнивать с моей рабочей программой
3) Главный класс вашей программы будет CTestDlg
4) Что бы создать другую диалоговую панель нужно создать новый класс, для этого выбери закладку ResourceView -> правой кнопкой на Dialog -> Insert Dialog -> создастся новый диалог.
5) Имя диалога можно менять, поставте IDD_MY_DIALOG
6) Дальше надо зарегистрировать новый класс, для этого: при открытом новом диалоге( это обязательно ) надо вызвать ClassWizard( в верхнем меню) -> Create new class -> надо ввести имя класса ( введите CMyDialog( MyDialog. cpp), имя должно начинаться с C, что означает class ) -> два раза ОК
7) Теперь надо, чтобы выша главная программа "узнала" новый класс -> в начале файла TestDlg. cpp напишите строчку
#include "MyDialog. h"
8) Ну вот и всё, теперь можно использовать новое диалоговое окно ->
CMyDialog MyDlg;
MyDlg. DoModal();
Отсюда можно взять рабочую программу в диалоговом режиме, в которой используется собственное диалоговое окно.
16. Работа с WinSocket
Socket (гнездо, разъем) - абстрактное программное понятие, используемое для обозначения в прикладной программе конечной точки канала связи с коммуникационной средой, образованной вычислительной сетью. При использовании протоколов TCP/IP можно говорить, что socket является средством подключения прикладной программы к порту (см. выше) локального узла сети.
Socket-интерфейс представляет собой просто набор системных вызовов и/или библиотечных функций языка программирования СИ, разделенных на четыре группы:
1. Локального управления
2. Установления связи
3. Обмена данными (ввода/вывода)
4. Закрытия связи
5. Пример использования WinSocket
Ниже рассматривается подмножество функций socket-интерфейса, достаточное для написания сетевых приложений, реализующих модель "клиент-сервер" в режиме с установлением соединения.
1. Функции локального управления
Функции локального управления используются, главным образом, для выполнения подготовительных действий, необходимых для организации взаимодействия двух программ-партнеров. Функции носят такое название, поскольку их выполнение носит локальный для программы характер.
1.1 Создание socket'а
Создание socket'а осуществляется следующим системным вызовом
#include <sys/socket. h>
int socket (domain, type, protocol)
int domain;
int type;
int protocol;
Аргумент domain задает используемый для взаимодействия набор протоколов (вид коммуникационной области), для стека протоколов TCP/IP он должен иметь символьное значение AF_INET (определено в sys/socket. h).
Аргумент type задает режим взаимодействия:
- SOCK_STREAM - с установлением соединения; SOCK_DGRAM - без установления соединения.
Аргумент protocolзадает конкретный протокол транспортного уровня (из нескольких возможных в стеке протоколов). Если этот аргумент задан равным 0, то будет использован протокол "по умолчанию" (TCP для SOCK_STREAM и UDP для SOCK_DGRAM при использовании комплекта протоколов TCP/IP).
При удачном завершении своей работы данная функция возвращает дескриптор socket'а - целое неотрицательное число, однозначно его идентифицирующее. Дескриптор socket'а аналогичен дескриптору файла ОС UNIX.
При обнаружении ошибки в ходе своей работы функция возвращает число "-1".
1.2. Связывание socket'а
Для подключения socket'а к коммуникационной среде, образованной вычислительной сетью, необходимо выполнить системный вызов bind, определяющий в принятом для сети формате локальный адрес канала связи со средой. В сетях TCP/IP socket связывается с локальным портом. Системный вызов bind имеет следующий синтаксис:
#include <sys/types. h>
#include <sys/socket. h>
#include <netinet/in. h>
int bind (s, addr, addrlen)
int s;
struct sockaddr *addr;
int addrlen;
Аргумент s задает дескриптор связываемого socket'а.
Аргумент addr в общем случае должен указывать на структуру данных, содержащую локальный адрес, приписываемый socket'у. Для сетей TCP/IP такой структурой является sockaddr_in.
Аргумент addrlen задает размер (в байтах) структуры данных, указываемой аргументом addr.
Структура sockaddr_in используется несколькими системными вызовами и функциями socket-интерфейса и определена в include-файле in. h следующим образом:
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
Поле sin_family определяет используемый формат адреса (набор протоколов), в нашем случае (для TCP/IP) оно должно иметь значение AF_INET.
Поле sin_addr содержит адрес (номер) узла сети.
Поле sin_port содержит номер порта на узле сети.
Поле sin_zero не используется.
Определение структуры in_addr (из того же include-файла) таково:
struct in_addr {
union { u_long S_addr; /* другие (не интересующие нас) члены объединения */ } S_un;
#define s_addr S_un. S_addr
};
Структура sockaddr_in должна быть полностью заполнена перед выдачей системного вызова bind. При этом, если поле sin_addr. s_addr имеет значение INADDR_ANY, то системный вызов будет привязывать к socket'у номер (адрес) локального узла сети.
В случае успеха bind возвращает 0, в противном случае - "-1".
2. Функции установления связи
Для установления связи "клиент-сервер" используются системные вызовы listen и accept (на стороне сервера), а также connect (на стороне клиента). Для заполнения полей структуры socaddr_in, используемой в вызове connect, обычно используется библиотечная функция gethostbyname, транслирующая символическое имя узла сети в его номер (адрес).
2.1. Ожидание установления связи
Системный вызов listen выражает желание выдавшей его программы-сервера ожидать запросы к ней от программ-клиентов и имеет следующий вид:
#include <sys/socket. h>
int listen (s, n)
int s;
int n;
Аргумент s задает дескриптор socket'а, через который программа будет ожидать запросы к ней от клиентов. Socket должен быть предварительно создан системным вызовом socketи обеспечен адресом с помощью системного вызова bind.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |


