Форум: "Начинающим";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];
ВнизНесколько окон в программе Найти похожие ветки
← →
Dmitry_177 (2006-12-12 20:30) [0]В програме есть главное окно, но нужно еще одно окно создать для изменения настроек.. CreateDialog меня смутил тем что оно хранится в ресурсах.. Хотел бы сам создавать еще одно окно.. Т.е. использовать CreateWindow, но меня тут у меня несколько вопросов:
1. Нужно еще одну структуру TWndClass заполнять?
2. В функции CreateWindow нужно ли передавать окно владельца, т.е. главное окно программы?
3. Как будет работать функция-процедура этого окна, будут ли доходить сообщения до него или нужно еще один цикл организовывать?
← →
Eraser © (2006-12-12 21:03) [1]> [0] Dmitry_177 (12.12.06 20:30)
> 1. Нужно еще одну структуру TWndClass заполнять?
скорее всего да.
> 2. В функции CreateWindow нужно ли передавать окно владельца,
> т.е. главное окно программы?
смотря какое поведение программы требуется, можно и так и эдак.
> 3. Как будет работать функция-процедура этого окна
точно так как и для главного окна.
> будут ли доходить сообщения до него или нужно еще один цикл
> организовывать?
нет, если окно создается в том же потоке, что и главное, то доп. цикл не нужен.
← →
Dmitry_177 (2006-12-12 21:41) [2]Попробовал сделать что-то наподобии, окно не появляется...
В обработке WM_LBUTTONUP процедуре кнопки:
const
AlarmName = "Alarm";
var
AlarmClass: TWndClass;
hAlarm: HWND;
begin
...
WM_LBUTTONUP: begin
with AlarmClass do
begin
lpszClassName := AlarmName;
lpfnWndProc := @AlarmProc;
cbClsExtra := 0;
cbWndExtra := 0;
hInstance := 0;
hIcon := LoadIcon(0, idi_Application);
hCursor := LoadCursor(0, idc_Arrow);
hbrBackground := COLOR_WINDOW;
end;
if RegisterClass(AlarmClass) = 0 then Exit;
hAlarm := CreateWindow(AlarmName, "Будильник", WS_OVERLAPPED, cw_UseDefault, cw_UseDefault, 400, 200, hWindow, 0, HInstance, nil);
ShowWindow(hAlarm, SW_SHOWNORMAL);
UpdateWindow(hAlarm);
end;
end;
...
Процедура нового окна:
function AlarmProc(Window: HWND; Message: Cardinal; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
Result := DefWindowProc(Window, Message, wParam, lParam);
end;
Пока еще ничего не обрабатывает..
← →
Чапаев © (2006-12-12 22:24) [3]> В обработке WM_LBUTTONUP процедуре кнопки
Сам обработчик выполняется?
← →
Dmitry_177 (2006-12-12 22:30) [4]
> Сам обработчик выполняется?
В смысле доходит ли вообще WM_LBUTTONUP и обрабатывается ли он? Да все доходит и работает...
← →
Чапаев © (2006-12-12 22:52) [5]> WS_OVERLAPPED
Гм. А если WS_OVERLAPPED or WS_VISIBLE? :-D
← →
Dmitry_177 (2006-12-12 23:25) [6]Блин!!! Понял что не так:
const
AlarmName = "Alarm";
var
AlarmClass: TWndClass;
hAlarm: HWND;
это все было объявлено в процедуре кнопки, которая и обрабатывает WM_LBUTTONUP... Перенес их в глобальные переменные и все заработало...
← →
Dmitry_177 (2006-12-12 23:43) [7]У меня возник еще один вопрос, как мне правильно удалять эту втурую форму по ее закрытию? WM_DESTROY скорей всего надо как-то обрабатывать.. Не напишешь же там PostQuitMessage(0); как в главной форме...
А еще если вторую форму открыть таким образом(нажатием на кнопку), потом закрыть, потом еще раз открыть оно уже не появляется...
← →
Eraser © (2006-12-13 01:12) [8]> [7] Dmitry_177 (12.12.06 23:43)
WM_CLOSE надо обрабатывать.
> PostQuitMessage(0);
это убъет весь поток!
ты MSDN и справку будешь читать или нет? :) хотя бы того же Рихтрера почитай. наверное сложно же наугад программировать? ))
← →
Германн © (2006-12-13 01:50) [9]
> Eraser © (13.12.06 01:12) [8]
>
> > [7] Dmitry_177 (12.12.06 23:43)
...
>
наверное сложно же наугад программировать?
> ))
А чё тут сложного? Есть же форум "Мастаки Дельфи"! :)
А И-нет нынче у многих немерянный.
← →
Dmitry_177 (2006-12-13 02:03) [10]Я искал в интернете информацию по этому поводу... Не нашел.. Думал то что тут помогут..
← →
Eraser © (2006-12-13 02:09) [11]> [10] Dmitry_177 (13.12.06 02:03)
не там искал, в первую очередь, искать инфу надо в книгах.
← →
Dmitry_177 (2006-12-13 02:25) [12]Смотрел я в Рихтере, там про окна только про цикл и про сообщения.. В msdn тоже, нашел как одно окно создавать, а вот как второе и как потом его правильно удалить ненашел..
← →
Джо © (2006-12-13 03:37) [13]>
>
> [12] Dmitry_177 (13.12.06 02:25)
> Смотрел я в Рихтере, там про окна только про цикл и про
> сообщения..
Забудь. Вероятно, это не для тебя...
← →
Dmitry_177 (2006-12-13 12:30) [14]В обработке WM_CLOSE вызвать DestroyWindow?
← →
Eraser © (2006-12-13 18:20) [15]> В обработке WM_CLOSE вызвать DestroyWindow?
конечно.
ну ёкарный бабай )) VCL жешь с исходниками идет :)
не сложно заметить, что сообщение WM_CLOSE, для обычного окна, в конечно счете приведет к вызовуprocedure TWinControl.DestroyWindowHandle;
begin
Include(FControlState, csDestroyingHandle);
try
if not Windows.DestroyWindow(FHandle) then
RaiseLastOSError;
finally
Exclude(FControlState, csDestroyingHandle);
end;
FHandle := 0;
end;
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.04 c