Форум: "WinAPI";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
ВнизСоздание модального окна Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.036 c