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

Вниз

Несколько окон в программе   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.073 c
2-1165940591
Фесс
2006-12-12 19:23
2006.12.31
Сортировка жесткого диска


15-1165600580
Гоблин
2006-12-08 20:56
2006.12.31
DELPHI 10


2-1165818559
Сергей Ю
2006-12-11 09:29
2006.12.31
Работа с socket-ами и sql в одном приложении=многопоточность?


2-1165594616
a1lex
2006-12-08 19:16
2006.12.31
Работа с DBGrid


15-1165939077
Cyrax
2006-12-12 18:57
2006.12.31
Как можно заюзать хидер, не пользуясь директивой #include ?