Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MDI приложение, HWND child'a 
V
    Опции темы
vinter
Дата 17.8.2006, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Создал каркас обычным визардом, там есть такая ф-ия создания дочерних окон:
Код

CMainFrame* pFrame = STATIC_DOWNCAST(CMainFrame, m_pMainWnd);
    // create a new MDI child window
    pFrame->CreateNewChild(
        RUNTIME_CLASS(CChildFrame), IDR_graphTYPE, m_hMDIMenu, m_hMDIAccel);

Вопрос как мне получить HWND нового child'a smile 


--------------------
Мой блог
PM MAIL WWW   Вверх
Earnest
Дата 17.8.2006, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Так CreateNewChild его тебе и вернет, т.е. возвращается CMDIChildWnd*, но у окна получить дескриптор просто: m_hWnd.


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


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



т.е
Код

CMDIChildWnd *pChild;
pChild =  pFrame->CreateNewChild(    
        RUNTIME_CLASS(CChildFrame), IDR_graphTYPE, m_hMDIMenu, m_hMDIAccel);
HWND hWnd;
hWnd = pChild->GetSafeHwnd();

я правильно понял?
И еще у меня появился вопрос в MDI при создании дочерних окон появляется меню Window и с ним можно работать, но когда удалть все дочерние окна, а потом снова начать их создавать то Window становится неактивным..Кто нибудь может сталкивлся с этим??


--------------------
Мой блог
PM MAIL WWW   Вверх
Earnest
Дата 18.8.2006, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(vinter @  17.8.2006,  19:28 Найти цитируемый пост)
я правильно понял?

Можно и так. Но вообще-то стоит знать, что член m_hWnd является открытым, и есть еще оператор преобразования, к-й возвращает HWND. Т.е. можно писать еще так:
Код

HWND hWnd = pChild->m_hWnd;
или так:
Код

HWND hWnd = *pChild;

Со вторым - не сталкивалась.



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


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



спасибо 


--------------------
Мой блог
PM MAIL WWW   Вверх
vinter
Дата 18.8.2006, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Еще такая проблема, ставлю в PreCreateWindow() cs.lpszName = "Лошадь";, ноль эмоций, ставит имя которое у него в ресурсах...
Подскажите как исправить...


--------------------
Мой блог
PM MAIL WWW   Вверх
Earnest
Дата 18.8.2006, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Поправь имя в ресурсах. Долго объяснять, но сначала ставиться твое "лошадь", а потом фрейморк меняет его на имя из ресурсов. Посмотреть можно код функции UpdateFrameTitle (вроде так) и вокруг.


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


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата

Поправь имя в ресурсах

так то понятно но я хочу ,чтобы при создании нового окна у него было уникальное имя, а не у всех одинаковое.. smile 
Цитата

 а потом фрейморк меняет его на имя из ресурсов

Это можно обойти/заблочить??

Это сообщение отредактировал(а) vinter - 18.8.2006, 18:08


--------------------
Мой блог
PM MAIL WWW   Вверх
Earnest
Дата 21.8.2006, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Можно, если пороешься в исходных текстах MFC: там много всяких виртуальных ручек.
Но сначала подумай, может стандартными средствами обойдешься. Обычно, имя окна == имя документа + некоторый стандартный текст. Тебя не устраивает имя документа? Тогда ищи функцию CFrameWnd::OnUpdateFrameTitle и смотри от нее, что можно изменить.


--------------------
...
PM   Вверх
vinter
Дата 21.8.2006, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Спасибо за подсказку!


--------------------
Мой блог
PM MAIL WWW   Вверх
vinter
Дата 24.8.2006, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



появился новый вопрос..
при создании дочернего окна,  его клентская часть создается так:
Код

int CChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
    // create a view to occupy the client area of the frame
    if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, 
        CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
    {
        TRACE0("Failed to create view window\n");
        return -1;
    }
    return 0;
}

m_wndView обьект класса CChildView обьявленный в CСhildFrame...
Фрейм создается вот так
Код

void CMainFrame::OnFileNew() 
{
    // create a new MDI child window
    pChildFrm = new CChildFrame;
    if(!pChildFrm->Create(NULL, NULL))
    return;
    pChildFrm->ShowWindow(SW_SHOWMAXIMIZED);
}

теперь вопрос как мне в функции класса CMainFrame получит hWnd, этого окна??




--------------------
Мой блог
PM MAIL WWW   Вверх
Earnest
Дата 25.8.2006, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Какого окна? ChildFrm? Имеешь в виду, в других функциях?
Ну, например, есть функция CMDIFrameWnd::MDIGetActive().


--------------------
...
PM   Вверх
vinter
Дата 25.8.2006, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Earnest огромное тебе спасибо, с этим хоть разобрался..
Появился еще один вопрос, есть такая ф-ия
Код

void CMainFrame::OnToolBar(UINT nID)
{
    pChildWnd = MDIGetActive();
    m_nIndex = nID - ID_BUTTON_PEN;
    for(int i = ID_BUTTON_PEN; i <= ID_BUTTON_ERASE; i++)
        m_ToolBar.GetToolBarCtrl().CheckButton(i, FALSE);
    ::SetClassLong(pChildWnd->GetSafeHwnd(), GCL_HCURSOR, LONG(AfxGetApp()->LoadCursor(aCursors[m_nIndex])));
    BOOL bCheck = m_ToolBar.GetToolBarCtrl().IsButtonChecked(nID);
    m_ToolBar.GetToolBarCtrl().CheckButton(nID, !bCheck);
}

все вроде правильно, а курсор не меняет..Почему такое может происходитьsmile 


--------------------
Мой блог
PM MAIL WWW   Вверх
Earnest
Дата 25.8.2006, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Я не уверена, что изменение курсора в классе окна как-то влияет на уже созданное окно...
Что ты вообще хочешь сделать? Менять курсор в зависимости от нажатой кнопки?
Так это делается по-другому:
1) все возможные курсоры загрузи заранее
2) заведи переменную HCURSOR (или индекс текущего курсора) и присваивай ее на OnToolBar
3) обрабатывай в окне OnSetCursor (ставь свой курсор, в смысле SetCursor)


Это сообщение отредактировал(а) Earnest - 25.8.2006, 18:08


--------------------
...
PM   Вверх
vinter
Дата 25.8.2006, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата

Я не уверена, что изменение курсора в классе окна как-то влияет на уже созданное окно...

100% влияет..
Вот только у меня два новых вопроса появилось, я понял почему не меняется курсор, так как я меняю его не в клиентской части окна.
Вопрос как получит hWnd клиентской части.
И второй вопрос при изменении курсора фрейма ,изменится ли он при выведении курсора в область фрейма.
Спасибо за внимание.


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


 




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


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

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