Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Немодальное окно 
:(
    Опции темы
Xedin
Дата 19.4.2007, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня есть диалоговое приложение. Из него по нажатию кнопки вызывается немодальный диалог:
Код

                    void CProgaDlg::OnBnClickedButton8()
{    
                     static CMyDlg dlg;    
                     dlg.DestroyWindow();
    dlg.Create(IDD_DIALOG1,this);    
    dlg.ShowWindow(SW_SHOW);
    UpdateWindow();
}


Всё открывается всё отлично но если я жмякаю по родительскому....оно отображается под созданным...как зделать чтоб оно вылазило на первый план??


PM MAIL   Вверх
dizzy1984
Дата 19.4.2007, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



У немодального диалога может стоять WS_EX_TOPMOST, которое заставляет его быть верхним для окон без этого флага. Это ты можешь проверить с помощью spy++.

PM MAIL   Вверх
Xedin
Дата 20.4.2007, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Отлично классно...как же я не догадался...осталось тока выяснить что такое spy++...
Насчёт флага....там такой не стоит вообще ни где...
PM MAIL   Вверх
dizzy1984
Дата 20.4.2007, 05:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



tools->spy++
Если ты этот флаг не ставил руками, скорее всего его не будет.
Прикрепи исходники программы и скажи на чем она была написана.
PM MAIL   Вверх
Xedin
Дата 20.4.2007, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Написана на Visual C++ 6.0.
На основе обычного диалогового приложения с использованием MFC.
Создали понатыркали кнопок эдитов и т.д.
И вот мне нужно чтоб по нажатию на одну из кнопок вызывалось немодальное диалоговое окно.
Как это будет происходить мне по любому...я делал это как показано в примере выше....просто мне нужно чтобы я мог переходить с главного окна на дочернее и обратно....и чтоб они не перекрывали друг друга...а у меня получается что переходить могу, но главное под дочерним и надо его вытаскивать. Флагов в ручную ни каких не ставил.
PM MAIL   Вверх
dizzy1984
Дата 20.4.2007, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вобщем интересный вопрос получился.
Ваша проблема в том, что MFC создает немодальное окно как потомок основного окна программы. Когда происходит отрисовка основного окна оно отрисовывает и все дочерние, а, т.к, у вас дочернее немодальное окно может частично перекрывать основное, то получается что оно как бы на заднем плане, хоть и активно. В MFC нет способа сделать так как вы хотите. Нужно расширить функционал класса CDialog и заставить по-другому работать метод Create, в частности чтобы он не тревожился по поводу отсутствия окна-родителя для создаваемого немодального окна. Вот такая реализация метода CreateNoParent сделает "безродное" немодальное окно, что вам и нужно. Добавьте этот прототип и определение к классу отнаследованному от CDialog и наследуйте от него все ваши классы немодальных окон, либо, если у вас только 1-н такой класс, добавьть прототип и определение непосредственно к нему.

Код

BOOL CNoParentDlg::CreateNoParent(UINT nIDTemplate)
{
    LPCTSTR lpszTemplateName = MAKEINTRESOURCE(nIDTemplate);
    ASSERT(HIWORD(lpszTemplateName) == 0 ||
    AfxIsValidString(lpszTemplateName));

    m_lpszTemplateName = lpszTemplateName;  // used for help
    if (HIWORD(m_lpszTemplateName) == 0 && m_nIDHelp == 0)
        m_nIDHelp = LOWORD((DWORD)m_lpszTemplateName);

    HINSTANCE hInst = AfxFindResourceHandle(lpszTemplateName, RT_DIALOG);
    HRSRC hResource = ::FindResource(hInst, lpszTemplateName, RT_DIALOG);
    HGLOBAL hTemplate = LoadResource(hInst, hResource);
    
    ASSERT(hTemplate != NULL);
    
    LPCDLGTEMPLATE lpDialogTemplate = (LPCDLGTEMPLATE)LockResource(hTemplate );
    
    ASSERT(lpDialogTemplate != NULL);    
    
    /*
    if (pParentWnd == NULL)
        pParentWnd = AfxGetMainWnd();
    */
    
    m_lpDialogInit = NULL;

    BOOL bResult = CreateDlgIndirect(lpDialogTemplate, /*pParentWnd*/ NULL, hInst);

    UnlockResource(hTemplate );
    FreeResource(hTemplate);

    return bResult;
}


реализация использует 
Код

#include "afximpl.h"

так что он должен быть виден ею.

Код

void CDialog1::OnOK() 
{
    static CNoParentDlg dlg;
    dlg.CreateNoParent(IDD_ABOUTBOX);
}



PM MAIL   Вверх
Прохожий
Дата 24.4.2007, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

dlg.Create(IDD_DIALOG1,this); 
 Заменить на

dlg.Create(IDD_DIALOG1,GetDesktopWindow()); 

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


 




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


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

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