123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- // 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);
- }
- #define RSZ_GRIP_OBJ _T("ResizableGrip")
- 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
- CRgn rgnGrip, rgn;
- rgn.CreateRectRgn(0,0,1,1);
- rgnGrip.CreateRectRgnIndirect(&rect);
-
- for (int y=0; y<m_sizeGrip.cy; y++)
- {
- rgn.SetRectRgn(0, y, m_sizeGrip.cx-y, y+1);
- rgnGrip.CombineRgn(&rgnGrip, &rgn, RGN_DIFF);
- }
- m_wndGrip.SetWindowRgn((HRGN)rgnGrip.Detach(), FALSE);
- // subclass control
- ::SetProp(m_wndGrip, RSZ_GRIP_OBJ,
- (HANDLE)::GetWindowLong(m_wndGrip, GWL_WNDPROC));
- ::SetWindowLong(m_wndGrip, GWL_WNDPROC, (LONG)GripWindowProc);
- // update pos
- UpdateGripPos();
- ShowSizeGrip();
- }
- return bRet;
- }
- LRESULT CResizableGrip::GripWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
- {
- WNDPROC oldWndProc = (WNDPROC)::GetProp(hwnd, RSZ_GRIP_OBJ);
- switch (msg)
- {
- case WM_NCHITTEST:
- // choose proper cursor shape
- if (IsRTL(hwnd))
- return HTBOTTOMLEFT;
- else
- return HTBOTTOMRIGHT;
- case WM_DESTROY:
-
- // unsubclass
- ::RemoveProp(hwnd, RSZ_GRIP_OBJ);
- ::SetWindowLong(hwnd, GWL_WNDPROC, (LONG)oldWndProc);
- break;
- }
- return ::CallWindowProc(oldWndProc, hwnd, msg, wParam, lParam);
- }
|