Форум: "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.016 c