Maximizare controale intr-un splitter view

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
Post Reply
0ptr
Membru
Membru
Posts: 71
Joined: 01 Feb 2011, 23:27
Judet: Ilfov

Maximizare controale intr-un splitter view

Post by 0ptr » 05 Oct 2012, 21:11

Intr-o aplicatie MDI cu mai multe splittere am probleme cu aranjarea initiala a unui control CTabCtrl in dreptunghiul spliterului de tip CFormView.
Dupa ce mi se seteaza aplicatia MAXIMIZE si totul e pus la locul sau (dar controalele nu-s la dimensiunea maxima), la orice miscare de resize a splitterului continand instanta de CTabCtrl mi se mareste la dimensiunea completa din splitter cum imi doresc sa se intample initial (fireste, se reapeleaza OnSize()-ul meu).

Pe OnCreate()-ul splitterului derivat din CFormView dupa CFormView::OnCreate(lpCreateStruct) fac:

Code: Select all

	CRect rc(0,0, lpCreateStruct->cx, lpCreateStruct->cy);
	
	if (!m_wndTabs.Create(CMFCTabCtrl::STYLE_3D_ONENOTE, rc, this, 0x11)) {
		return -1;    
	}

	DWORD dwStyle =  LBS_NOINTEGRALHEIGHT | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL;
	if (!m_wndOutputTab1.Create(dwStyle, rc, &m_wndTabs, 0x12) ||
			!m_wndOutputTab2.Create(dwStyle, rc, &m_wndTabs, 0x13) ||
			!m_wndOutputTab3.Create(dwStyle, rc, &m_wndTabs, 0x14))	{
		return -1;     
	}

	m_wndTabs.AddTab(&m_wndOutputTab1, _T("tab 1"), (UINT)0x12);
	m_wndTabs.AddTab(&m_wndOutputTab2, _T("tab 2"),	(UINT)0x13);
	m_wndTabs.AddTab(&m_wndOutputTab3,	_T("tab 3"), (UINT)0x14);
	
	//m_wndTabs.CalcWindowRect(rc, CWnd::adjustBorder);   // degeaba
	//m_wndTabs.SetWindowPos(NULL, rc.left, rc.top , rc.Width(), 
	//									rc.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
	//m_wndTabs.RecalcLayout(); 
Pe OnSize()

Code: Select all

void CMyFormView::OnSize(UINT nType, int cx, int cy)
{
	CFormView::OnSize(nType, cx, cy);

	//m_wndOutputTab1.MoveWindow(0, 0, cx, cy);	// cu sau fara acelasi efect
	//m_wndOutputTab2.MoveWindow(0, 0, cx, cy);
	//m_wndOutputTab3.MoveWindow(0, 0, cx, cy);
 	m_wndTabs.MoveWindow(0, 0, cx, cy);	
}
Nu-mi dau seama de ce nu pot seta corect dimensiunea splitterului de la creere. http://i.imgur.com/mPacJ.png
Am incercat si sa pasez width-ul si height-ul din CChildFrame pe creearea si redimensionarea splitterelor la inceput dar degeaba - acelasi comportament.



User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Maximizare controale intr-un splitter view

Post by Ovidiu Cucu » 07 Oct 2012, 12:07

0ptr wrote:[...]
Nu-mi dau seama de ce nu pot seta corect dimensiunea splitterului de la creere. http://i.imgur.com/mPacJ.png
Am incercat si sa pasez width-ul si height-ul din CChildFrame pe creearea si redimensionarea splitterelor la inceput dar degeaba - acelasi comportament.
Ca sa dimensionezi "la cerere" un panel dintr-un splitter, nu o faci dimensionand view-ul continut si nici controalele continute in view.
Faci asta cu CSplitterWnd::SetRowInfo si/sau CSplitterWnd::SetColumnInfo.
Vezi ca s-a mai discutat in forum, nu demult o problema cu dimensionarea panelurilor intr-un splitter: http://www.codexpert.ro/forum/viewtopic.php?f=14&t=2159

0ptr
Membru
Membru
Posts: 71
Joined: 01 Feb 2011, 23:27
Judet: Ilfov

Re: Maximizare controale intr-un splitter view

Post by 0ptr » 07 Oct 2012, 14:10

Ovidiu Cucu wrote:
0ptr wrote:[...]
Nu-mi dau seama de ce nu pot seta corect dimensiunea splitterului de la creere. http://i.imgur.com/mPacJ.png
Am incercat si sa pasez width-ul si height-ul din CChildFrame pe creearea si redimensionarea splitterelor la inceput dar degeaba - acelasi comportament.
Ca sa dimensionezi "la cerere" un panel dintr-un splitter, nu o faci dimensionand view-ul continut si nici controalele continute in view.
Faci asta cu CSplitterWnd::SetRowInfo si/sau CSplitterWnd::SetColumnInfo.
Vezi ca s-a mai discutat in forum, nu demult o problema cu dimensionarea panelurilor intr-un splitter: http://www.codexpert.ro/forum/viewtopic.php?f=14&t=2159
Din pacate, nu e o problema de splitter. Am avut grija sa folosesc SetRowInfo() si SetColumnInfo() pe OnCreate() si OnSize() din CChildFrame. Am testat si fara controale create in view-ul meu cu pricina (dar si in alte view-uri) si toate splitterele sunt la dimensiunile dorite.
Dupa cum se poate observa si pe link-ul spre screenshot instanta de CTabCtrl e creeata si adaug in ea 3 list box-uri. Problema e in interiorul clasei view la aranjarea controalelor.
De fapt, din cele remarcate, ce-mi vine mie pe lpCreateStruct->cx, lpCreateStruct->cy sunt mai mici fata de ce imi vine ulterior cand fac OnSize. Ma gandeam ca reusesc cumva sa intind/maximizez m_wndTabs in view-ul meu direct de la creeare.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Maximizare controale intr-un splitter view

Post by Ovidiu Cucu » 07 Oct 2012, 20:33

Un view este de obicei copilul unui frame sau cum e in cazul nostru, a unui splitter. Dupa creare poate suferi N redimensionari, chestie de care se ocupa clasa parintelui.
Mai ales in cazul in care e intr-un splitter, nu ai cum sa stii in toate cazurile la creare ce dimensiuni va trebui sa aiba in final palelul in care sta, deci nici dimensiunile finale ale view-ului.
Deci, daca vrei sa redimensionezi copiii unui view, locul este in OnSize (handlerul lui WM_SIZE).

0ptr
Membru
Membru
Posts: 71
Joined: 01 Feb 2011, 23:27
Judet: Ilfov

Re: Maximizare controale intr-un splitter view

Post by 0ptr » 08 Oct 2012, 14:53

Ovidiu Cucu wrote:Un view este de obicei copilul unui frame sau cum e in cazul nostru, a unui splitter. Dupa creare poate suferi N redimensionari, chestie de care se ocupa clasa parintelui.
Mai ales in cazul in care e intr-un splitter, nu ai cum sa stii in toate cazurile la creare ce dimensiuni va trebui sa aiba in final palelul in care sta, deci nici dimensiunile finale ale view-ului.
Deci, daca vrei sa redimensionezi copiii unui view, locul este in OnSize (handlerul lui WM_SIZE).
Mda, asta era. Pe CChildFrame::OnSize() uitasem sa fac RecalcLayout() pe splittere dupa acestea au fost creeate + cateva ajustari la creere.
Many thanks! :thumbup:

Post Reply