![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание модального окна [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*()
?