Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание модального окна [D7, Win95/98, WinXP]


Andery ©   (2004-04-05 13:39:00) 

Здравствуйте!
Мне нужно создать диалоговое модальное окно, которое спросит что-то там у польователя и потом функция, с помощью которой вызвали это окно вернет то, что ответи пользователь.
Вот у меня такой код:

unit InputBox;

interface

uses
 Windows, Messages;

function ShowInputDlg(const Wnd: HWnd; const Title, Prompt: String): String;

implementation

var
 WC: PWndClassEx;
 Res: Integer;

const
 DLG_CLASS = 'INPUTDLG_FORM';

function WndProc(Wnd: HWnd; Msg: Cardinal; wParam, lParam: LongInt): LongInt; stdcall;
begin
 Result := 0;
 case Msg of
   WM_DESTROY, WM_CLOSE: Res := 1;
   else Result := DefWindowProc(Wnd, Msg, wParam, lParam);
 end
end;

function CreateClass: Boolean;
begin
 WC := New(PWndClassEx);
 WC^.cbSize := SizeOf(TWndClassEx);
 WC^.Style := CS_DBLCLKS or CS_SAVEBITS or CS_BYTEALIGNWINDOW;
 WC^.lpfnWndProc := @WndProc;
 WC^.cbClsExtra := 0;
 WC^.cbWndExtra := 0;
 WC^.hInstance := HInstance;
 WC^.hIcon := 0;
 WC^.hCursor := LoadCursor(0, IDC_ARROW);
 WC^.hbrBackground := COLOR_BTNFACE + 1;
 WC^.lpszMenuName := nil;
 WC^.lpszClassName := DLG_CLASS;
 WC^.hIconSm := 0;
 Result := RegisterClassEx(WC^) <> 0;
 Dispose(WC)
end;

function ShowInputDlg(const Wnd: HWnd; const Title, Prompt: String): String;
var
 InputDlg: HWnd;
 Msg: TMsg;
const
 FWidth = 244;
 FHeight = 88;
begin
 Res := 0;
 if not CreateClass then Exit;
 InputDlg := CreateWindowEx(WS_EX_DLGMODALFRAME or WS_EX_WINDOWEDGE,
   DLG_CLASS, PChar(ACaption),
   WS_POPUP or WS_CAPTION or WS_OVERLAPPED or WS_SYSMENU or WS_VISIBLE,
   (GetSystemMetrics(SM_CXSCREEN) - FWidth) div 2,
   (GetSystemMetrics(SM_CYSCREEN) - FHeight) div 2,
   FWidth, FHeight, Wnd, 0, HInstance, nil);

 // Тут дожидаемся, пока окно открыто. Так будет правильно?
 repeat
   GetMessage(Msg, 0, 0, 0);
   TranslateMessage(Msg);
   DispatchMessage(Msg)
 until Res <> 0;

 DestroyWindow(InputDlg);
 UnregisterClass(DLG_CLASS, HInstance);
end;

end.


Как сделать окно модальным, т.е. чтобы первое окно, открывшее это, было недоступным. И как правильно сделать, чтобы функция дождалась закрытия окна?
И все ли я тут правильно сделал?
Заранее спасибо.


VMcL   (2004-04-05 20:13:00) [1]

>>>Suntechnic ©  (05.04.04 18:56) [2]

Да. Ошибся.


Suntechnic   (2004-04-05 18:56:00) [2]

>VMcL ©
CreateDialog создает немодальное окно.

>Andery
Обычно так не создают диалоговые окна на Win API. Для этих целей, как правило, используют шаблоны из ресурсов.
Чтобы создать модальное окно по шаблону из ресурса используют DialogBox


VMcL   (2004-04-05 13:42:00) [3]

CreateDialog*()
?


Наверх

Титульная страница Поиск, карта сайта Написать письмо