anchor.cpp

来自「利用flex写的C_minus的词法分析器」· C++ 代码 · 共 165 行

CPP
165
字号
#include "stdafx.h"
#include "anchor.h"

DONGAnchor::DONGAnchor()
{
	IsInit = false;
}

DONGAnchor::~DONGAnchor()
{
	m_AnchorInfo.RemoveAll();
	IsInit = false;
}

void DONGAnchor::Init(CWnd *pParent)
{
	RECT info;  
	pParent->GetClientRect(&info);
	DONGAnchorCtrlInfo AnchorInfo;
	AnchorInfo.pWnd = pParent;
	AnchorInfo.Width = info.right-info.left;
	AnchorInfo.Height = info.bottom - info.top;
	m_AnchorInfo.Add(AnchorInfo);
	IsInit = true;
}

bool DONGAnchor::Add(int ID, BYTE WhichSide)
{
	if(WhichSide>15)return false;
	DONGAnchorCtrlInfo AnchorInfo;
	RECT WinInfo,DlgInfo;
	AnchorInfo.pWnd = m_AnchorInfo[0].pWnd->GetDlgItem(ID);
	if(!AnchorInfo.pWnd)return false;
	AnchorInfo.WhichSide = WhichSide;			//指定要锁定的边
	AnchorInfo.pWnd->GetWindowRect(&WinInfo);
	m_AnchorInfo[0].pWnd->GetClientRect(&DlgInfo);
	m_AnchorInfo[0].pWnd->ClientToScreen(&DlgInfo);
	AnchorInfo.Width = WinInfo.right-WinInfo.left;
	AnchorInfo.Height = WinInfo.bottom-WinInfo.top;
	AnchorInfo.Distance.left = WinInfo.left-DlgInfo.left;
	AnchorInfo.Distance.right = DlgInfo.right-WinInfo.right;
	AnchorInfo.Distance.top = WinInfo.top-DlgInfo.top;
	AnchorInfo.Distance.bottom = DlgInfo.bottom-WinInfo.bottom;
	AnchorInfo.point.x = (DlgInfo.right-DlgInfo.left)/2 - AnchorInfo.Distance.left;
	AnchorInfo.point.y = (DlgInfo.bottom-DlgInfo.top)/2 - AnchorInfo.Distance.top;
	m_AnchorInfo.Add(AnchorInfo);
	return true;
}

bool DONGAnchor::Delete(int ID)
{
	CWnd* p = m_AnchorInfo[0].pWnd->GetDlgItem(ID);
	if(!p)return false;
	for(int i=1;i!=m_AnchorInfo.GetSize();++i)
	{
		if(p == m_AnchorInfo[i].pWnd)
		{
			m_AnchorInfo.RemoveAt(i);
			return true;
		}
	}
	return false;
}

