Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.12.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.12.23;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.008 c
3-75091
Script
2003-11-29 22:09
2003.12.23
Сортировка Paradox овской таблички


4-75459
John Smith
2003-10-22 11:05
2003.12.23
Стандартные иконки программ и документов


4-75461
volser
2003-10-29 11:07
2003.12.23
Использование SHBrowseForFolder


1-75159
R
2003-12-09 04:48
2003.12.23
Подсветка элементов текста


1-75161
Makhanev A.S.
2003-12-09 00:30
2003.12.23
Стоит ли разбивать циклы в критичных случаях?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский