Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
6-1155203525
XbI
2006-08-10 13:52
2006.12.31
сетевые странности


15-1165684351
Vovan#2
2006-12-09 20:12
2006.12.31
Делфи продолжает глючить.


1-1163360090
RASkov
2006-11-12 22:34
2006.12.31
"Всплывающее окно"


2-1166020242
dis12345
2006-12-13 17:30
2006.12.31
перебор Label ов


2-1165897474
Kvinta
2006-12-12 07:24
2006.12.31
Вернуть Field а ADO





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский