tofff
asked on
TabStrip Client Area co-ordinates
I've got a simple TabStrip control on a basic form. It has 4 tabs. When the form is resized, the TabStrip control is resized to the Scale Width/Height of the form. Great so far. Now, I've got 4 Frames, in a collection. The idea is that I associate each Frame with a Tab, and hide/show it (and its contained controls) appropriately. This is all working wonderfully - the correct controls are getting displayed depending on the selected Tab.
My problem is that I can't properly size the Frame within the Tab. The Form itself has a ScaleMode of 1 (Twips), but when I watch the code execute, it appears that the sizes of the Frames (before I resize them and after) aren't getting set properly. For example, when the form is resized to (for example) 10000 x 10000 (twips, don't forget), the tab control ends up with sizes like 9885 x 9315, which is fair enough. But the tab control's client area shows a size of 201.75 x 181.45. Naturally, when I set the frames to this size, they look like crap. At first I thought that somehow the client area sizes were being reported in pixels, rather than twips (despite the fact that all controls are supposed to inherit the parent form's ScaleMode), but that's not right either. I put in the correction (* Screen.TwipsPerPixelX) and they were still to small - they looked about two thirds as big as they should have been. In case it helps, here's the entire subroutine on the form's resize:
Private Sub Form_Resize()
tabMain.Left = frmMain.ScaleLeft
tabMain.Top = frmMain.ScaleTop
tabMain.Width = frmMain.ScaleWidth
tabMain.Height = frmMain.ScaleHeight
fraTab(tabMain.SelectedIte m.Index).L eft = tabMain.ClientLeft
fraTab(tabMain.SelectedIte m.Index).T op = tabMain.ClientTop
fraTab(tabMain.SelectedIte m.Index).W idth = tabMain.ClientWidth
fraTab(tabMain.SelectedIte m.Index).H eight = tabMain.ClientHeight
End Sub
The main Form is frmMain, the TabStrip is tabMain, and the collection of Frames is fraTab.
Any suggestions?
My problem is that I can't properly size the Frame within the Tab. The Form itself has a ScaleMode of 1 (Twips), but when I watch the code execute, it appears that the sizes of the Frames (before I resize them and after) aren't getting set properly. For example, when the form is resized to (for example) 10000 x 10000 (twips, don't forget), the tab control ends up with sizes like 9885 x 9315, which is fair enough. But the tab control's client area shows a size of 201.75 x 181.45. Naturally, when I set the frames to this size, they look like crap. At first I thought that somehow the client area sizes were being reported in pixels, rather than twips (despite the fact that all controls are supposed to inherit the parent form's ScaleMode), but that's not right either. I put in the correction (* Screen.TwipsPerPixelX) and they were still to small - they looked about two thirds as big as they should have been. In case it helps, here's the entire subroutine on the form's resize:
Private Sub Form_Resize()
tabMain.Left = frmMain.ScaleLeft
tabMain.Top = frmMain.ScaleTop
tabMain.Width = frmMain.ScaleWidth
tabMain.Height = frmMain.ScaleHeight
fraTab(tabMain.SelectedIte
fraTab(tabMain.SelectedIte
fraTab(tabMain.SelectedIte
fraTab(tabMain.SelectedIte
End Sub
The main Form is frmMain, the TabStrip is tabMain, and the collection of Frames is fraTab.
Any suggestions?
First some optimalisations:
with frmMain
tabmain.move .scaleleft, .scaletop, .scalewidth, .scaleheight
end with
With tabmain
fraTab.Move .ClientLeft, .ClientTop, .ClientWidth, .ClientHeight
End With
with frmMain
tabmain.move .scaleleft, .scaletop, .scalewidth, .scaleheight
end with
With tabmain
fraTab.Move .ClientLeft, .ClientTop, .ClientWidth, .ClientHeight
End With
Most likely, the problem disappears when you remove the tabstrip and create it again.
Oeps, I think I see it.
Do you create the form with new? set aform = newFrmMain.
In that case aForm and frmMain are two different instances and have a different size.
Change the code to the code below:
tabMain.Left = me.ScaleLeft
tabMain.Top = me.ScaleTop
tabMain.Width = me.ScaleWidth
tabMain.Height = me.ScaleHeight
Do you create the form with new? set aform = newFrmMain.
In that case aForm and frmMain are two different instances and have a different size.
Change the code to the code below:
tabMain.Left = me.ScaleLeft
tabMain.Top = me.ScaleTop
tabMain.Width = me.ScaleWidth
tabMain.Height = me.ScaleHeight
ASKER
I don't create the form frmMain - it's the startup object of the application.
I changed the code from 'frmMain' to 'Me' anyway - it did not help.
I inserted the optimisations you suggested - they did not help (not that you expected them to).
I removed the TabStrip and created a new one - that did not help.
Any other suggestions?
I changed the code from 'frmMain' to 'Me' anyway - it did not help.
I inserted the optimisations you suggested - they did not help (not that you expected them to).
I removed the TabStrip and created a new one - that did not help.
Any other suggestions?
You didn't by accident create the tabstrip or one of the frames inside another frame?
debug.assert fraTab(tabMain.SelectedIte m.Index).c ontainer is me
ASKER
No, nothing like that - but I have found the problem. I have VB5.0 installed, with SP2. There are two different files which give access to a TabStrip control - both Microsoft, and both installed by either VB5.0 or SP2 (as above). They are:
COMCTL32.OCX (version 5.01.4319)
FM20.DLL (version 2.01)
Both have VERY different implementations of the same control. I was using the one from FM20.DLL - and, by my best estimation, it doesn;t work. The one in COMCTL32.OCX works fine with my existing code.
Thanks for your help, and why the hell did MSoft put out two different versions of the same control (they even have different parameter lists and orders for some methods!)
COMCTL32.OCX (version 5.01.4319)
FM20.DLL (version 2.01)
Both have VERY different implementations of the same control. I was using the one from FM20.DLL - and, by my best estimation, it doesn;t work. The one in COMCTL32.OCX works fine with my existing code.
Thanks for your help, and why the hell did MSoft put out two different versions of the same control (they even have different parameter lists and orders for some methods!)
FM20.dll is installed by VBA and Office.
You can ask at Customer Services to refund your points since you found the answer yourself.
You can ask at Customer Services to refund your points since you found the answer yourself.
or, you can give the points to me..
a poor lowly down on his luck expert <tin cup out>
a poor lowly down on his luck expert <tin cup out>
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER