Цвета могут быть определены как номера цвета AutoCAD или как один из “логических” номеров цвета, показанных в следующей таблице.

ADI номера цвета

Цвет

Номер

Мнемоническое описание ADI

-2

BGLCOLOR

Текущий фон экрана графики AutoCAD

-15

DBGLCOLOR

Текущий цвет фона диалогового окна

-16

DFGLCOLOR

Цвет символа диалогового окна Current (для текста)

-18

LINELCOLOR

Диалоговое окно текущего цвета линии

Значения и мнемоника определены Интерфейсом Устройства Autodesk (ADI).

В следующем примере, “cur_color” - поле ввода изображения, которое будет заполнено полностью заплатой красных. Только один запрос необходим, чтобы получить измерения изображения:

short width, height;

ads_dimensions_tile(hdlg, "cur_color", &width, &height);

ads_start_image(hdlg, "cur_color");

ads_fill_image(0, 0, width, height, 1); // 1 == red.

ads_end_image();

Рисующие изображение функции могут использоваться друг с другом. Здесь, код заполняет изображение и затем рисует вертикальную полосу по этому:

short width, height, x;

ads_dimensions_tile(hdlg, "stripe", &width, &height);

ads_start_image(hdlg, "stripe");

ads_fill_image(0, 0, 0, height, 3); // 3 == AutoCAD green.

// Center the vector vertically.

//

x = width/2;

ads_vector_image(x, 0, x, height, 4); // 4 == cyan.

ads_end_image();

Скольжения, которые Вы отображаете с ads_slide_image () могут быть автономное скольжение (.sld) файлы или часть библиотеки скольжений (.slb) файл. Если скольжение находится в. sld файле, Вы определяете его имя без. sld расширения (например, “frntview”). Если скольжение находится в библиотеке скольжений, Вы определяете имя библиотеки сначала (без расширения), сопровождаемый именем скольжения непосредственно (также без расширения) включенный в круглые скобки (например, “ allviews (frntview) ”). Ads_slide_image () функциональные исследования скольжения или файла библиотеки скольжения согласно потоку путь поиска файлов библиотеки AutoCAD.

НЕ нашли? Не то? Что вы ищете?

Скольжение в следующем примере находится в отдельном файле, вызвал topview. sld:

short x, y;

ads_dimensions_tile(hdlg, "view", &x, &y);

ads_start_image(hdlg, "view");

ads_slide_image(0, 0, x, y, "topview");

ads_end_image();

Векторы в скольжениях часто рисуются в белом (номер цвета 7), который является заданным по умолчанию цветом фона изображения. Если ваше поле ввода изображения - пробел, когда Вы сначала отображаете скольжение, пробуете изменить его цветной атрибут к graphics_background. (Вы можете также изменять фон изображения, предшествуя ads_slide_image () запрос с ads_fill_image () запрос).

Ввод Кнопки Изображения

Вы можете обрабатывать кнопку изображения просто как кнопка — то есть вызывать отдельное действие. Однако, PDB средство также дает Вам опцию определения областей кнопки так, чтобы принятое действие зависело, на которой части кнопки изображения пользователь выбирает. Механизм для этого прямой: действие кнопки изображения или повторный вызов возвращают (X, Y) местоположение, которое пользователь выбрал. Координаты - в пределах диапазона специфического поля ввода кнопки изображения (как возвращено функциями измерения). Ваше приложение должно назначить значение к местоположениям на поле ввода кнопки изображения, неявно определяя области изображения.

В следующем примере, кнопка изображения имеет два цветных образчика, созданные ads_fill_image (). Вы можете выбирать один или другой, в зависимости от которой области пользователь выбирает. Если кнопка изображения разделена горизонтально (темный выше, индикатор ниже), повторный вызов должен проверить только одно измерение. Не используйте структуру точки типа ads_point, чтобы сохранить координаты pickpoint, потому что их пропускают как длинные целые числа:

char result[31]; // Global char array

static void CALLB

pick_shade(ads_callback_packet cbpkt)

{

long threshold, pick_y = cbpkt->y;

ads_hdlg hdlg = cbpkt->dialog;

short x, y;

ads_dimensions_tile(hdlg, "image_sel", &x, &y);

threshold = y/2;

// Remember the origin at upper left.

//

if (pick_y > threshold)

strcpy(result, "Light");

else

strcpy(result, "Dark");

}

Обработка Радио-Кластеров

"Радио" кнопки появляются в кластерах радио. Значение каждой индивидуальной "радио" кнопки является или “1” для на или “0” для от; значение кластера радио - ключевой атрибут в настоящее время отобранной кнопки. Пакет PDB управляет значениями "радио" кнопок в кластере, и гарантирует, что только каждый находится на одновременно.

Вы можете назначать действие на каждую индивидуальную "радио" кнопку, но это более удобно назначить действие на кластер радио в целом и затем проверять значение кластера, чтобы видеть, который из "радио" кнопок был выбран.

В следующем примере, радио кластеризует средство управления, которое вид трехмерного объекта отображено после того, как пользователь оставляет диалоговое окно. Этот кластер содержит четыре "радио" кнопки (хотя имелся бы больше).

ads_action_tile(hdlg, "view_sel", pick_view);

...

static void CALLB

pick_view(ads_callback_packet *cbpkt)

{

char value[TILE_STR_LIMIT];

strcpy(value, cbpkt->value);

if (strcmp(value, "front") == 0)

show_which = 0;

else if (strcmp(value, "top") == 0)

show_which = 1;

else if (strcmp(value, "left") == 0)

show_which = 2;

else if (strcmp(value, "right") == 0)

show_which = 3;

}

