на главную предыдущая страница следующая страница

Диалоги

Менеджер диалогов поддерживает так называемые Модальные Диалоги (Modal Dialog). Модальный диалог представляет собой окно, запрещающее пользователю взаимодействовать с любым объектом FAR Manager вне данного диалога. Модальный диалог отсекает поток сообщений, идущих от мыши или клавиатуры к другим объектам FAR Manager.

Начинаем - инициализация структуры FarDialogItems

{
int Type;    
int X1;
int Y1;
int X2;
int Y2;
int Focus;
int DefaultButton; 
const wchar_t *Head;
DWORD Flags;   
const wchar_t *Data;
}

Пример использования

FarDialogItem InitItems []=
{
{DI_DOUBLEBOX, 0, 0, 39,8,0,0,0,0,0},
{DI_BUTTON, 20, 6, 20, 7, 0, 0, 0,0, L"OK"},
{DI_BUTTON, 27, 6, 31, 7, DIF_CENTERGROUP, 0, 0, 1, L"Cancel"},
{DI_TEXT,2, 1, 28, 2, 0, 0,L"text", DIF_LEFTTEXT,L"Enter name of file for"},
{DI_TEXT,2, 2, 28, 3, 0, 0,L"target", DIF_LEFTTEXT,L"Export"},
{DI_EDIT, 2, 4, 37, 4, 0, 0,L"nameFile", DIF_HISTORY | DIF_SELECTONENTRY, L"name_file.txt"}
};


Чтобы запустить, инициализируем

HANDLE WINAPI DialogInit(
    INT_PTR PluginNumber,
	INT_PTR DialogNumber,
    int X1,
    int Y1,
    int X2,
    int Y2,
    const wchar_t *HelpTopic,
    struct FarDialogItem *Item,
    unsigned int ItemsNumber,
    DWORD Reserved,
    DWORD Flags,
    FARWINDOWPROC DlgProc,
    LONG_PTR Param
);
X1, Y1, X2, Y2
Геометрия диалога. Задайте эти координаты непосредственно или воспользуйтесь формулой "Width x Height" - для этого установите X1 и Y1 в -1, при этом X2 - ширина и Y2 - высота диалога. В последнем случае при выводе на экран диалог будет автоматически центрироваться. Параметры X2 и Y2 не могут быть меньше нуля.
DlgProc
Указатель на функцию-обработчик диалогового окна типа FARWINDOWPROC

Пример:

HANDLE hDlg = Info.DialogInit(&MainGuid, &DialogGuid, -1, -1, 40, 9, L"Contents", InitItems, ARRAYSIZE(InitItems), 0, 0, ShowDialogProc, (void *)DlgData);

Подробно про инициализацию Но не забываем про неточности в энциклопедии

После этого запуск выглядит элементарно:

int ExitCode = Info.DialogRun(hDlg);

Можно вызывать неоднократно.

Заканчиваем работу с диалогом:

Info.DialogFree(hDlg);

 

Типичная задача:

Получить от пользователя введенную строку

  1. wchar_t buff[ FAR_MAX_DLGITEM ];
  2. //выделяем память под buff
  3. memset(buff,0,sizeof(buff);
  4. FarDialogItemData dd = { sizeof(buff)-1,buff };
  5. buff[ Info.SendDlgMessage(hDlg,DM_GETTEXT,5,&dd)] = 0;

Теперь в buff - текст(заголовок или введенный текст для DI_EDIT) из 5-го элемента диалога hDlg. DM_GETTEXT