Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменение размера Edit'a с изменением размера Dlg 
:(
    Опции темы
Xedin
Дата 3.3.2007, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У мя есть диаог на нём эидты кнопочки разные...как при изменении размеров диалога изменять размекры эдита и кнопочки желатеьно чтоб тож как-нить ровненько выстраивались???
PM MAIL   Вверх
Rodman
Дата 3.3.2007, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

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



программно... на OnResize вешай перерасчет размеров компонентов...
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Xedin
Дата 3.3.2007, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



мона по подробней и с кодиком желательно smile 
PM MAIL   Вверх
Earnest
Дата 4.3.2007, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Rodman, хотел наверное сказать, на OnSize...

Xedin, все зависит от того, как ты хочешь, чтобы контролы перестраивались... вариантов-то много.
Вот, например, простой вариант: при изменении размеров диалога все контролы сохраняют свое смещение относительно тех сторон диалога, к которым они изначально ближе. При этом каждая сторона контрола рассматривается отдельно. Т.е., кнопки, находящиеся слева, остануться слева, те, которые справа-снизу, так и будут справа снизу, а контролы, пересекающие середину диалога будут растягиваться.
Вот код, но за правильную компиляцию не ручаюсь, т.к. на глазок выкидывала лишнее из рабочего кода... 

Код

class CAutoResizeDlg: public CDialog 
{
   typedef CDialog base_class;
   class CLayoutMover;

   DECLARE_MESSAGE_MAP()

public:
   CAutoResizeDlg (UINT dlgID, bool bResize, CWnd* pParWnd = 0);
   ~CAutoResizeDlg();

protected:
   virtual BOOL OnInitDialog();
   afx_msg void OnGetMinMaxInfo (MINMAXINFO*);
   afx_msg void OnWindowPosChanging(WINDOWPOS*);
   afx_msg void OnWindowPosChanged (WINDOWPOS*);

private:
   bool WantResizing() const
   {
      return m_bResize && !m_rcInitial.IsRectEmpty();
   }

private:
   bool  m_bResize;
   CRect m_rcInitial;
   CLayoutMover* m_pLayout;
};

class CAutoResizeDlg::CLayoutMover
{
public:
   CLayoutMover (CWnd& Owner);

   void Resize (CSize szNew);

private:
   void _MovePoint (CPoint& pt, CSize szNew) const;

private:
   typedef std::pair<CWnd*,CRect> CItem;
   typedef std::vector<CItem> CItems;

   CRect m_rcLayout,
         m_rcWindow;

   CItems m_Items;
};

///////////////////////////////////////////////////////////////////////////////////////////
// объект, отвечающий за перестроение контролов
CAutoResizeDlg::CLayoutMover::CLayoutMover (CWnd& Owner)
{
   Owner.GetClientRect (m_rcLayout);
   Owner.GetWindowRect (m_rcWindow);

   for (CWnd* pWnd = Owner.GetWindow (GW_CHILD); pWnd != 0; pWnd = pWnd->GetNextWindow())
   {
      CRect rcItem; 
      pWnd->GetWindowRect (rcItem);
      Owner.ScreenToClient (rcItem);

      m_Items.push_back (CItem (pWnd, rcItem));
   }
}

void CAutoResizeDlg::CLayoutMover::Resize (CSize szNew)
{
   if (szNew == m_rcWindow.Size())
      return;

   HDWP hDwp = ::BeginDeferWindowPos (m_Items.size());

   for (CItems::iterator itItem = m_Items.begin(); itItem != m_Items.end(); ++itItem)
   {
      CRect& rc = itItem->second;

      _MovePoint (rc.TopLeft(), szNew);
      _MovePoint (rc.BottomRight(), szNew);

      VERIFY (::DeferWindowPos (hDwp, *itItem->first, NULL, 
                                rc.left, rc.top, rc.Width(), rc.Height(), 
                                SWP_NOZORDER | SWP_NOACTIVATE));
   }

   ::EndDeferWindowPos (hDwp);
}

void CAutoResizeDlg::CLayoutMover::_MovePoint (CPoint& pt, CSize szNew) const
{
   CSize szOffset = szNew - m_rcWindow.Size();

   if (pt.x > m_rcLayout.Width() / 2)
      pt.x += szOffset.cx;

   if (pt.y > m_rcLayout.Height() / 2)
      pt.y += szOffset.cy;
}

///////////////////////////////////////////////////////////////////////////////////////////
// CAutoResizeDlg dialog

BEGIN_MESSAGE_MAP (CAutoResizeDlg, base_class)
   ON_WM_WINDOWPOSCHANGING()
   ON_WM_WINDOWPOSCHANGED()
   ON_WM_GETMINMAXINFO()
END_MESSAGE_MAP()

CAutoResizeDlg::CAutoResizeDlg (UINT dlgID, bool bResize, CWnd* pParWnd): 
   base_class (dlgID, pParWnd), 
   m_bResize (bResize),
   m_pLayout (0),    
   m_rcInitial (0,0,0,0)
{
}

CAutoResizeDlg::~CAutoResizeDlg()
{
   delete m_pLayout;    
}

BOOL CAutoResizeDlg::OnInitDialog()
{
   base_class::OnInitDialog();
   
   GetWindowRect (m_rcInitial);
   if (m_bResize)
      SetClassLong (m_hWnd, GCL_STYLE, GetClassLong (m_hWnd, GCL_STYLE) | CS_VREDRAW | CS_HREDRAW);

    return TRUE;
}

void CAutoResizeDlg::OnWindowPosChanging (WINDOWPOS *lpwp)
{
   if (!(lpwp->flags & SWP_NOSIZE) && WantResizing())
      m_pLayoutMover = new CLayoutMover (*this);

   base_class::OnWindowPosChanging (lpwp);
}

void CAutoResizeDlg::OnWindowPosChanged (WINDOWPOS *lpwp)
{
   base_class::OnWindowPosChanged (lpwp);

   if (!m_pLayout)
      return;

   m_pLayout->Resize (CSize (lpwp->cx, lpwp->cy));
   delete m_pLayout;
   m_pLayout = 0;
}

// минимальным размером диалога считаем тот, который задан в редакторе ресурсов
void CAutoResizeDlg::OnGetMinMaxInfo (MINMAXINFO *lpMMI)
{
   if (!WantResizing())
      return;

   lpMMI->ptMinTrackSize = CPoint (m_rcInitial.Size());
}





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


Опытный
**


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

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



Earnest, браво!!! IMHO очень красивая реализация  smile 


--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
Xedin
Дата 5.3.2007, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ругается что-то smile вот в етом кусочке
Код

class CAutoResizeDlg::CLayoutMover
{
public:
   CLayoutMover (CWnd& Owner);

   void Resize (CSize szNew);

private:
   void _MovePoint (CPoint& pt, CSize szNew) const;

private:
   typedef std::pair<CWnd*,CRect> CItem;
   typedef std::vector<CItem> CItems;

   CRect m_rcLayout,
         m_rcWindow;

   CItems m_Items;
};


уже вот такие ругательства:

 error C2039: 'pair' : is not a member of 'std'
 error C2039: 'pair' : is not a member of 'std'
 error C2039: 'vector' : is not a member of 'std'
 error C2039: 'vector' : is not a member of 'std'
 error C2143: syntax error : missing ';' before '<'
 error C2143: syntax error : missing ';' before '<'
 error C2143: syntax error : missing ';' before '<'
 error C2143: syntax error : missing ';' before '<'
 error C2146: syntax error : missing ';' before identifier 'm_Items'
 error C2146: syntax error : missing ';' before identifier 'm_Items'
 error C2238: unexpected token(s) preceding ';'
 error C2238: unexpected token(s) preceding ';'
 error C2238: unexpected token(s) preceding ';'
 error C2238: unexpected token(s) preceding ';'
 error C2501: 'CAutoResizeDlg::CLayoutMover::CItems' : missing storage-class or type specifiers
 error C2501: 'CAutoResizeDlg::CLayoutMover::CItems' : missing storage-class or type specifiers
 error C2501: 'CAutoResizeDlg::CLayoutMover::m_Items' : missing storage-class or type specifiers
 error C2501: 'CAutoResizeDlg::CLayoutMover::m_Items' : missing storage-class or type specifiers

PM MAIL   Вверх
Earnest
Дата 5.3.2007, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Xedin, это реализация предполагает использование STL. Подключи заголовок <vector>. Если будет продолжать ругаться на pair, подключи <utility>.

Добавлено @ 13:39 
Цитата(Greeen @  4.3.2007,  17:48 Найти цитируемый пост)
Earnest, браво!!! IMHO очень красивая реализация

Спасибо, но БРАВО не мне. Идея не моя, она действительно, красивая и простая, а реализация - в общем тривиальная и естественная.
Я немного переделала код для Xedin - там вообще-то smart-pointer вместо простого указателя, и похоже, правильно сделала.



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


Новичок



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

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



подключение загоовков помогло....руголось тока на неоьъявленность m_pLayoutMover
объявила как CLayoutMover* m_pLayoutMover;


ругается терь вот так:


888888888 error LNK2005: "private: void __thiscall CAutoResizeDlg::CLayoutMover::_MovePoint(class CPoint &,class CSize)const " (?_MovePoint@CLayoutMover@CAutoResizeDlg@@ABEXAAVCPoint@@VCSize@@@Z) already defined in 888888888.obj
888888888 error LNK2005: "protected: static struct AFX_MSGMAP const * __stdcall CAutoResizeDlg::GetThisMessageMap(void)" (?GetThisMessageMap@CAutoResizeDlg@@KGPBUAFX_MSGMAP@@XZ) already defined in 888888888.obj
888888888 error LNK2005: "protected: virtual int __thiscall CAutoResizeDlg::OnInitDialog(void)" (?OnInitDialog@CAutoResizeDlg@@MAEHXZ) already defined in 888888888.obj
888888888 error LNK2005: "protected: virtual struct AFX_MSGMAP const * __thiscall CAutoResizeDlg::GetMessageMap(void)const " (?GetMessageMap@CAutoResizeDlg@@MBEPBUAFX_MSGMAP@@XZ) already defined in 888888888.obj
888888888 error LNK2005: "protected: void __thiscall CAutoResizeDlg::OnGetMinMaxInfo(struct tagMINMAXINFO *)" (?OnGetMinMaxInfo@CAutoResizeDlg@@IAEXPAUtagMINMAXINFO@@@Z) already defined in 888888888.obj
888888888 error LNK2005: "protected: void __thiscall CAutoResizeDlg::OnWindowPosChanged(struct tagWINDOWPOS *)" (?OnWindowPosChanged@CAutoResizeDlg@@IAEXPAUtagWINDOWPOS@@@Z) already defined in 888888888.obj
888888888 error LNK2005: "protected: void __thiscall CAutoResizeDlg::OnWindowPosChanging(struct tagWINDOWPOS *)" (?OnWindowPosChanging@CAutoResizeDlg@@IAEXPAUtagWINDOWPOS@@@Z) already defined in 888888888.obj
888888888 error LNK2005: "public: __thiscall CAutoResizeDlg::CAutoResizeDlg(unsigned int,bool,class CWnd *)" (??0CAutoResizeDlg@@QAE@I_NPAVCWnd@@@Z) already defined in 888888888.obj
888888888 error LNK2005: "public: __thiscall CAutoResizeDlg::CLayoutMover::CLayoutMover(class CWnd &)" (??0CLayoutMover@CAutoResizeDlg@@QAE@AAVCWnd@@@Z) already defined in 888888888.obj
888888888 error LNK2005: "public: virtual __thiscall CAutoResizeDlg::~CAutoResizeDlg(void)" (??1CAutoResizeDlg@@UAE@XZ) already defined in 888888888.obj
888888888 error LNK2005: "public: void __thiscall CAutoResizeDlg::CLayoutMover::Resize(class CSize)" (?Resize@CLayoutMover@CAutoResizeDlg@@QAEXVCSize@@@Z) already defined in 888888888.obj
888888888 fatal error LNK1169: one or more multiply defined symbols found
 warning C4267: 'argument' : conversion from 'size_t' to 'int', possible loss of data
 warning C4267: 'argument' : conversion from 'size_t' to 'int', possible loss of data

PM MAIL   Вверх
Earnest
Дата 6.3.2007, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Xedin, я код привела одним куском, предполагая, что ты понимаешь, что объявление CAutoResizeDlg должно быть в заголовке, а все остальное надо поместить в cpp-файл. 


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


 




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


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

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