Sizing a CFormView
Mats Mеnhav -- manhav@connectum.skurup.se Wednesday, January 24, 1996 -- [ From: Mats Mеnhav * EMC.Ver #2.5.02 ] -- MSVC 4.00 Win NT 3.51 SP3 w. Newshell I want to resize a CFormView in MDI to fit the dialog resource. I found a note in the FAQ about this telling how to do it. It said that I in my OnInitialUpdate should do the following: CFormView::OnInitialUpdate(); ResizeParentToFit(/*FALSE*/); // default argument is TRUE Now this makes things different than it was without it, however not what I wanted. What will happen is that the horizontal sixe is not changed at all by this, and the vertical size is set to almost zero ('almost' because the Win 95/NewShell makes the formview with borders, and these are visible, but the 'real' cliet window is not). Has anyone out there encountered the same problem and found a good workaround ? Regards Mats -- ========================================================================== Mats Mеnhav (Mats Manhav for 7-bit people) email:manhav@connectum.skurup.se WWW: http://connectum.skurup.se/~manhav FAX: (int) 46 (0) 414 243 05 Phone: (int) 46 (0) 414 243 05 ==========================================================================
Dale Wilson -- dale@dra.com Tuesday, January 30, 1996 > -- [ From: Mats Menhav * EMC.Ver #2.5.02 ] -- > I want to resize a CFormView in MDI to fit the dialog resource. By the time you get to OnInitialUpdate, things are grunged. After a GREAT DEAL OF ANGUISH (are you listening, MFC developers (grin)) I came up with... void MyFormView::OnSize(UINT Type, int cx, int cy) { // If we have valid coordinates if(Type != SIZE_MINIMIZED && cx != 0 && cy != 0) { // Save previous screen size m_PrevX = m_cx; m_PrevY = m_cy; m_cx = cx; m_cy = cy; // If we've been here before if( m_PrevX != 0 && m_PrevY != 0) { // and if anything has changed if( m_cx != m_PrevX || m_cy != m_PrevY) { // Do some stuff } } else { //First Time // At this point, the size of the window is based on the size of the dialog. // That's what we want. // Unfortunately the frame has a different size and if nothing is done, it will // resize us to fit its preferences, so we capture our size now, before the frame // does it's deed. CRect InitRect; GetWindowRect(InitRect); TRACERESIZE(_T(" Initial Rectangle: %d, %d, %d, %d)\n\r"), InitRect.left, InitRect.top, InitRect.right, InitRect.bottom); CFrameWnd *pParent = GetParentFrame(); if(pParent != NULL) { pParent->CalcWindowRect(InitRect); TRACERESIZE(_T(" Parent Window desired: %d, %d, %d, %d)\n\r"), InitRect.left, InitRect.top, InitRect.right, InitRect.bottom); CWnd* pAncestor = pParent->GetParent(); if(pAncestor != NULL) { pAncestor->ScreenToClient(InitRect); } pParent->MoveWindow(InitRect.left, InitRect.top, InitRect.Width(), InitRect.Height()); } } } CFormView::OnSize(Type, cx, cy); } Cheers, Dale Wilson dale@dra.com
Dale Wilson -- dale@dra.com Thursday, February 01, 1996 > Hi Dale, > > Yes, It is true that the Window is already being grunged when I get to the > OnInitialUpdate. I was just going to insert your code when I noticed that I > had a SetScrollSizes in my CFormView derived class. (I have that because I > don't > want to have any scrollbars in the dialog, I resize the controls during the > OnSize instead). > Since OnSize is called before OnInitialUpdate it is quite obvious that the > code doesn't work. > > If I make sure I don't call SetScrollSizes until the OnInitialUpdate() is > called the resizing works alright. > > Mats Thanks for the reply, Mats. I don't have a SetScrollSizes in my code, but I do have a SetScaleToFitSize in my OnInitialUpdate which serves a similar purpose. The problem I was seeing shows up in the following trace output in which I disabled the MoveWindow in my code DRAFormView::OnCreate (size(0,0,0,0)) DRAFormView::OnSize(0, 370, 186) Initial Rectangle: 60, 151, 430, 337) Parent Window desired: 54, 126, 436, 343) DRAFormView::OnSize(0, 0, 0) DRAFormView::OnSize(0, 604, 275) DRAFormView::OnInitialUpdate The first size (370x186) matches the resource dialog. Without any help from me, MFC has resized it to 604x275 based, apparently on the default size of the Frame. When I turn the MoveWindow back on, I get... DRAFormView::OnCreate (size(0,0,0,0)) DRAFormView::OnSize(0, 370, 186) Initial Rectangle: 104, 199, 474, 385) Parent Window desired: 98, 174, 480, 391) DRAFormView::OnSize(0, 0, 0) DRAFormView::OnSize(0, 366, 182) DRAFormView::OnSize(0, 366, 166) DRAFormView::OnSize(0, 350, 166) DRAFormView::OnInitialUpdate I'm still losing 20x20 pixels before the OnInitialUpdate, but that's acceptable in my application. If I DON'T capture the initial size in the first meaningful OnSize, then I end up completely lost. Could your technique be working because you are resizing your controls in OnSize even before the OnInitialUpdate? In my case, I don't know what needs to be done until OnInitialUpdate. In any case, glad you got it working... dale@dra.com
| Вернуться в корень Архива |