void DONGAnchor::Run(int cx, int cy)
{
	if(!IsInit)return;			//没有初始化则直接返回
	if(!m_AnchorInfo[0].pWnd->IsWindowVisible())return;
	m_DlgCurSize.cx = cx;
	m_DlgCurSize.cy = cy;
	
	LONG x,y,width,height;
	for(int i=1;i!=m_AnchorInfo.GetSize();++i)
	{
		width = m_AnchorInfo[i].Width;
		height = m_AnchorInfo[i].Height;
		switch(m_AnchorInfo[i].WhichSide)
		{
		case DA_LEFT:
			x = m_AnchorInfo[i].Distance.left;
			y = m_DlgCurSize.cy /2 - m_AnchorInfo[i].point.y;
			break;
		case DA_RIGHT:
			x = m_DlgCurSize.cx - m_AnchorInfo[i].Distance.right - m_AnchorInfo[i].Width;
			y = m_DlgCurSize.cy /2 - m_AnchorInfo[i].point.y;
			break;
		case DA_TOP:
			x = m_DlgCurSize.cx /2 - m_AnchorInfo[i].point.x;
			y = m_AnchorInfo[i].Distance.top;			
			break;
		case DA_BOTTOM:
			x = m_DlgCurSize.cx /2 - m_AnchorInfo[i].point.x;
			y = m_DlgCurSize.cy - m_AnchorInfo[i].Distance.bottom - m_AnchorInfo[i].Height;
			break;
		case DA_LEFT|DA_RIGHT:
			x = m_AnchorInfo[i].Distance.left;
			y = m_DlgCurSize.cy /2 - m_AnchorInfo[i].point.y;
			m_AnchorInfo[i].Width += cx - m_AnchorInfo[0].Width;
			width = m_AnchorInfo[i].Width;
			break;
		case DA_LEFT|DA_TOP:
			continue;
			break;
		case DA_LEFT|DA_BOTTOM:
			x = m_AnchorInfo[i].Distance.left;
			y = m_DlgCurSize.cy - m_AnchorInfo[i].Distance.bottom - m_AnchorInfo[i].Height;
			break;
		case DA_RIGHT|DA_TOP:
			x = m_DlgCurSize.cx - m_AnchorInfo[i].Distance.right - m_AnchorInfo[i].Width;
			y = m_AnchorInfo[i].Distance.top;
			break;
		case DA_RIGHT|DA_BOTTOM:
			x = m_DlgCurSize.cx - m_AnchorInfo[i].Distance.right - m_AnchorInfo[i].Width;
			y = m_DlgCurSize.cy - m_AnchorInfo[i].Distance.bottom - m_AnchorInfo[i].Height;
			break;
		case DA_TOP|DA_BOTTOM:
			x = m_DlgCurSize.cx /2 - m_AnchorInfo[i].point.x;
			y = m_AnchorInfo[i].Distance.top;
			m_AnchorInfo[i].Height += cy - m_AnchorInfo[0].Height;
			height = m_AnchorInfo[i].Height;
			break;
		case DA_LEFT|DA_RIGHT|DA_TOP:
			x = m_AnchorInfo[i].Distance.left;
			y = m_AnchorInfo[i].Distance.top;
			m_AnchorInfo[i].Width += cx - m_AnchorInfo[0].Width;
			width = m_AnchorInfo[i].Width;
			break;
		case DA_LEFT|DA_RIGHT|DA_BOTTOM:
			x = m_AnchorInfo[i].Distance.left;
			y = m_DlgCurSize.cy - m_AnchorInfo[i].Distance.bottom - m_AnchorInfo[i].Height;
			m_AnchorInfo[i].Width += cx - m_AnchorInfo[0].Width;
			width = m_AnchorInfo[i].Width;
			break;
		case DA_RIGHT|DA_TOP|DA_BOTTOM:
			x = m_DlgCurSize.cx - m_AnchorInfo[i].Distance.right - m_AnchorInfo[i].Width;
			y = m_AnchorInfo[i].Distance.top;
			m_AnchorInfo[i].Height += cy - m_AnchorInfo[0].Height;
			height = m_AnchorInfo[i].Height;
			break;
		case DA_LEFT|DA_TOP|DA_BOTTOM:
			x = m_AnchorInfo[i].Distance.left;
			y = m_AnchorInfo[i].Distance.top;
			m_AnchorInfo[i].Height += cy - m_AnchorInfo[0].Height;
			height = m_AnchorInfo[i].Height;
			break;
		case DA_LEFT|DA_RIGHT|DA_TOP|DA_BOTTOM:
			x = m_AnchorInfo[i].Distance.left;
			y = m_AnchorInfo[i].Distance.top;
			m_AnchorInfo[i].Width += cx - m_AnchorInfo[0].Width;
			width = m_AnchorInfo[i].Width;
			m_AnchorInfo[i].Height += cy - m_AnchorInfo[0].Height;
			height = m_AnchorInfo[i].Height;
			break;
		case NULL:
			x =  m_DlgCurSize.cx /2 - m_AnchorInfo[i].point.x;
			y =  m_DlgCurSize.cy /2 - m_AnchorInfo[i].point.y;
			break;
		}		
		m_AnchorInfo[i].pWnd->MoveWindow(x,y,width,height);	
		m_AnchorInfo[i].pWnd->Invalidate();			//重画控件
	}
	m_AnchorInfo[0].pWnd->Invalidate();
	m_AnchorInfo[0].Width = cx;
	m_AnchorInfo[0].Height = cy;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?