Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как создать окно CWnd? 
:(
    Опции темы
torero
Дата 1.5.2008, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 177
Регистрация: 1.2.2006

Репутация: нет
Всего: нет



 У меня проект документ - вид и в окне "вид" мне бы хотелось вставить ещё одно окно, чтобы оно 
получало сообщения от мыши, клавиатуры и меню. В теории написано, что дочерние окна фокус не 
получают, значит это, видимо,  должно быть перекрывающееся окно.  Создал новый класс
CWndOk : public CWnd
...................................
CWnd *pWnd = new CWnd;
Теперь нужно написать оператор pWnd->Create(...pParentWnd,ID); но вот в чём проблема.
Когда я раньше делал дочерние окна в Фрейме или в "виде", то вставлял Create в метод OnCreate,
к которому обращается каркас приложения. Вот я и здесь добавил при помощи ClassWizarda разные
методы: OnCreate, OnNCCreate,PreCreateWindow, поставил в них операторы TRACE() и оказалось, что
каркас приложения вызывает только конструктор и всё. В конструкторе я поставил AfxRegisterWndClass
, а где поставить оператор Create(); И ещё в Create есть параметр pParentWnd, должен он быть NULL,
или ещё что-то?
PM MAIL   Вверх
FantomaS19
Дата 1.5.2008, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 28.7.2007

Репутация: нет
Всего: нет



после конструктора вид вызывает OnInitialUpdate() , его и переопределить надо
В частности там можно использовать GetDocument(), а в конструкторе нельзя
PM MAIL   Вверх
torero
Дата 3.5.2008, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 177
Регистрация: 1.2.2006

Репутация: нет
Всего: нет



FantomaS19, правильно ли ты меня понял?
У меня для нового окна создан новый класс CWndOk производный от класса CWnd. Это не"вид" и не CView  и в нём нет OnInitialUpdate. Хотя можно создать в "виде" объект CWndOk wok; и вызвать метод
нового класса, например wok.Create(...); Но что-то мне кажется так не надо делать. Класс должен сам
создавать окно. Возможно я ошибаюсь,  уточни, пожалуйста.  
PM MAIL   Вверх
Dreamer_0x01
Дата 4.5.2008, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Цитата

оздан новый класс CWndOk производный от класса CWnd


В таком случае OnCreate() должно работать.
Но маленький момент - а вы уверены, что вашему родительскому окну посылается WM_CREATE ? Оно точно где-то создается?

Показали бы код...


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
torero
Дата 4.5.2008, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 177
Регистрация: 1.2.2006

Репутация: нет
Всего: нет



 
Код

  В СWndOk.h добавляю только CString и методы OnCreate, PreCreateWindow и Create
   class CWndOk : public CWnd
   {
   // Construction
   public:
    CWndOk();
// Operations
public:
  CString StrMyClass;

     CWndOk.cpp
Код

#include "stdafx.h"
#include "Okna.h"
#include "WndOk.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CWndOk

BEGIN_MESSAGE_MAP(CWndOk, CWnd)
    //{{AFX_MSG_MAP(CWndOk)
    ON_WM_CREATE()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

CWndOk::CWndOk()
{
   TRACE("Конструктор");
   StrMyClass = AfxRegisterWndClass(
      CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW,
      ::LoadCursor(NULL, IDC_ARROW),
      (HBRUSH) ::GetStockObject(WHITE_BRUSH),
      ::LoadIcon(NULL, IDI_APPLICATION));
}

int CWndOk::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if (CWnd::OnCreate(lpCreateStruct) == -1)
    { TRACE("OnCreate-FALSE");return -1; }TRACE("OnCreate-TRUE");
    return 0;
}

BOOL CWndOk::PreCreateWindow(CREATESTRUCT& cs) 
{
   cs.style = WS_VISIBLE | WS_BORDER;
   TRACE("PreCreateWindow");
    return CWnd::PreCreateWindow(cs);
}

BOOL CWndOk::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
  TRACE("Wnd-Create ");    
    return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}

Насчёт того что, посылается ли WM_CREATE родительскому окну- не знаю. Как и где это проверить?

PM MAIL   Вверх
Earnest
Дата 5.5.2008, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Кто-нибудь должен вызвать CWndOk::Create, само оно не вызовется. Кто и где это должен делать - зависит от логики приложения. Конструктор создает всего лишь оболочку.


--------------------
...
PM   Вверх
torero
Дата 6.5.2008, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 177
Регистрация: 1.2.2006

Репутация: нет
Всего: нет



   Что CWndOk::Create не вызывается само, я понимаю. Но, получается, что не вызывается вообще ни
один метод. Значит я его вызову из "вида", но что мне взять в качестве родительского окна? 
PM MAIL   Вверх
Earnest
Дата 6.5.2008, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(torero @  6.5.2008,  10:18 Найти цитируемый пост)
Но, получается, что не вызывается вообще ни
один метод.

Естественно: нет окна - нет обработки. Сначала нужно его создать.
Насчет родителя - нужно исходить из типа окна. Если окно дочернее, то указывай то окно, в котором оно расположено. А если плавающее - указывай главное окно приложения.


--------------------
...
PM   Вверх
torero
Дата 7.5.2008, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 177
Регистрация: 1.2.2006

Репутация: нет
Всего: нет



   Cпасибо, понял.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0888 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.