home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tricks of the Windows Gam…ming Gurus (2nd Edition)
/
Disc2.iso
/
vc98
/
mfc
/
src
/
olebar.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1998-06-16
|
5KB
|
187 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"
#ifdef AFX_OLE4_SEG
#pragma code_seg(AFX_OLE4_SEG)
#endif
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define new DEBUG_NEW
/////////////////////////////////////////////////////////////////////////////
// COleResizeBar
COleResizeBar::COleResizeBar()
{
// setup the state flags to do resize handles outside with hatched border
m_tracker.m_nStyle =
CRectTracker::hatchedBorder|CRectTracker::resizeOutside|
CRectTracker::solidLine;
// the actual rectangle is updated in COleResizeBar::OnSize
}
COleResizeBar::~COleResizeBar()
{
}
BOOL COleResizeBar::Create(CWnd* pParentWnd, DWORD dwStyle, UINT nID)
{
ASSERT_VALID(this);
if (pParentWnd != NULL)
ASSERT_VALID(pParentWnd); // must have a parent
// force WS_CLIPSIBLINGS (avoids SetWindowPos bugs)
dwStyle |= WS_CLIPSIBLINGS;
VERIFY(AfxDeferRegisterClass(AFX_WNDCONTROLBAR_REG));
// create the HWND
CRect rect;
rect.SetRectEmpty();
// Note: Parent must resize itself for control bar to be resized
return CWnd::Create(AFX_WNDCONTROLBAR, NULL, dwStyle, rect, pParentWnd, nID);
}
/////////////////////////////////////////////////////////////////////////////
// COleResizeBar message handling
BEGIN_MESSAGE_MAP(COleResizeBar, CControlBar)
//{{AFX_MSG_MAP(COleResizeBar)
ON_WM_ERASEBKGND()
ON_WM_PAINT()
ON_WM_SIZE()
ON_WM_SETCURSOR()
ON_WM_LBUTTONDOWN()
ON_MESSAGE(WM_SIZEPARENT, OnSizeParent)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL COleResizeBar::OnEraseBkgnd(CDC*)
{
return TRUE; // no erasing necessary
}
void COleResizeBar::OnPaint()
{
CPaintDC dc(this);
// always use the same brush origin
CRect rect;
GetWindowRect(&rect);
dc.SetBrushOrg(rect.left & 7, rect.top & 7);
// draw it
m_tracker.Draw(&dc);
}
void COleResizeBar::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/)
{
GetClientRect(&m_tracker.m_rect);
int nHandleSize = m_tracker.m_nHandleSize;
m_tracker.m_rect.InflateRect(-nHandleSize, -nHandleSize);
}
BOOL COleResizeBar::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// hit-test the tracker -- we only care about hits on handles
CPoint point;
::GetCursorPos(&point);
ScreenToClient(&point);
int hit = m_tracker.HitTest(point);
if (hit < 0)
return CControlBar::OnSetCursor(pWnd, nHitTest, message);
// let the tracker handle setting the cursor
return m_tracker.SetCursor(pWnd, nHitTest);
}
void COleResizeBar::OnLButtonDown(UINT /*nFlags*/, CPoint point)
{
// track to parent of the parent
CWnd* pFrameWnd = GetParentFrame();
ASSERT_VALID(pFrameWnd);
CWnd* pParent = pFrameWnd->GetParent();
pFrameWnd->UpdateWindow(); // update ourselves
// limit tracking to parent client rectangle
if (pParent != NULL)
{
pParent->UpdateWindow(); // always update before tracking
// clip cursor to parent window
CRect rect;
pParent->GetClientRect(&rect);
pParent->ClientToScreen(&rect);
::ClipCursor(&rect);
}
// save the rect, track, then restore
CRect rectSave = m_tracker.m_rect;
BOOL bNotify = m_tracker.Track(this, point, FALSE, pParent);
CRect rectNew = m_tracker.m_rect;
m_tracker.m_rect = rectSave;
// allow full mouse movement again
::ClipCursor(NULL);
// notify owner window if tracker changed
if (bNotify)
{
CWnd* pOwner = GetOwner();
ASSERT_VALID(pOwner);
// convert relative to parent coordinates
ClientToScreen(&rectNew);
pOwner->ScreenToClient(&rectNew);
// send notification to owner
pOwner->SendMessage(WM_SIZECHILD, (WPARAM)_AfxGetDlgCtrlID(m_hWnd),
(LPARAM)(LPCRECT)&rectNew);
}
}
LRESULT COleResizeBar::OnSizeParent(WPARAM, LPARAM lParam)
{
AFX_SIZEPARENTPARAMS* lpLayout = (AFX_SIZEPARENTPARAMS*)lParam;
// only resize the window if doing layout and not just rect query
if (lpLayout->hDWP != NULL)
AfxRepositionWindow(lpLayout, m_hWnd, &lpLayout->rect);
// always adjust the rectangle after the resize
int nHandleSize = m_tracker.m_nHandleSize;
::InflateRect(&lpLayout->rect, -nHandleSize, -nHandleSize);
return 0;
}
void COleResizeBar::OnUpdateCmdUI(CFrameWnd* /*pTarget*/,
BOOL /*bDisableIfNoHndler*/)
{
// just do nothing
}
#ifdef AFX_INIT_SEG
#pragma code_seg(AFX_INIT_SEG)
#endif
IMPLEMENT_DYNAMIC(COleResizeBar, CControlBar)
/////////////////////////////////////////////////////////////////////////////