|
|
// minifwnd.cpp : Defines the behaviors for the CMiniFrmWnd class.
//
#include "stdafx.h"
#include "global.h"
#include "pbrush.h"
#include "pbrusfrm.h"
#include "pbrusvw.h"
#include "docking.h"
#include "minifwnd.h"
#ifdef _DEBUG
#undef THIS_FILE
static CHAR BASED_CODE THIS_FILE[] = __FILE__; #endif
IMPLEMENT_DYNAMIC( CMiniFrmWnd, CFrameWnd )
#include "memtrace.h"
/***************************************************************************/
BEGIN_MESSAGE_MAP( CMiniFrmWnd, CFrameWnd ) ON_WM_NCLBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_RBUTTONDOWN() ON_WM_KEYDOWN() ON_WM_CREATE() ON_WM_SYSCOMMAND() ON_WM_MOVE() ON_WM_NCACTIVATE() ON_MESSAGE(WM_HELPHITTEST, OnHelpHitTest) ON_MESSAGE(WM_MOVING, OnMoving) END_MESSAGE_MAP()
static CString NEAR szClass;
/***************************************************************************/
CMiniFrmWnd::CMiniFrmWnd() { if (szClass.IsEmpty()) { // NOTE: we create this brush for use in WNDCLASS.hbrBackground.
// We intentionally don't delete it. It will be deleted by Windows
// when the class gets deleted (after app termination).
// HBRUSH hbrGrayBack = ::CreateSolidBrush( ::GetSysColor( COLOR_BTNTEXT ) );
szClass = AfxRegisterWndClass( CS_DBLCLKS, ::LoadCursor( NULL, IDC_ARROW ), (HBRUSH)(COLOR_BTNFACE + 1)/* hbrGrayBack */, NULL ); }
m_Dockable = CPBView::unknown; m_pDocking = NULL; }
/***************************************************************************/
BOOL CMiniFrmWnd::Create( const TCHAR FAR* lpWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd ) { return CFrameWnd::Create( szClass, lpWindowName, dwStyle | WS_POPUPWINDOW | WS_CAPTION, rect, pParentWnd, NULL, WS_EX_TOOLWINDOW | WS_EX_WINDOWEDGE, NULL ); }
/***************************************************************************/
void CMiniFrmWnd::OnNcLButtonDown( UINT nHitTest, CPoint pt ) { if (nHitTest == HTCAPTION && m_Dockable != CPBView::unknown) { m_pDocking = new CDocking;
ASSERT( m_pDocking );
if (m_pDocking) { CRect rect;
GetWindowRect( &rect );
if (! m_pDocking->Create( pt, rect, FALSE, m_Dockable )) { delete m_pDocking; m_pDocking = NULL; } } }
CFrameWnd::OnNcLButtonDown( nHitTest, pt ); }
/***************************************************************************/
void CMiniFrmWnd::OnLButtonUp( UINT nFlags, CPoint pt ) { CFrameWnd::OnLButtonUp( nFlags, pt ); }
/***************************************************************************/
int CMiniFrmWnd::OnCreate( LPCREATESTRUCT lpCreateStruct ) { CMenu* pMenu = GetSystemMenu(FALSE);
if (pMenu != NULL) { pMenu->RemoveMenu( 7, MF_BYPOSITION); pMenu->RemoveMenu( 5, MF_BYPOSITION); pMenu->RemoveMenu(SC_RESTORE , MF_BYCOMMAND); pMenu->RemoveMenu(SC_MINIMIZE, MF_BYCOMMAND); pMenu->RemoveMenu(SC_MAXIMIZE, MF_BYCOMMAND); pMenu->RemoveMenu(SC_TASKLIST, MF_BYCOMMAND); }
return CFrameWnd::OnCreate(lpCreateStruct); }
/***************************************************************************/
BOOL CMiniFrmWnd::OnCommand(UINT wParam, LONG lParam) { if (LOWORD(lParam) == 0 && wParam >= SC_SIZE) { PostMessage(WM_SYSCOMMAND, wParam, lParam); return TRUE; }
return CFrameWnd::OnCommand(wParam, lParam); }
/***************************************************************************/
void CMiniFrmWnd::OnSysCommand(UINT nID, LONG lParam) { switch (nID & 0xfff0) { case SC_PREVWINDOW: case SC_NEXTWINDOW: if (LOWORD( lParam ) == VK_F6) { GetParent()->SetFocus(); return; } break;
case SC_KEYMENU: if (LOWORD(lParam) != TEXT('-')) { GetParent()->SetActiveWindow(); GetParent()->SendMessage( WM_SYSCOMMAND, nID, lParam ); SetActiveWindow(); } return; }
CFrameWnd::OnSysCommand( nID, lParam ); }
/***************************************************************************/
LRESULT CMiniFrmWnd::OnHelpHitTest( WPARAM, LPARAM ) { ASSERT( GetHelpOffset() );
return HID_BASE_RESOURCE + GetHelpOffset(); }
/******************************************************************************/
void CMiniFrmWnd::OnRButtonDown( UINT nFlags, CPoint point ) { if (m_pDocking) PostMessage( WM_COMMAND, VK_ESCAPE );
CFrameWnd::OnRButtonDown( nFlags, point ); }
/******************************************************************************/
void CMiniFrmWnd::OnKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags ) { if (nChar == VK_ESCAPE && m_pDocking) CancelDrag();
CFrameWnd::OnKeyDown( nChar, nRepCnt, nFlags ); }
/***************************************************************************/
void CMiniFrmWnd::CancelDrag() { m_pDocking->Clear();
delete m_pDocking;
m_pDocking = NULL; }
/******************************************************************************/
LRESULT CMiniFrmWnd::OnMoving( WPARAM, LPARAM lprc ) { LRESULT lResult = 0;
if (m_pDocking) { CPoint pt; CRect rect( (LPRECT)lprc );
GetCursorPos( &pt );
m_pDocking->Move( pt, rect );
*((LPRECT)lprc) = rect; }
return lResult; }
/******************************************************************************/
void CMiniFrmWnd::OnMove( int x, int y ) { CFrameWnd::OnMove( x, y );
if (! m_pDocking) return;
CRect rect; BOOL bDocked = m_pDocking->Clear( &rect );
delete m_pDocking; m_pDocking = NULL;
CPBView* pView = (CPBView*)((CFrameWnd*)AfxGetMainWnd())->GetActiveView();
if (pView == NULL || ! pView->IsKindOf( RUNTIME_CLASS( CPBView ) )) return;
if (! bDocked) { pView->SetFloatPos( m_Dockable, rect ); return; }
}
/******************************************************************************/
BOOL CMiniFrmWnd::OnNcActivate(BOOL bActive) { //
// Work-around MFC bug - CMiniFrmWnd inherits from CFrameWnd,
// so it inherits the intentional bug in CFrameWnd::OnActivate
// MFC's CMiniFrameWnd has this hack, so does CMiniFrmWnd now...
//
if (m_nFlags & WF_KEEPMINIACTIVE) { return FALSE; }
return CFrameWnd::OnNcActivate(bActive); }
/******************************************************************************/
|