Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не главные окна


Dima_dvp ©   (2003-10-28 19:23:00) 

Уважаемые Мастера! (как бы это банально не звучало....)

Подскажите а по возможности расскажите, как создать второе окно в приложение на WinAPI. Вызывая CreateWindow моя программа виснет основательно....
Что нужно сделать во втором окне не так как в первом чтобы всё работало???


DVM   (2003-10-29 18:58:00) [1]


> И чего, спрашивается, определять ? Окно же в параметрах
> передается

Я имел ввиду в зависимости от того какое окно (hWnd), делать необходимые именно для этого окна операции. Просто так выразился.


Игорь Шевченко   (2003-10-29 15:49:00) [2]


> А могут быть и одинаковыми, тогда внутри оконной процедуры
> придется определять, для какого окна она в данный момент
> времени была вызвана.


LRESULT WindowProc(

HWND hWnd, // handle to window
UINT Msg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);

И чего, спрашивается, определять ? Окно же в параметрах передается.

Оконный класс подразумевает одинаковую обработку сообщений для оконо этого класса, потому оконная процедура является атрибутом оконного класса, если явно не переопределена для конкретного окна.


DVM   (2003-10-29 14:58:00) [3]


> При выборке я указал главное окно... А что надо указать??

0


Dima_dvp   (2003-10-29 14:52:00) [4]

Ну вроде я так и делаю.... но вот только одно НО.



while(GetMessage(msg, m_hwnd, 0, 0)) do begin
TranslateMessage(msg);
DispatchMessage(msg);
end;



При выборке я указал главное окно... А что надо указать??


Владислав   (2003-10-29 13:15:00) [5]

Удалено модератором
Примечание: Offtopic


DVM   (2003-10-29 10:44:00) [6]

А вот оконные процедуры могут быть и разными. Зависит от программы. А могут быть и одинаковыми, тогда внутри оконной процедуры придется определять, для какого окна она в данный момент времени была вызвана.


DVM   (2003-10-29 10:39:00) [7]


> И всё же не совсем мне понятно слудущее: Процедура выборки
> сообщений должна быть одна для всех окон или каждому окну
> своя(хотя подозреваю что не даром дан параметр wnd в WndProc)?

Естесственно одна. И не процедура, а цикл. Именно потому как это цикл, он и один. Когда цикл завершается программа обычно перестает работать. GetMessage и иже с ней сами перенаправят сообщения куда надо.


Игорь Шевченко   (2003-10-29 10:17:00) [8]

Код давай!


Dima_dvp   (2003-10-29 02:00:00) [9]

Я делаю так:


В главном модуле:
Создаю класс главного окна(wndProc в этом же модуле).
Создаю главное окно.

Вызываю ф-ию создания второго окна(в другом модуле):
Создаю класс второго окна(wndProc во втором модуле).
Создаю второе окно.

while(GetMessage(msg, m_hwnd, 0, 0)) do begin
TranslateMessage(msg);
DispatchMessage(msg);
end;



После этого второе окно зависает и не реагирует ни на какие действия, хотя иконка в трее(привязанна к первому окну) может и отвечать(а может и нет - когда как) на сообщения (выдаёт меню по правой кнопке)


Dima_dvp   (2003-10-29 01:04:00) [10]

И всё же не совсем мне понятно слудущее: Процедура выборки сообщений должна быть одна для всех окон или каждому окну своя(хотя подозреваю что не даром дан параметр wnd в WndProc)?


Dima_dvp   (2003-10-28 21:16:00) [11]

Спасибо.... Это наверное всё, что я хотел услышать. Теперь буду искать ошибку в ДНК.... т.е. в коде программы


DVM   (2003-10-28 21:10:00) [12]

Ничем. Обычно я делаю так:
(Если программа на API естесственно.)
В главном файле проекта *.dpr как правило создаю главное окно. Там же находится цикл выборки сообщений. У главного окна нет ни родителя ни владельца. Иногда оно невидимое.
После создания главного окна вызываю процедуры создающие остальные окна по очереди (они описаны в других модулях). У них в CreateWindowEx() в качестве родительского указано первое окно (главное) и все. Родителя в принципе можно и не указывать. Это если окна не дочерние, а сами по себе (ну не элементы управления например, и без стиля WS_CHILD)


Dima_dvp   (2003-10-28 21:03:00) [13]

Одинаковый, но не этот же. Разница только в названии и WindProc...

Скажите мне пожалуста из чистой теории чем должны отличаться главное и неглавное окно при их создании.


DVM   (2003-10-28 20:56:00) [14]


> //ТО ЖЕ САМОЕ ЧТО И В ОСНОВНОМ МОДУЛЕ, ТОЛЬКО В КАЧАСТВЕ
> РОДИТЕЛЯ ПРАМЕТР parent

у этих окон класс одинаковый что-ли?


Игорь Шевченко   (2003-10-28 20:48:00) [15]

Кода мало


Dima_dvp   (2003-10-28 19:49:00) [16]

Я не совсам понимаю необходимость кода в виду его тривиальности, но вот:



function WndProc(hwnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin

Result := DefWindowProc(hwnd, uMsg, wParam, lParam);
case uMsg of
WM_COMMAND: begin
case wParam of
MENU_PREFS_ID: DoShowPrefencesWindow(m_hwnd);
MENU_EXIT_ID: DoHalt;
end;
end;

end;

begin

with WindClassEx do begin
cbSize := sizeof(WindClassEx);
hIconSm := hMainIcon;
style := 0;
lpfnWndProc := @WndProc;
cbClsExtra := 0;
cbWndExtra := 0;
hInstance := hInstance;
hIcon := 0;
hCursor := LoadCursor(hInstance, IDC_ARROW);
hbrBackground := GetStockObject(LTGRAY_BRUSH);
lpszMenuName := nil;
lpszClassName := MAIN_WND_CLASS_NAME;
end;

if RegisterClassEx(WindClassEx) = 0 then begin
ShowErrorBox(3, m_hwnd);
DoHalt;
end;

m_hwnd := CreateWindowEx(mainWndStyleEx, MAIN_WND_CLASS_NAME, APP_NAME,
mainWndStyle, Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT),
Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), GetDesktopWindow, 0,
hInstance, nil);
if m_hwnd = 0 then begin
ShowErrorBox(4, m_hwnd);
DoHalt;
end;

end;

//**************************************************************
//ДРУГОЙ МОДУЛЬ
procedure DoShowPrefencesWindow(const Parent: HWND);
begin

//ТО ЖЕ САМОЕ ЧТО И В ОСНОВНОМ МОДУЛЕ, ТОЛЬКО В КАЧАСТВЕ РОДИТЕЛЯ ПРАМЕТР parent

end;



Вот и не понятно, в чём проблема.... Или может так вообще нельзя делать???

Да оконная процедура второго окна


function DialogProc(hDlg: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
Result := DefWindowProc(hwnd, uMsg, wParam, lParam);
end;


Владислав   (2003-10-28 19:25:00) [17]

Код в студию.


Наверх

Титульная страница Поиск, карта сайта Написать письмо