// ResizableGrip.cpp: implementation of the CResizableGrip class.
//
/////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2000-2001 by Paolo Messina
// (http://www.geocities.com/ppescher - ppescher@yahoo.com)
//
// The contents of this file are subject to the Artistic License (the "License").
// You may not use this file except in compliance with the License.
// You may obtain a copy of the License at:
// http://www.opensource.org/licenses/artistic-license.html
//
// If you find this code useful, credits would be nice!
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ResizableGrip.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CResizableGrip::CResizableGrip()
{
m_sizeGrip.cx = GetSystemMetrics(SM_CXVSCROLL);
m_sizeGrip.cy = GetSystemMetrics(SM_CYHSCROLL);
}
CResizableGrip::~CResizableGrip()
{
}
void CResizableGrip::UpdateGripPos()
{
// size-grip goes bottom right in the client area
// (any right-to-left adjustment should go here)
RECT rect;
GetResizableWnd()->GetClientRect(&rect);
rect.left = rect.right - m_sizeGrip.cx;
rect.top = rect.bottom - m_sizeGrip.cy;
// must stay below other children
m_wndGrip.SetWindowPos(&CWnd::wndBottom, rect.left, rect.top, 0, 0,
SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOREPOSITION);
// maximized windows cannot be resized
if (GetResizableWnd()->IsZoomed())
m_wndGrip.EnableWindow(FALSE);
else
m_wndGrip.EnableWindow(TRUE);
}
void CResizableGrip::ShowSizeGrip(BOOL bShow)
{
m_wndGrip.ShowWindow(bShow ? SW_SHOW : SW_HIDE);
}
BOOL CResizableGrip::InitGrip()
{
CRect rect(0 , 0, m_sizeGrip.cx, m_sizeGrip.cy);
BOOL bRet = m_wndGrip.Create(WS_CHILD | WS_CLIPSIBLINGS | SBS_SIZEGRIP,
rect, GetResizableWnd(), 0);
if (bRet)
{
// set a triangular window region
rect.OffsetRect(-rect.TopLeft());
POINT aPoints[] =
{
{ rect.left, rect.bottom },
{ rect.right, rect.bottom },
{ rect.right, rect.top }
};
CRgn rgnGrip;
rgnGrip.CreatePolygonRgn(aPoints, 3, WINDING);
m_wndGrip.SetWindowRgn((HRGN)rgnGrip.Detach(), FALSE);
// update pos
UpdateGripPos();
ShowSizeGrip();
}
return bRet;
}
LRESULT CResizableGrip::CSizeGrip::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == WM_NCHITTEST)
{
// choose proper cursor shape
if (IsRTL())
return HTBOTTOMLEFT;
else
return HTBOTTOMRIGHT;
}
return CScrollBar::WindowProc(message, wParam, lParam);
}