Re: multiple view SDI with WTL
"PaulH" <paul.heil@gmail.com> wrote in message
news:1160318371.039339.291200@k70g2000cwa.googlegroups.com
Okay, but in the CMainFrame(), how do I generically refer to a base
class of one of those views?
class CMainFrame : /*...*/
{
/*...*/
CSomeView m_View1;
CSomeView2 m_View2;
CSomeView3 m_View3;
/*???*/ *m_pCurrentView; //<--What do I call this?
That depends on what you want to do with m_pCurrentView. If all you want
is to call PreTranslateMessage through it, hold it as CMessageFilter*
pointer.
m_hWndClient = m_pCurrentView->Create(m_hWnd);
So you want both PreTranslateMessage and Create. One way would be to
define your own abstract class - something like this:
class CMyView : public CMessageFilter {
virtual HWND CreateMe(HWND parent) = 0;
};
template <class T>
class CMyViewImpl : public IDialogImpl<T>, public CMyView {
HWND CreateMe(HWND parent) { return Create(parent); }
};
Put any functionality you want to invoke generically into CMyView,
implement it in CMyViewImpl or in individual views as necessary.
If you don't want to bother with all this, and you are using VC7 and
above, be aware that IDD doesn't have to be a enum, it can be a member
variable. Like this:
class CMyViewImpl : public IDispatchImpl<CMyViewImpl> {
public:
UINT IDD;
};
class CView1 : public CMyViewImpl {
CView1() {
IDD = IDD_VIEW1;
}
};
--
With best wishes,
Igor Tandetnik
With sufficient thrust, pigs fly just fine. However, this is not
necessarily a good idea. It is hard to be sure where they are going to
land, and it could be dangerous sitting under them as they fly
overhead. -- RFC 1925