Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать окно, модальное ко всему. Получается только к главному окну. 
:(
    Опции темы
Dreamer_0x01
Дата 24.6.2005, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Простенькая проблема.

Имеются три окна, производные от CDialog:

W_main,W_Ch и Wm.

Все имеют стиль POPUP.

W_main - главное окно приложения.
W_Ch - окно, открываемое в W_main, в качестве указателя на родителя в функцию Create и конструктор передается указатель на W_main.

Wm - окно, открываемое как модальное из окна W_main.
Но открывается оно как модальное только по отношению к главному окну, то есть доступ к окну W_Ch не блокируется. А хотелось бы, чтобы окно было модальным не только по отношению к главному окну приложения, а ко всем окнам приложения.

Флаги TASKMODAL, SYSTEMMODAL не помогают, либо я их неправильно использую.

Как сделать?




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


Бывалый
*


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

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



Dreamer_0x01 напиши как ты создаешь диалоги, и как вызываешь...

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


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


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

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



1. Класс W_main создается визардом (приложение, основанное на диалоговом окне). Это и есть главное окно.
2. Класс W_ch и W_m создаю через редактор ресурсов. То есть добавляю простейший диалог, практически ничего в нем не меняю, все оставляю по умолчанию, создаю визардом классы, производные от CDialog.

получился следующий код классов:
Код

#include "W_m.h"
#include "W_ch.h"
class W_main : public CDialog
{
public:
    W_main(CWnd* pParent = NULL);    
    enum { IDD = IDD_SUPMODAL_DIALOG };
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    
protected:
    HICON m_hIcon;
    virtual BOOL OnInitDialog();
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()
private:
    W_ch *wch;
    W_m *wm;
public:
    afx_msg void OnBnClickedButtonDm();
};


Код

class W_ch : public CDialog
{
    DECLARE_DYNAMIC(W_ch)
public:
    W_ch(CWnd* pParent = NULL);   
    virtual ~W_ch();
    enum { IDD = IDD_DIALOG_CH };
protected:
    virtual void DoDataExchange(CDataExchange* pDX);    
    DECLARE_MESSAGE_MAP()
};

Код

class W_m : public CDialog
{
    DECLARE_DYNAMIC(W_m)
public:
    W_m(CWnd* pParent = NULL);   
    virtual ~W_m();
    enum { IDD = IDD_DIALOG_M };
protected:
    virtual void DoDataExchange(CDataExchange* pDX);   
    DECLARE_MESSAGE_MAP()
};


Ну и далее создаю их так:
Код

BOOL W_main::OnInitDialog()
{
    CDialog::OnInitDialog();
    SetIcon(m_hIcon, TRUE);        
    SetIcon(m_hIcon, FALSE);        

    wch=new W_ch(this);
    wch->Create(W_ch::IDD,this);
    wch->ShowWindow(SW_SHOW);

    wm=new W_m(this);//далее по ходу программы вызывается wm->DoModal(); 

    return TRUE;  
}



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


Бывалый
*


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

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



Функция Create не создает модальных окон для диалога.
Код

   W_ch wchdlg;

  if(wchdlg.DoModal() == IDOK) MessageBox("Button OK cliced");
- Просто сделай DoModal()
PM MAIL   Вверх
JoyEx
Дата 24.6.2005, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

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



Не модал, но может Вам подойдёт:
Код

// Установка стиля WS_EX_TOPMOST:
SetWindowPos (&CWnd::wndTopMost , 0,0,0,0,SWP_NOSIZE | SWP_NOMOVE);



--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Earnest
Дата 24.6.2005, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Если помотреть реализацию MFC CDialog::DoModal, можно увидеть, что недоступность parent-окна диалога достигается просто и незамысловато -

Код

::EnableWindow(hWndParent, FALSE);


Далее. Видимо, ваше главное окно-диалог не дизэблит всех своих потомков, наверное, в диалоге это не предусмотрено. Ну так добавьте сами обработку WM_ENABLE в главном диалоге.


--------------------
...
PM   Вверх
Dreamer_0x01
Дата 26.6.2005, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



oper54

вы меня не правильно поняли.

Мне окно wch и не нужно делать модальным. Мне нужно модальным делать оно w_m, при этом чтобы не было доступа ни в какое другое окно приложения.




Earnest
Цитата

Далее. Видимо, ваше главное окно-диалог не дизэблит всех своих потомков, наверное, в диалоге это не предусмотрено. Ну так добавьте сами обработку WM_ENABLE в главном диалоге.

Сейчас именно так и делаю, но нельзя ли сразу окно как-то "совсем модальным" сделать, чтобы вручную все дочерние окна не тормошить?


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Любитель
Дата 26.6.2005, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



По-видимому, нет. Так как W_m не воспринимает W_ch как родителя.


--------------------
PM MAIL ICQ Skype   Вверх
Гость_Амортизатор
Дата 27.6.2005, 01:12 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Скорее всего это невозможно. Дочернее окно вызывается из родительского окна и наверное только по отношению к нему и может быть модальным.
  Вверх
Earnest
Дата 27.6.2005, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Dreamer_0x01 @ 26.6.2005, 15:02)
нельзя ли сразу окно как-то "совсем модальным" сделать, чтобы вручную все дочерние окна не тормошить?

Собственно, я имела в виду не тормошить каждое дочернее окно, а написать обработчик WM_ENABLE в главном диалоге, откуда разослать всем дочерним окнам соответствующее сообщение - примерно, как это делает CFrameWnd в своем обработчике OnEnable:

Код

    HWND hWnd = ::GetWindow(::GetDesktopWindow(), GW_CHILD);
    while (hWnd != NULL)
    {
        if (AfxIsDescendant(pParent->m_hWnd, hWnd))
            ::SendMessage(hWnd, WM_FLOATSTATUS, dwFlags, 0);
        hWnd = ::GetWindow(hWnd, GW_HWNDNEXT);
    }


Это часть кода функции CFrameWnd::NotifyFloatingWindows. Отсюда можно взять способ получения всех порожденных окон и послать им WM_ENABLE.
А сделать окно "совсем модальным" только с помощью флагов, боюсь, действительно не получится.


--------------------
...
PM   Вверх
Dreamer_0x01
Дата 27.6.2005, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Спасибо, попробую так.


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


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


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

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



Кстати. Отличнаямысль ловить WM_ENABLE !
Всего одна функция:

void W_main::OnEnable(BOOL bEnable)
{
CDialog::OnEnable(bEnable);
wch->EnableWindow(bEnable);
}

И все как надо работает!
Всем спасибо.


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


 




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


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

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