Revised based on comment:
Good thing you need is a static splitter window. The easiest way (I know) to create this is to start with the SDI MFC project and tell it that you want a splitter window (in the AppWizard, in the "User Interface Functions" section, check "Split window"). This will create a dynamic delimiter, i.e. It will start with only one panel, and you can create a second one by dragging the separation panel, but when you do this, you will only get two identical views (although you can scroll them separately from each other).
Then we need to do a little work to turn this from a dynamic splitter into a static splitter. It is probably best to start by looking at the code for a dynamic splitter. If you look at this CMainFrame application, you will find that it has:
CSplitterWnd m_wndSplitter;
If you look in the main frame of OnCreateClient , you will find something like this:
return m_wndSplitter.Create(this, 2, 2,
This is what we need to change - this is Create - this is what the dynamic delimiter creates. We need to get rid of this and create a static splitter instead. The first step for this is to create another presentation class - right now we have only one presentation class, but we want two, one for each panel.
The easiest way (which I know) to create our second presentation class is to run a second copy of VS and create another (separate) application. We will say that it runs the view class for this application with CListView . Then we take the files for this view and add them to our original project. To simplify the connection process, we want to make sure that this second project uses the same name for its document class, as it was done first.
At this moment, we have the code for our second view, but it is not associated with anything else, so the created view will not be visible. To make it visible, we must include its title in CMainframe.cpp (or any other name that it has in your target project). Then, back to OnCreateClient and replace the above code with the following:
CRect rect; GetClientRect(&rect); BOOL ret = m_wndSplitter.CreateStatic(this, 2, 1);
At the moment, I have created a horizontal split with “OriginalView” in the upper panel and “ListBaseView” in the lower panel, but (I think), it should be pretty obvious what changes to reorder the views.
From there, of course, you will have to write code in each view in order to do what it should do, but since each of them is still a separate, normal view, each of them is quite independent, so the development seems to be normal. The only significant difference is that you must follow the invalidation rules of your document, and (especially if one of the road views is for updating), you may want to use hints to indicate which part of the data was invalidated so that you can write each point The view updates only what is needed, and not just redraws all its data every time.