Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно сменить тип окна с pop-up на child ? для исп. на закладке TabCtrl 
:(
    Опции темы
AndreySol
Дата 2.6.2009, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть обычный диалог, созданный редактором ресурсов, и связанный с ним класс. Для него установлены стили WS_POPUP и WS_CAPTION. Надо использовать этот диалог на закладке TabCtrl.
Пробую сделать примерно так:
Код

CSelDevDlg pSetDevDlg;
pSetDevDlg = new CSelDevDlg(this);

tabItem.lParam = (LPARAM) pSetDevDlg;
m_tabctrl.SetItem(iNumTabDevDlg, &tabItem);
if(pSetDevDlg->Create(CSelDevDlg::IDD, &m_tabctrl) != NULL)
{
    pSetDevDlg->ModifyStyle(WS_CAPTION, WS_CHILD);
//    pSetDevDlg->SetParent();
    ::SetParent(pSetDevDlg->GetSafeHwnd(), m_tabctrl.GetSafeHwnd());

    pSetDevDlg->SetWindowPos(NULL, 2, rcItemRect.Height() + 5, rcWind.Width(), rcWind.Height(), SWP_NOZORDER);
    pSetDevDlg->ShowWindow(SW_SHOW);
}

диалог нормально отображается на закладке, но к нему нет доступа. Что еще надо доделать \ изменить чтоб окно диалога заработало нормально ?
PM MAIL   Вверх
Earnest
Дата 2.6.2009, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Поставь в свойствах ресурса тип Child и создавай сразу как дочерний.


--------------------
...
PM   Вверх
AndreySol
Дата 3.6.2009, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
Поставь в свойствах ресурса тип Child и создавай сразу как дочерний


Ну это я в курсе, вот только это диалоговое окно требуется в двух видах - и как обычный модальный диалог и как диалог на закладке TabCtrl.
PM MAIL   Вверх
Earnest
Дата 3.6.2009, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Тогда попробуй перекрыть PreCreateWindow и сменить стиль там. Суть в том, чтобы Windows-окно создавалось с правильным стилем. Не факт, что получится (и что вообще попадешь в PreCreate).
Если нет, то нужно загружать диалог как ресурc (DLGTEMPLATE), ковырять стиль там и создавать через CreateIndirect.


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


Опытный
**


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

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



Цитата

Тогда попробуй перекрыть PreCreateWindow 

Попробовал, не прокатывает. Похоже PreCreateWindow вызывается только для SDI\MDI окон.
PM MAIL   Вверх
Dreamer_0x01
Дата 5.6.2009, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Я реализовал эту задачу следующим образом:

1. В ресурсах создал исходный диалог со стилями, необходимыми для добавления на вкладку, то есть CHILD и все остальное.
2. Создал вспомогательный пустой класс от CDialog, в котором объявил public-переменную исходного диалога.
3. Во вспомогательном диалоге создал дочерний диалог точно так же, как его создавали на вкладке.
4. В том месте, где нужен модальный диалог, создаю экземпляр вспомогательного диалога, в нем легко выполняю инициализацию для исходного диалога, так как он там баблик, делаю DoModal() для вспомогательного диалога.

В приложении файл с работающим примером и исходниками.

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  TabCtrlTest.rar 133,27 Kb


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


Эксперт
****


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

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



Цитата(AndreySol @  5.6.2009,  08:29 Найти цитируемый пост)
Попробовал, не прокатывает. Похоже PreCreateWindow вызывается только для SDI\MDI окон. 

Нет, конечно: это зависит исключительно от контектса вызова CreateWindow. Если вызов изнури ВИНАПИ, то PreCreate не вызывается (равно как OnCreate)... Стало быть, остается путь через редакцию шаблона DLGTEMPLATE. Поверь, это несложно совсем - всего-то стиль поменять.
Ну, конечно, с помощью вложенного диалога тоже можно, как предложил Dreamer_0x01, но это все немножно через ж. , учитывая, что есть другой путь. 


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


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


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

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



Цитата(Earnest @  7.6.2009,  14:05 Найти цитируемый пост)
Стало быть, остается путь через редакцию шаблона DLGTEMPLATE. Поверь, это несложно совсем - всего-то стиль поменять.


А для тех, кто в танке, можно пояснить, что нужно для этого сделать? Мне тоже интересно.


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


Эксперт
****


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

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



Нужно загрузить диалоговый ресурс в память, см. DLGTEMPLATE в MSDN. Поменять стили. Создать диалог через CreateIndirect. 
Вот кусок кода с оберткой для DLGTEMPLATE и созданием диалога. Там есть лишнее для данной задачи, это чисто для примера:
Код

// класс для загрузки произвольных бинарных ресурсов
class CBinResData
{
public:
   CBinResData(HMODULE,LPCTSTR psName,LPCTSTR psType,WORD wLang=0);
   CBinResData(HMODULE,HRSRC);

   HMODULE  Module() const { return m_hMod;  }
   HRSRC    Rsrc()   const { return m_hRsrc; }
   LPBYTE   Data()   const { return m_pData; }
   DWORD    Size()   const { return m_nSize; }

private:
   HMODULE  m_hMod;
   HRSRC    m_hRsrc;
   LPBYTE   m_pData;
   DWORD    m_nSize;
};

class CDlgTemplate
{
public:
   CDlgTemplate(LPVOID pData,UINT nSize);
   
   bool IsDialogEx  () const;
   void ModifyStyle (UINT nRemove,UINT nAdd);
   void SetInvisible();
   void SetPosition (int,int);

   operator DLGTEMPLATE* () const { return m_pData; }

private:
   CSmartPtr<DLGTEMPLATE> m_pData;
};

///////////////////////////////////////////////////////////////////////////////////////////
// для создания временных диалогов
class CTmpDialog: public CDialog
{
public:
   bool Create(const CBinResData&,LPCTSTR psName,CWnd* pParent);
protected:
   virtual bool PreCreateDialog(CDlgTemplate&);
};


Код


///////////////////////////////////////////////////////////////////////////////////////////
// class CBinResData

CBinResData::CBinResData(HMODULE hModule,LPCTSTR psName,LPCTSTR psType,WORD wLang):
   m_hMod(hModule),
   m_pData(0),
   m_nSize(0),
   m_hRsrc(0)
{
   ASSERT(hModule);
   m_hRsrc = wLang ? FindResourceEx(m_hMod,psType,psName,wLang):
                     FindResource(m_hMod,psName,psType);
   if (m_hRsrc) 
   {
      HGLOBAL hGlob = LoadResource(m_hMod,m_hRsrc);
      if (!hGlob) CSysException::Throw();

      m_pData = (LPBYTE)LockResource(hGlob);
      m_nSize = SizeofResource(m_hMod,m_hRsrc);
      if (!m_pData || !m_nSize) CSysException::Throw();
   }
}

CBinResData::CBinResData(HMODULE hModule,HRSRC hRsrc):
   m_hMod(hModule),
   m_hRsrc(hRsrc)
{
   m_pData = (LPBYTE)LockResource(LoadResource(m_hMod,m_hRsrc));
    m_nSize = SizeofResource(m_hMod,m_hRsrc);
}

///////////////////////////////////////////////////////////////////////////////////////////
// class CDlgTemplate

CDlgTemplate::CDlgTemplate(LPVOID pData,UINT nSize)
{
   // копируем ресурс, чтобы можно было его изменять
   m_pData = (DLGTEMPLATE*) new BYTE [nSize];
   memcpy(m_pData,pData,nSize);
}

bool CDlgTemplate::IsDialogEx() const 
{
    return ((DLGTEMPLATEEX*)m_pData.get())->signature == 0xFFFF;
}

void CDlgTemplate::ModifyStyle(UINT nRemove,UINT nAdd)
{
   DWORD& style = IsDialogEx() ? ((DLGTEMPLATEEX*)m_pData.get())->style : m_pData->style;
   style &= ~nRemove;
   style |= nAdd;
}

void CDlgTemplate::SetInvisible()
{
    if (!IsDialogEx())
        m_pData->style &= ~WS_VISIBLE;
    else 
      ((DLGTEMPLATEEX*)m_pData.get())->style &= ~WS_VISIBLE;
}

void CDlgTemplate::SetPosition(int x,int y)
{
    if (IsDialogEx()) 
   {
        DLGTEMPLATEEX* pt=(DLGTEMPLATEEX*)m_pData.get();
        pt->x=x; 
      pt->y=y;
    }
    else 
   { 
        m_pData->x=x;
      m_pData->y=y;
    }
}

///////////////////////////////////////////////////////////////////////////////////////////
// class CTmpDialog
   
bool CTmpDialog::Create(const CBinResData& dd,LPCTSTR psName,CWnd* pParent)
{
   ASSERT(dd.Data()!=0);
   CBinResData init(dd.Module(),psName,RT_DLGINIT);

   // создаем (и изменяем) шаблон
   CDlgTemplate Templ(dd.Data(),dd.Size());
   if (!PreCreateDialog(Templ)) return false;

    return CreateIndirect(Templ,pParent,init.Data())!=0;
}

bool CTmpDialog::PreCreateDialog(CDlgTemplate& Templ) 

   Templ.ModifyStyle(WS_POPUP|WS_VISIBLE,WS_CHILD);
   return true; 
}


Добавлено через 3 минуты и 8 секунд
После заголовка в DLGTEMPLATE идут поля, так что можно их менять, напихать новых, и т.д. и т.п. Много чего можно...


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


 




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


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

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