Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MDI -приложение на API, Почему дочернее окно всегда не активно? 
V
    Опции темы
MenSem
Дата 5.8.2008, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



del

Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:20
--------------------
PM MAIL   Вверх
Supersedes
Дата 5.8.2008, 13:01 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ты хочешь чтобы было сразу два активных окна!?? И дочернее и главное?
PM MAIL ICQ   Вверх
MenSem
Дата 5.8.2008, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



del

Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:20
--------------------
PM MAIL   Вверх
GremlinProg
Дата 5.8.2008, 15:16 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



во первых, MDI-приложение содержит по крайней мере три окна:

1. окно фрейма(главное)
2. окно клиента(рабочая область,потомок MDICLIENT, в котором и находятся все дочерние окна)
3. дочернее окно

фрейм - обычное перекрытое окошко, оно может быть любым, но вместо DefWindowProc необходимо вызывать DefFrameProc
Код

LRESULT DefFrameProc(          HWND hWnd,
    HWND hWndMDIClient,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
);

hWndMDIClient - это дескриптор клиентского окна, т.е. фрейм по крайней мере должен иметь доступ к этому дескриптору

клиент - в принципе тоже обычное, но дочернее окно, его класс обязательно либо наследуется от MDICLIENT - это стандартный класс окна, как например BUTTON или EDIT, либо вообще не субклассится, а просто создается в ответ на сообщение WM_CREATE у окна фрейма:
Код

case WM_CREATE: 
    { 
        CLIENTCREATESTRUCT ccs; 
 
        // Retrieve the handle to the window menu and assign the 
        // first child window identifier. 
 
        ccs.hWindowMenu = GetSubMenu(GetMenu(hwnd), WINDOWMENU); 
        ccs.idFirstChild = IDM_WINDOWCHILD; 
 
        // Create the MDI client window. 
 
        hwndMDIClient = CreateWindow( "MDICLIENT", (LPCTSTR) NULL, 
            WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL, 
            0, 0, 0, 0, hwnd, (HMENU) 0xCAC, hInst, (LPSTR) &ccs); 
 
        ShowWindow(hwndMDIClient, SW_SHOW); 
    } 
    break; 

клиент создается на фрейме, если его(клиента) не позиционировать и оставить все координаты в нуле(как в примере), то фрейм автоматически будет его выравнивать по всей своей клиентской области

дочернее окно - это любое дочернее окно с расширенным стилем WS_EX_MDICHILD, которое создается на клиенте
вместо DefWindowProc здесь уже необходимо вызывать DefMDIChildProc:
Код

LRESULT DefMDIChildProc(          HWND hWnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
);

список парамеров аналогичен DefWindowProc, ничего дополнительного делать не нужно

во вторых, если внимательно посмотришь в фотошоп, то заметишь, что все его панельки не дочерние (это popup-окошки)

причина, по которой дочернее окно не активируется как раз в том, что у тебя не MDI окно, а простой дочерний контрол на форме, он вообще не меняет свое состояние и не принимает сообщения WM_ACTIVATE .. WM_NCACTIVATE (как впрочем и сами MDI окна), поэтому и не раскрашивается в активные цвета.

следит за состоянием MDI дочерних окон клиент (он принимает WM_CHILDACTIVATE и определяет кто сейчас активен), которого у тебя нет, а раскрашивает DefMDIChildProc, которой, как я уже предполагаю, так же нет(нет даже стиля WS_EX_MDICHILD)

оригинал статьи тут: http://msdn.microsoft.com/en-us/library/ms644909(VS.85).aspx
в статье помимо вышеизложенного так же описаны все сообщения, которые переопределены в дополнительных процедурах, что они делают и обозначены рекомендации, если эти сообщения необходимо перекрывать еще раз.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
MenSem
Дата 5.8.2008, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



del

Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:20
--------------------
PM MAIL   Вверх
GremlinProg
Дата 5.8.2008, 23:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



WINDOWMENU - это индекс подменю в главном меню окна(фрейма), в конец этого подменю будет дописываться список всех дочерних окон. (обычно это меню именно фрейма MDI-приложения, но необязательно, можно использовать любое меню)
индекс, т.е. номер, начиная с нуля, позиции подменю, поставь 0, 1  или 2, результат сам увидишь.

если этот список тебя не интересует, выставь ccs.hWindowMenu = NULL

hwnd - да, обычно это дескриптор, передаваемый в процедуру окна(фрейма)

IDM_WINDOWCHILD - начальный идентификатор дочерних окон, при добавлении нового дочернего окна, этот индекс будет увеличиваться, впоследствии, дескриптор любого дочернего окна можно будет получить по этому индексу, передав его, например, в функцию GetDlgItem


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
MenSem
Дата 6.8.2008, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



del

Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:20
--------------------
PM MAIL   Вверх
MenSem
Дата 6.8.2008, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



del

Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:20
--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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