Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.23;
Скачать: CL | DM;

Вниз

Создание модального окна   Найти похожие ветки 

 
Andery   (2004-04-05 13:39) [0]

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

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 13:42) [1]

CreateDialog*()
?


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

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

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


 
VMcL ©   (2004-04-05 20:13) [3]

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

Да. Ошибся.



Страницы: 1 вся ветка

Текущий архив: 2004.05.23;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.024 c
3-1082963120
_Alanjuk
2004-04-26 11:05
2004.05.23
TQuery


3-1083135955
Dina
2004-04-28 11:05
2004.05.23
существование поля в таблице INTERBASE ?


7-1082103065
Ruslan
2004-04-16 12:11
2004.05.23
Как отследить изменение в конфигурации компьютера?


6-1081166378
Makhanev A.S.
2004-04-05 15:59
2004.05.23
Sockets: ESysError, code=5; AV...


3-1083253108
Mister
2004-04-29 19:38
2004.05.23
обработка False