ObjectARX, AutoCAD. Среда программирования библиотеки C++

       

Сокрытие Диалоговых окон


Пользователь не может делать интерактивный выбор, в то время как диалоговое окно активно. Если Вы хотите, чтобы  пользователь делал выбор из графического экрана, Вы должны скрыть ваше диалоговое окно и затем восстанавливать это. Сокрытие поля - тот же самый как окончание этого с ads_done_dialog (), за исключением того, что ваша функция повторного вызова должна использовать ads_done_dialog () параметр состояния, чтобы указать, что диалоговое окно скрыто — в противоположность законченному или отменено. Состояние Набора к приложению - определенное значение.

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

Следующая типовая программа имеет кнопку, Выбирать Точку, которая скрывает диалоговое окно так, чтобы пользователь мог определить точку на графическом экране. Действие отбора этой кнопки заставляет диалоговое окно заканчиваться специальным состоянием 4:

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);

}


Содержание раздела