Как созжать окно из ресурсов?
Уважаемые товарищи-знатоки Win32 API, подскажите пожалуйста, как мне не используя функции работы с диалогами создать окно, описанное в ресурсах. В доступной мне документации я ничего подобного не нашел, но в кслассе MFC CFrameWnd есть метод, позволяющий это сделать. А как этого добиться, использую только API&
А чем тебе функции работы с диалогами не подходят?
Да мне они подходят, но задание такое: нужно использовать функции работы с окнами, а не с диалогами. Но если так, то нужно все элементы управления на главном окне расставлять вручную (т. е. высчитывать их координаты и размеры), а это очень долго и муторно.
Или ты хочешь в ресурсе создать диалог, а его контролы использовать в окне?
Не совсем так. В классе CWnd библиотеки MFC есть метод создания окна по описанию в ресурсе. Но CWnd не управляет диалоговым окном. Как-то же он может это делать! Но как?
Цитата:
On 2002-03-28 1923, artgonch wrote
Не совсем так. В классе CWnd библиотеки MFC есть метод создания окна по описанию в ресурсе. Но CWnd не управляет диалоговым окном. Как-то же он может это делать! Но как?
Не силен я в MFC Скажи метод - почитаю Библию, и скажу насчет WinAPI
И еще. Можно ли вообще создавать недиалоговые окна из ресурсов? А то я сто-то засомневался. Может у меня глюки были? Жду ответа.
нельзя
А ты считаешь, что MSDN это библия? По-моему, очень бедный источник информации.
предложи лучше!?
Win32 Online Help (тоже макрософтовский), который поставляется с Bolrnad C++. По крайней мере, у него более логичная структура и объем в десятки раз меньше.
При создании обычного, не диалогового окна оконная функция передаётся в качестве аргумента в функцию CreateWindow.
У диалогового окна, созданного функцией DialogBox или т.п., оконная функция скрыта от программиста. В качестве аргумента передаётся "диалговая" функция (DLGPROC). Соотношение между ними такое оконная функция некоторые сообщения обрабатывает сама, а некоторые передаёт диалоговой. Таким образом, внутри диалоговой функции некоторые сообщения оказываются недоступными.
Как это ограничение обойти? Существует механизм замены текущей оконной функции на новую. Он называет Subclass. Для этого необходимо написать новую оконную функцию и вызвать SetWindowLong.
Если это решение не подходит, может использовать что-нибудь экзотическое, типа при регистрации оконного класса (RegisterClass) в оконной функции, которая передаётся в качестве аргумента обрабатывать WM_CREATE и по WM_CREATE создавать диалог с помощью DialogBox или CreateDialog. (Я не уверен, что это будет работать, скорее всего - нет.)
При использовании MFC вообще нет никаких проблем (вернее, они все скрыты). См. функцию CWndExecuteDlgInit.
[EMAIL]MSheikman@mail.ru[/EMAIL]
Спасибо! Я как-то все пропускал эту функцию мимо глаз, когда просматривал справочник. Но теперь я все понял. Большое спасибо.