home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tricks of the Windows Gam…ming Gurus (2nd Edition)
/
Disc2.iso
/
vc98
/
mfc
/
src
/
viewform.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1998-06-16
|
8KB
|
288 lines
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#include "occimpl.h"
#ifdef AFX_CORE2_SEG
#pragma code_seg(AFX_CORE2_SEG)
#endif
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define new DEBUG_NEW
/////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CFormView, CScrollView)
//{{AFX_MSG_MAP(CFormView)
ON_WM_SETFOCUS()
ON_WM_CREATE()
//}}AFX_MSG_MAP
#ifndef _AFX_NO_CTL3D_SUPPORT
ON_MESSAGE(WM_QUERY3DCONTROLS, OnQuery3dControls)
#endif
#ifndef _AFX_NO_OCC_SUPPORT
ON_MESSAGE(WM_INITDIALOG, HandleInitDialog)
#endif
END_MESSAGE_MAP()
CFormView::CFormView(LPCTSTR lpszTemplateName)
{
m_lpszTemplateName = lpszTemplateName;
m_pCreateContext = NULL;
m_hWndFocus = NULL; // focus window is unknown
}
CFormView::CFormView(UINT nIDTemplate)
{
ASSERT_VALID_IDR(nIDTemplate);
m_lpszTemplateName = MAKEINTRESOURCE(nIDTemplate);
m_pCreateContext = NULL;
m_hWndFocus = NULL; // focus window is unknown
}
// virtual override of CWnd::Create
BOOL CFormView::Create(LPCTSTR /*lpszClassName*/, LPCTSTR /*lpszWindowName*/,
DWORD dwRequestedStyle, const RECT& rect, CWnd* pParentWnd, UINT nID,
CCreateContext* pContext)
{
ASSERT(pParentWnd != NULL);
ASSERT(m_lpszTemplateName != NULL);
m_pCreateContext = pContext; // save state for later OnCreate
#ifdef _DEBUG
// dialog template must exist and be invisible with WS_CHILD set
if (!_AfxCheckDialogTemplate(m_lpszTemplateName, TRUE))
{
ASSERT(FALSE); // invalid dialog template name
PostNcDestroy(); // cleanup if Create fails too soon
return FALSE;
}
#endif //_DEBUG
// initialize common controls
VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTLS_REG));
AfxDeferRegisterClass(AFX_WNDCOMMCTLSNEW_REG);
// call PreCreateWindow to get prefered extended style
CREATESTRUCT cs; memset(&cs, 0, sizeof(CREATESTRUCT));
if (dwRequestedStyle == 0)
dwRequestedStyle = AFX_WS_DEFAULT_VIEW;
cs.style = dwRequestedStyle;
if (!PreCreateWindow(cs))
return FALSE;
// create a modeless dialog
if (!CreateDlg(m_lpszTemplateName, pParentWnd))
return FALSE;
m_pCreateContext = NULL;
// we use the style from the template - but make sure that
// the WS_BORDER bit is correct
// the WS_BORDER bit will be whatever is in dwRequestedStyle
ModifyStyle(WS_BORDER|WS_CAPTION, cs.style & (WS_BORDER|WS_CAPTION));
ModifyStyleEx(WS_EX_CLIENTEDGE, cs.dwExStyle & WS_EX_CLIENTEDGE);
SetDlgCtrlID(nID);
CRect rectTemplate;
GetWindowRect(rectTemplate);
SetScrollSizes(MM_TEXT, rectTemplate.Size());
// initialize controls etc
if (!ExecuteDlgInit(m_lpszTemplateName))
return FALSE;
// force the size requested
SetWindowPos(NULL, rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top,
SWP_NOZORDER|SWP_NOACTIVATE);
// make visible if requested
if (dwRequestedStyle & WS_VISIBLE)
ShowWindow(SW_NORMAL);
return TRUE;
}
void CFormView::OnInitialUpdate()
{
ASSERT_VALID(this);
if (!UpdateData(FALSE))
TRACE0("UpdateData failed during formview initial update.\n");
CScrollView::OnInitialUpdate();
}
int CFormView::OnCreate(LPCREATESTRUCT lpcs)
{
// since we can't get the create context parameter passed in
// through CreateDialog, we use a temporary member variable
lpcs->lpCreateParams = (LPVOID)m_pCreateContext;
return CScrollView::OnCreate(lpcs);
}
void CFormView::OnActivateView(
BOOL bActivate, CView* pActivateView, CView* pDeactiveView)
{
if (SaveFocusControl())
return; // don't call base class when focus is already set
CView::OnActivateView(bActivate, pActivateView, pDeactiveView);
}
void CFormView::OnActivateFrame(UINT nState, CFrameWnd* /*pFrameWnd*/)
{
if (nState == WA_INACTIVE)
SaveFocusControl(); // save focus when frame loses activation
}
BOOL CFormView::SaveFocusControl()
{
// save focus window if focus is on this window's controls
HWND hWndFocus = ::GetFocus();
if (hWndFocus != NULL && ::IsChild(m_hWnd, hWndFocus))
{
m_hWndFocus = hWndFocus;
return TRUE;
}
return FALSE;
}
void CFormView::OnSetFocus(CWnd*)
{
if (!::IsWindow(m_hWndFocus) || !::IsChild(m_hWnd, m_hWndFocus))
{
// invalid or unknown focus window... let windows handle it
m_hWndFocus = NULL;
Default();
return;
}
// otherwise, set focus to the last known focus window
::SetFocus(m_hWndFocus);
}
BOOL CFormView::PreTranslateMessage(MSG* pMsg)
{
ASSERT(pMsg != NULL);
ASSERT_VALID(this);
ASSERT(m_hWnd != NULL);
// allow tooltip messages to be filtered
if (CView::PreTranslateMessage(pMsg))
return TRUE;
// don't translate dialog messages when in Shift+F1 help mode
CFrameWnd* pFrameWnd = GetTopLevelFrame();
if (pFrameWnd != NULL && pFrameWnd->m_bHelpMode)
return FALSE;
// since 'IsDialogMessage' will eat frame window accelerators,
// we call all frame windows' PreTranslateMessage first
pFrameWnd = GetParentFrame(); // start with first parent frame
while (pFrameWnd != NULL)
{
// allow owner & frames to translate before IsDialogMessage does
if (pFrameWnd->PreTranslateMessage(pMsg))
return TRUE;
// try parent frames until there are no parent frames
pFrameWnd = pFrameWnd->GetParentFrame();
}
// don't call IsDialogMessage if form is empty
if (::GetWindow(m_hWnd, GW_CHILD) == NULL)
return FALSE;
// filter both messages to dialog and from children
return PreTranslateInput(pMsg);
}
void CFormView::OnDraw(CDC* pDC)
{
ASSERT_VALID(this);
// do nothing - dialog controls will paint themselves,
// and Windows dialog controls do not support printing
#ifdef _DEBUG
if (pDC->IsPrinting())
TRACE0("Warning: CFormView does not support printing.\n");
#endif
UNUSED(pDC); // unused in release build
}
#ifndef _AFX_NO_OCC_SUPPORT
LRESULT CFormView::HandleInitDialog(WPARAM, LPARAM)
{
Default(); // allow default to initialize first (common dialogs/etc)
// create OLE controls
COccManager* pOccManager = afxOccManager;
if ((pOccManager != NULL) && (m_pOccDialogInfo != NULL))
{
if (!pOccManager->CreateDlgControls(this, m_lpszTemplateName,
m_pOccDialogInfo))
{
TRACE0("Warning: CreateDlgControls failed during form view init.\n");
return FALSE;
}
}
return FALSE; // don't set focus until later
}
BOOL CFormView::SetOccDialogInfo(_AFX_OCC_DIALOG_INFO* pOccDialogInfo)
{
m_pOccDialogInfo = pOccDialogInfo;
return TRUE;
}
#endif //!_AFX_NO_OCC_SUPPORT
//////////////////////////////////////////////////////////////////////////
// CFormView diagnostics
#ifdef _DEBUG
void CFormView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
dc << "m_lpszTemplateName = ";
if (HIWORD(m_lpszTemplateName) == 0)
dc << (int)LOWORD((DWORD)m_lpszTemplateName);
else
dc << m_lpszTemplateName;
dc << "\n";
}
void CFormView::AssertValid() const
{
CView::AssertValid();
}
#endif
#ifdef AFX_INIT_SEG
#pragma code_seg(AFX_INIT_SEG)
#endif
IMPLEMENT_DYNAMIC(CFormView, CScrollView)
//////////////////////////////////////////////////////////////////////////