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

Вниз

Не главные окна   Найти похожие ветки 

 
Dima_dvp ©   (2003-10-28 19:23) [0]

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

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


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

Код в студию.


 
Dima_dvp ©   (2003-10-28 19:49) [2]

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



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 20:48) [3]

Кода мало


 
DVM ©   (2003-10-28 20:56) [4]


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

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


 
Dima_dvp ©   (2003-10-28 21:03) [5]

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

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


 
DVM ©   (2003-10-28 21:10) [6]

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


 
Dima_dvp ©   (2003-10-28 21:16) [7]

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


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

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


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

Я делаю так:


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

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

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



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


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

Код давай!


 
DVM ©   (2003-10-29 10:39) [11]


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

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


 
DVM ©   (2003-10-29 10:44) [12]

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


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

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


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

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



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



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


 
DVM ©   (2003-10-29 14:58) [15]


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

0


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


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


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 18:58) [17]


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

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



Страницы: 1 вся ветка

Текущий архив: 2003.12.23;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.021 c
14-75372
MMMaloy
2003-11-28 22:32
2003.12.23
набор картинок к кнопкам


1-75250
Serg777
2003-12-10 13:44
2003.12.23
Вывод на матричный принтер


1-75199
denmin
2003-12-11 10:36
2003.12.23
Как вывести Memo в QuickRep?


6-75301
XeON
2003-10-25 18:42
2003.12.23
Приём файлов через Socket


14-75401
Данёк
2003-11-27 10:55
2003.12.23
Мой сайток