Windows Explorer-like Status Bars
Erik Thomas -- ErikThomas@msn.com Wednesday, March 05, 1997 Environment: VC++ 4.2-flat, Win 95 I have created an application that mimics much of the visual functionality of the Windows 95 Explorer, with a two paned splitter (left side is Tree view, right side can be List or Grid view depending on selection of Tree node). I would like to implement a status bar control along the top of each pane (view) under the frame's toolbar to display status messages from their respective views. When the user moves the splitter bar left or right, the status bars need to resize to match the horizontal width of the respective splitter pane (look at the Windows Explorer's two status bars positioned over each of the two views to see exactly what I am trying to accomplish). It seems the best place to create a CStatusBarCtrl is in the Frame window's OnCreate(), using CCS_TOP style, then override the CStatusBarCtrl control's OnSize() and recalculate the horizontal sizes of the two paned status bar based on the sizes of the splitter panes. Am I on the right track? I can't find any examples of how to do this in my MSDN CD (July 96) or in Microsoft.com/kb. If I drop back to using CStatusBar, I can successfully create it in the correct position, but only with a single pane or with indicators. When I try to create a CStatusBarCtrl, it appears in the wrong location of the screen (overwrites the top of the splitter client area instead of inserting an additional client area to accomodate the control like with CStatusBar). Does anyone know where I can find an example? Thanks for your help. Erik Thomas E.J.Thomas & Associates ErikThomas@msn.com
Jeff Lindholm -- JeffL@inter-intelli.com Thursday, March 06, 1997 [Mini-digest: 4 responses] Actually those windows are just static text windows. >---------- >From: Erik Thomas[SMTP:ErikThomas@msn.com] >Sent: Wednesday, March 05, 1997 1:34 PM >To: mfc-l@netcom.com >Subject: Windows Explorer-like Status Bars > >Environment: VC++ 4.2-flat, Win 95 > >I have created an application that mimics much of the visual functionality of >the Windows 95 Explorer, with a two paned splitter (left side is Tree view, >right side can be List or Grid view depending on selection of Tree node). > >I would like to implement a status bar control along the top of each pane >(view) under the frame's toolbar to display status messages from their >respective views. When the user moves the splitter bar left or right, the >status bars need to resize to match the horizontal width of the respective >splitter pane (look at the Windows Explorer's two status bars positioned over >each of the two views to see exactly what I am trying to accomplish). > >It seems the best place to create a CStatusBarCtrl is in the Frame window's >OnCreate(), using CCS_TOP style, then override the CStatusBarCtrl control's >OnSize() and recalculate the horizontal sizes of the two paned status bar >based on the sizes of the splitter panes. Am I on the right track? > >I can't find any examples of how to do this in my MSDN CD (July 96) or in >Microsoft.com/kb. If I drop back to using CStatusBar, I can successfully >create it in the correct position, but only with a single pane or with >indicators. When I try to create a CStatusBarCtrl, it appears in the wrong >location of the screen (overwrites the top of the splitter client area >instead >of inserting an additional client area to accomodate the control like with >CStatusBar). > >Does anyone know where I can find an example? Thanks for your help. > >Erik Thomas >E.J.Thomas & Associates >ErikThomas@msn.com > -----From: "Eric Rosenquist"On 5 Mar 97 at 18:34, Erik Thomas wrote: > Environment: VC++ 4.2-flat, Win 95 > > I have created an application that mimics much of the visual functionality of > the Windows 95 Explorer, with a two paned splitter (left side is Tree view, > right side can be List or Grid view depending on selection of Tree node). > > I would like to implement a status bar control along the top of each pane > (view) under the frame's toolbar to display status messages from their > respective views. When the user moves the splitter bar left or right, the > status bars need to resize to match the horizontal width of the respective > splitter pane (look at the Windows Explorer's two status bars positioned over > each of the two views to see exactly what I am trying to accomplish). > > It seems the best place to create a CStatusBarCtrl is in the Frame window's > OnCreate(), using CCS_TOP style, then override the CStatusBarCtrl control's > OnSize() and recalculate the horizontal sizes of the two paned status bar > based on the sizes of the splitter panes. Am I on the right track? > > I can't find any examples of how to do this in my MSDN CD (July 96) or in > Microsoft.com/kb. If I drop back to using CStatusBar, I can successfully > create it in the correct position, but only with a single pane or with > indicators. When I try to create a CStatusBarCtrl, it appears in the wrong > location of the screen (overwrites the top of the splitter client area instead > of inserting an additional client area to accomodate the control like with > CStatusBar). If you *really* want it to act like Explorer, then build the status text area into the top portion of each of the views. If you look at Explorer's windows with Spy++ you'll see that each view has its own static text control (note also that the splitter bar goes all the way up between the two status areas). For something that looks very similar and is easier to code, create a CStatusBar in the frame with the CBRS_TOP style and two indicators, then do a: m_StatusBar.SetPaneStyle(1, SBPS_STRETCH); Now the only trick is to keep the width of the status bar panes in sync with the splitter width. I couldn't find any place where the splitter informs the frame after a size change, so the cleanest way to catch changes is probably to derive a new class from CSplitterWnd and override RecalcLayout(). In your RecalcLayout() you can call the base class and then size the status bar panes. Here's the code you'd need if the frame were doing the sizing: int cxWidth; int junk; UINT nID; UINT nStyle; m_StatusBar.GetPaneInfo(0, nID, nStyle, cxWidth); m_Splitter.GetColumnInfo(0, cxWidth, junk); m_StatusBar.SetPaneInfo(0, nID, nStyle, cxWidth - 1); If you make your new splitter class do the sizing itself, then you can find the status bar via: CStatusWnd * pStat = STATIC_DOWNCAST(CStatusWnd, GetParentFrame()->GetMessageBar()); and you should be able to move it via code similar to the above. The views can update their panes via: CStatusWnd * pStat = STATIC_DOWNCAST(CStatusWnd, GetParentFrame()->GetMessageBar()); pStat->SetPaneText(myPaneNumber, "New text"); Hopefully this is what you're after. Eric --------------------------------------------------------------------- Eric Rosenquist, Strata Software Limited http://www.strataware.com/ mailto:rosenqui@strataware.com Tel: 613-591-1922 Fax: 613-591-3485 Quote: I'm filled with piss and vinegar. At first I was just full of vinegar. -- Abraham (Grampa) Simpson --------------------------------------------------------------------- -----From: Mike Blaszczak At 18:34 3/5/97 UT, Erik Thomas wrote: >Environment: VC++ 4.2-flat, Win 95 MFC 4.2-flat isn't compatible with shipping versions of some operating system components. 4.2-flat will break against released versions of those components, which you must be using since the beta versions aren't supported. You need to upgrade to MFC 4.2b by downloading it from the Microsoft web site. >I would like to implement a status bar control along the top of each pane >(view) under the frame's toolbar to display status messages from their >respective views. [...] (look at the Windows Explorer's two >status bars positioned over each of the two views to see exactly >what I am trying to accomplish). The explorer isn't using status bar controls where you say it is. It is actually using static text controls. You can see for yourself by using Spy++. >I can't find any examples of how to do this in my MSDN CD >(July 96) or in Microsoft.com/kb. Believe it or not, there doesn't exist an example for every single possible coding practice in every possible platform. As it stands, the sample at http://www.microsoft.com/win32dev/ui/chicoapp.htm shows how to do what you want, but does it using plain C. You might want to review the design of that application and translate it to MFC. >If I drop back to using CStatusBar, I can successfully >create it in the correct position, but only with a single pane or with >indicators. When I try to create a CStatusBarCtrl, it appears in the wrong >location of the screen (overwrites the top of the splitter client area instead >of inserting an additional client area to accomodate the control like with >CStatusBar). This is mainly because CStatusBar knows how to work with a CFrameWnd to lay itself out (and have the frame window lay out and size the rest of the client area appropriately), but CStatusBarCtrl doesn't have any of that layout code. CStatusBar derives from CControlBar, and CStatusBarCtrl derives from CWnd. CWnd doesn't know how to lay itself out in a frame window, and CControlBar does. .B ekiM http://www.nwlink.com/~mikeblas/ These words are my own. I do not speak on behalf of Microsoft. This performance was not lip-synched. -----From: "petter.hesselberg" You are going about this in a needlessly complicated way. If you check out Explorer with a spying tool such as Spy++, you'll see that the information panes on the top are simple static child windows (direct children of the main window). The sunken look results from the WS_EX_CLIENTEDGE style. In other words: All you need is two static windows that are resized as appropriate whenever necessary. This splitting business can also be greatly simplified. Explorer doesn't HAVE a splitter bar; it's just the parent window showing through between the cracks of the children. All you need to do to get splitter functionality is to handle WM_SETCURSOR and mouse messages in this area for the parent. Regards, Petter.Hesselberg @ ac.com _____________________________ To: mfc-l @ netcom.com @ internet cc: (bcc: Petter Hesselberg) From: ErikThomas @ msn.com ("Erik Thomas") @ internet Date: 06-03-97 00:34 Subject: Windows Explorer-like Status Bars _____________________________ Environment: VC++ 4.2-flat, Win 95 I have created an application that mimics much of the visual functionality of the Windows 95 Explorer, with a two paned splitter (left side is Tree view, right side can be List or Grid view depending on selection of Tree node). I would like to implement a status bar control along the top of each pane (view) under the frame's toolbar to display status messages from their respective views. When the user moves the splitter bar left or right, the status bars need to resize to match the horizontal width of the respective splitter pane (look at the Windows Explorer's two status bars positioned over each of the two views to see exactly what I am trying to accomplish). It seems the best place to create a CStatusBarCtrl is in the Frame window's OnCreate(), using CCS_TOP style, then override the CStatusBarCtrl control's OnSize() and recalculate the horizontal sizes of the two paned status bar based on the sizes of the splitter panes. Am I on the right track? I can't find any examples of how to do this in my MSDN CD (July 96) or in Microsoft.com/kb. If I drop back to using CStatusBar, I can successfully create it in the correct position, but only with a single pane or with indicators. When I try to create a CStatusBarCtrl, it appears in the wrong location of the screen (overwrites the top of the splitter client area instead of inserting an additional client area to accomodate the control like with CStatusBar). Does anyone know where I can find an example? Thanks for your help. Erik Thomas E.J.Thomas & Associates ErikThomas@msn.com
Become an MFC-L member | Вернуться в корень Архива |