Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Visual C++/MFC/WTL > Как создать окно CWnd? |
Автор: torero 1.5.2008, 13:12 |
У меня проект документ - вид и в окне "вид" мне бы хотелось вставить ещё одно окно, чтобы оно получало сообщения от мыши, клавиатуры и меню. В теории написано, что дочерние окна фокус не получают, значит это, видимо, должно быть перекрывающееся окно. Создал новый класс CWndOk : public CWnd ................................... CWnd *pWnd = new CWnd; Теперь нужно написать оператор pWnd->Create(...pParentWnd,ID); но вот в чём проблема. Когда я раньше делал дочерние окна в Фрейме или в "виде", то вставлял Create в метод OnCreate, к которому обращается каркас приложения. Вот я и здесь добавил при помощи ClassWizarda разные методы: OnCreate, OnNCCreate,PreCreateWindow, поставил в них операторы TRACE() и оказалось, что каркас приложения вызывает только конструктор и всё. В конструкторе я поставил AfxRegisterWndClass , а где поставить оператор Create(); И ещё в Create есть параметр pParentWnd, должен он быть NULL, или ещё что-то? |
Автор: FantomaS19 1.5.2008, 15:55 |
после конструктора вид вызывает OnInitialUpdate() , его и переопределить надо В частности там можно использовать GetDocument(), а в конструкторе нельзя |
Автор: torero 3.5.2008, 17:03 |
FantomaS19, правильно ли ты меня понял? У меня для нового окна создан новый класс CWndOk производный от класса CWnd. Это не"вид" и не CView и в нём нет OnInitialUpdate. Хотя можно создать в "виде" объект CWndOk wok; и вызвать метод нового класса, например wok.Create(...); Но что-то мне кажется так не надо делать. Класс должен сам создавать окно. Возможно я ошибаюсь, уточни, пожалуйста. |
Автор: Dreamer_0x01 4.5.2008, 08:40 | ||
В таком случае OnCreate() должно работать. Но маленький момент - а вы уверены, что вашему родительскому окну посылается WM_CREATE ? Оно точно где-то создается? Показали бы код... |
Автор: torero 4.5.2008, 16:14 | ||||
CWndOk.cpp
Насчёт того что, посылается ли WM_CREATE родительскому окну- не знаю. Как и где это проверить? |
Автор: Earnest 5.5.2008, 16:30 |
Кто-нибудь должен вызвать CWndOk::Create, само оно не вызовется. Кто и где это должен делать - зависит от логики приложения. Конструктор создает всего лишь оболочку. |
Автор: torero 6.5.2008, 09:18 |
Что CWndOk::Create не вызывается само, я понимаю. Но, получается, что не вызывается вообще ни один метод. Значит я его вызову из "вида", но что мне взять в качестве родительского окна? |
Автор: Earnest 6.5.2008, 16:52 |
Естественно: нет окна - нет обработки. Сначала нужно его создать. Насчет родителя - нужно исходить из типа окна. Если окно дочернее, то указывай то окно, в котором оно расположено. А если плавающее - указывай главное окно приложения. |
Автор: torero 7.5.2008, 10:46 |
Cпасибо, понял. |