📄 resizablegrip.cpp
字号:
// 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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -