ads_real x_pt, y_pt, z_pt;
ads_point pick_pt;
ads_hdlg hdlg;
int what_next;
static void CALLB
pick_callback(ads_callback_packet *cpkt)
{
ads_done_dialog(cpkt->dialog, 4);
}
void
bmake_handler()
{
// Load dialog box and do global initialization
//
while (what_next >= DLGSTATUS) {
// Indicates custom return code
// Other initialization such as ads_new_dialog(),
// ads_action_tile(), ads_set_tile(), and
// ads_start_list() calls.
//
ads_start_dialog(hdlg, &what_next);
switch (what_next) {
case 4:
acedGetPoint(NULL, "Insertion base point: ",
pick_pt);
acdbRToS(pick_pt[X], 2, 4, x_pt);
acdbRToS(pick_pt[Y], 2, 4, y_pt);
acdbRToS(pick_pt[Z], 2, 4, z_pt);
break;
...
}
}
}
Следующий пример скрывает множественные диалоговые окна:
// Глобальные переменные
//
Ads_point pick_pt;
// Они должны быть глобальная переменная, потому что subdlg_handler () функция должен
// быть способным обратиться к ним также как основной функции диалога.
//
ads_hdlg mdlg;
int dcl_id, what_next;
static void CALLB
hide_handler(ads_callback_packet *cpkt)
{
ads_done_dialog(cpkt->dialog, 3);
}
static void CALLB
subdlg_handler(ads_callback_packet *cpkt)
{
// REMEMBER: This function must never reference anything in
// the cpkt packet because none of its fields are valid when
// it is called explicitly in the main dialog function.
//
ads_hdlg sdlg;
ads_new_dialog("subdlg", dcl_id, NULLCB, &sdlg);
ads_action_tile(sdlg, "hide_all", hide_handler);
ads_start_dialog(sdlg, &what_next1);
if (what_next1 == 3) // Nested hide is in progress. */
ads_done_dialog(mdlg, DLGSTATUS); // Hide main dialog box.
}
void
maindlg_handler()
{
int what_next;
ads_callback_packet dummy_pkt;
// dummy_pkt is used when this section of code explicitly calls the
// subdlg_handler() function. The subdlg_handler() function expects
// a single parameter that is a pointer to an ads_callback_packet.
// Normally a callback function is called by AutoCAD, and AutoCAD
// provides a filled-in packet, but in this code we need to call
// the callback function explicitly in order to redisplay the
// subdialog after a hide. In order to do this we need a dummy
// ads_callback_packet. It doesn’t have to be filled in because
// none of its fields is ever used.
//
ads_load_dialog("maindlg. dcl", &dcl_id);
what_next = what_next1 = 5; // could be set to anything > 1.
while (what_next >= DLGSTATUS) { //DLGSTATUS == 2.
ads_new_dialog("maindlg", dcl_id, NULLCB, &mdlg);
ads_action_tile(mdlg, "x", subdlg_handler);
if (what_next1 == 3) {
// This is only true on returning from a nested hide.
// Since we are returning from a nested hide, restart the
// subdialog.
// Note that the main dialog has NOT been started yet.
// It is just a bit map painted on screen (it needs an
// ads_start_dialog() for interactivity).
//
subdlg_handler(&dummy_pkt);
if (what_next1 != 3) {
// OK or CANCEL pressed to exit the subdialog
// so it is time to activate the main dialog that
// was painted but not started.
//
ads_start_dialog(mdlg, &what_next);
}
} else {
// this is executed only once upon startup of this whole
// dialog code.
//
ads_start_dialog(mdlg, &what_next);
}
if (what_next == DLGSTATUS) { /* DLGSTATUS == 2 */
// This if condition is true when a nested hide is
// in progress and both dialogs are hidden.
//
ads_getpoint(NULL, "\nPick a point: ", pick_pt);
}
}
ads_unload_dialog(dcl_id);
}
Определения и Объявления
Чтобы записывать приложения, которые вызывают функции в пакете PDB, включают следующую директиву препроцессора в вашей программе:
#include "Adsdlg. h"
В добавлении, чтобы функционировать объявления, adsdlg. h определяют множество символов и типов, чтобы использовать с функциями диалогового окна, описанными в ObjectARX Ссылке.
Метки для Диалоговых окон и Неперекрывающих расположений
Adsdlg. h файл определяет два типа метки:
§ ads_hdlg идентифицирует диалоговые окна. Ads_new_dialog () функция назначает новое диалоговое окно, метка ads_hdlg для идентификации диалогового окна в наиболее последующий вызывает к функциям PDB, пока ads_done_dialog () не вызван.
§ ads_htile идентифицирует отобранное неперекрывающее расположение в пределах функций повторного вызова.
Если ads_new_dialog () сбои, это устанавливает метку в NULL или BAD_DIALOG.
Определения Функции Повторного вызова
Чтобы регистрировать функции повторного вызова с ads_action_tile () и ads_new_dialog (), adsdlg. h определяет тип CLIENTFUNC, который указывает на функцию повторного вызова как показано в следующей примере:
typedef void (*CLIENTFUNC)(ads_callback_packet *cpkt);
(Пустой) символ CALLB определен, чтобы делать функции повторного вызова проще, чтобы расположить в исходном тексте, как в следующем примере:
static void CALLB
dbox_handler(ads_callback_packet *cpkt)
Вы можете использовать ads_new_dialog () функция также, чтобы определить заданную по умолчанию функцию повторного вызова для диалогового окна. Если Вы не используете эту особенность, передаете нулевой{*пустой*} указатель функции NULLCB, который определен следующим образом:
#define NULLCB ((CLIENTFUNC) 0)
Коды Состояния
Ads_start_dialog () функция имеет параметр состояния, который это устанавливает, чтобы указать, как диалоговое окно закончилось. Значения для этого состояния показываются в следующей таблице:
Значения кода Состояния
Символ | Описание |
DLGOK | Пользователь выбрал кнопку OK или ее эквивалент. |
DLGCANCEL | Пользователь выбрал Отмену или ее эквивалент. |
DLGALLDONE | Диалоговое окно неактивно; ads_term_dialog был вызван. |
DLGSTATUS | Если состояние большее чем или равно DLGSTATUS, это - определенный приложением код состояния. |
Код причины прошел в пакете повторного вызова (cpkt->reason) - целое число, которое указывает, почему повторный вызов произошел (то есть какое действие пользователя генерировало повторный вызов). Коды причины повторного вызова показываются в следующей таблице:
Причина Повторного вызова закодирует значения
Символ | Описание |
CBR_SELECT | Пользователь выбрал неперекрывающее расположение (поле ввода). |
CBR_LOST_FOCUS | Окна редактирования пользователь передвигал в другое неперекрывающее расположение, но не делали заключительный выбор. |
CBR_DRAG | Для слайдеров, пользователь изменил значение, перемещая индикатор (или эквивалент) но не делал заключительный выбор. |
CBR_DOUBLE_CLICK | Списки или кнопки изображения, пользователь дважды нажали, чтобы делать заключительный выбор. |
Символы, описанные в этом разделе используются с ads_mode_tile () и ads_start_list () функции.
Функция ads_start_list () начинает обрабатывать список для списка или всплывающего списка. Символы, чтобы использовать показываются в следующей таблице:
Функция Списка закодирует значения
Символ | Описание |
LIST_CHANGE | Изменение отобранного содержания списка. |
LIST_APPEND | Добавляют новый вход списка. |
LIST_NEW | Удаляют старый список и создают новый список. |
Функция ads_mode_tile () управляет фокусом поля ввода и определяет, позволяется ли это. Символы и их описания показываются в следующей таблице.
Режим поля ввода кодируется значениями
Символ | Описание |
MODE_ENABLE | Позволяют поле ввода |
MODE_DISABLE | Отключают поле ввода |
MODE_SETFOCUS | Набор сосредотачивается к полю ввода |
MODE_SETSEL | Выбор содержания окна редактирования |
MODE_FLIP | Зеркальное изображение, высвечивающее вкл. или выкл. |
Имена атрибута и значения пропускают как строки; ваши программы должны разместить пространство для их. Верхний предел на строках, используемых с диалоговыми окнами определен в TILE_STR_LIMIT как 255 плюс один для нулевого признака конца, EOS).
Обработка полей ввода
Ваша программа имеет некоторый контроль над полями ввода в текущем диалоговом окне при инициализации время и действие (повторный вызов) время. Этот раздел представляет обрабатывающие поля ввода функции.
Режимы Инициализации и Значения
Инициализация поля ввода включает создание это начальный фокус клавиатуры диалогового окна, отключения или предоставления возможности это, или (если это - окно редактирования или изображение) высвечивание его содержания. Эти операции выполнены ads_mode_tile () вызывает. Вы можете также устанавливать значение поля ввода с ads_set_tile ().
Следующий код отображает значение по умолчанию, в этом случае фамилия, в окне редактирования и устанавливает поле диалога начальный фокус в то поле:
strcpy(name_str, "Nugent"); // Default name.
ads_set_tile(hdlg, "lastname", name_str);
ads_mode_tile(hdlg, "lastname", MODE_SETFOCUS);
Следующая инструкция вызывает ads_mode_tile () снова, чтобы высветить содержание окна редактирования так, чтобы пользователь мог немедленно печатать поверх заданного по умолчанию содержания:
|
Из за большого объема этот материал размещен на нескольких страницах:
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 |