Предшествующие примеры показывают каждую "радио" кнопку, связанную с единственной переменной, которая берет множественные значения. Они могут также вызывать дополнительные действия, типа отключения выборов в вашем диалоговом окне. Если кластер радио - большой, удобно сохранить связанные значения в таблице. Если Вы используете таблицу, структурируете это так, чтобы это не зависело от порядка кнопок в пределах кластера. Пакет PDB не налагает это ограничение, и порядок может изменяться, если DCL изменяется.

Обработка Слайдеров

Когда Вы обрабатываете действия и повторные вызовы от слайдеров, ваше приложение должно проверить код причины, который это получает наряду с повторным вызовом.

Хотя Вы не требованы, чтобы проверить код причины, рекомендуется, чтобы Вы делали так, чтобы привести обработку. Частота повторных вызовов, что слайдеры генерируют, зависит от платформы, но некоторые платформы генерируют CBR_DRAG повторный вызов для каждого движения мыши поиски слайдера.

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

Это вызвано от выражения действия, связанного с полем ввода слайдера. Slider_info поле ввода, используемое функцией отображает текущее значение слайдера в десятичной форме. Часто такое поле ввода - окно редактирования также, которое дает пользователю выбор или управления слайдером или печатанием его значения непосредственно. Если пользователь напечатает значение в slider_info, повторный вызов окна редактирования должен (наоборот) модифицировать значение слайдера:

static void CALLB

slider_action(ads_callback_packet *cbpkt)

{

ads_hdlg hdlg = cbpkt->dialog;

int reason = cbpkt->reason;

char interim[TILE_STR_LIMIT];

// Save the interim result.

//

strcpy(interim, cbpkt->value);/

// Display the result.

//

ads_set_tile(hdlg, "slider_info", interim);

}

static void CALLB

ebox_action(ads_callback_packet *cbpkt)

{

ads_hdlg hdlg = cbpkt->dialog;

int reason = cbpkt->reason;

char interim[TILE_STR_LIMIT];

// Save the interim result.

//

strcpy(interim, cbpkt->value);

// Display the result.

//

ads_set_tile(hdlg, "myslider", interim);

}

Обработка окна редактирования

Действия и повторные вызовы, чтобы обработать окна редактирования подобны тем для слайдеров.

Однако, так как символы в окнах редактирования уже видимы, не имеется никакой потребности в действии на промежуточных результатах.

Следующие типовые проверки программы значение но не восстанавливают изображение этого:

static void CALLB

edit_action(ads_callback_packet *cbpkt)

{

int reason = cbpkt->reason;

if ((reason == CBR_LOST_FOCUS) || (reason == CBR_SELECT)) {

// Check range, syntax, etc. on transient value.

//

...

}

}

Чтобы показывать альтернативу, этот пример проверяет CBR_LOST_FOCUS скорее чем CBR_DOUBLE_CLICK.

Специфичные для приложения Данные

Ads_client_data_tile () функция назначает специфичные для приложения данные к полю ввода. Данные доступны при повторном вызове время как пакет повторного вызова client_data поле. Клиентские данные не представлены в DCL; это имеет силу только, в то время как ваше приложение выполняется. Использование клиентских данных сопоставимо использованию определяемых пользователем атрибутов. Основное различие - то, что определяемые пользователем атрибуты являются только для чтения, в то время как клиентские данные могут изменяться во время выполнения. (Также, конечные пользователи могут осматривать определяемые пользователем атрибуты в файле приложения DCL, но клиентские данные невидимы для них.)

Клиентские данные могут иметь любой тип, который Вы выбираете. Это объявлено как указатель на пусто.

Вы можете выражать клиентские данные как указатель на структуру данных, связанную с диалоговым окном или полем ввода. Структура может быть объявлена как временные данные, местные к любой функции в или выше уровня функции, которая вызывает ads_start_dialog (). Это позволяет Вам избегать объявлять клиентские данные как глобальные статические данные.

Клиентские данные - полезный способ передать информацию к функции повторного вызова, потому что никакие дополнительные параметры не могут быть добавлены к функции.

Поскольку ваша программа должна поддержать список, отображенный списком (или всплывающий список), клиентские данные хороши для обработки этой информации. Предыдущий пример mk_list () функция уже заставит список оценить параметр.

Это - тип указателя, который предоставляет себя, чтобы использовать как клиентские данные. Например, основная функция, чтобы обработать то же самое диалоговое окно могла включать следующий код (проверка ошибок минимизирована для простоты):

struct resbuf *usrhead;

int

handler()

{

struct resbuf *csyshead, *usrhead;

ads_hdlg cldlg;

if (ads_new_dialog("clistdlg", dcl_id, NULLCB, &cldlg))

return BAD;

csyshead = acutBuildList(RTSTR, "Red-Green-Blue",

RTSTR, "Cyan-Magenta-Yellow",

RTSTR, "Hue-Saturation-Value", 0);

if (csyshead == NULL)

return BAD;

ads_client_data_tile(cldlg, "colorsyslist", csyshead);

ads_action_tile(cldlg, "colorsyslist", listcallback);

...

// Start dialog box and do other processing.

//

...

}

Затем, функция повторного вызова listcallback () вызывает mk_list () следующим образом:

static void CALLB

listcallback(ads_callback_packet *cpkt)

{

if ((cpkt->reason == CBR_SELECT) || (cpkt->reason == CBR_DOUBLE_CLICK)) {

// This is not the default tile, so treat both the same.

//

usrhead = mk_list(cpkt->value, cpkt->client_data);

}

}

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132