⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtscrollcontrolcontainer.cpp

📁 vc++编写的界面源代码,对C++爱好者是很发的帮助。
💻 CPP
字号:
// RTScrollControlContainer.cpp : 实现文件
//

#include "stdafx.h"
#include "RTScrollControlContainer.h"


// CRTScrollControlContainer

IMPLEMENT_DYNAMIC(CRTScrollControlContainer, CWnd)
CRTScrollControlContainer::CRTScrollControlContainer()
{
	m_Control = NULL;
}

CRTScrollControlContainer::~CRTScrollControlContainer()
{
}


BEGIN_MESSAGE_MAP(CRTScrollControlContainer, CWnd)
	ON_WM_HSCROLL()
	ON_WM_VSCROLL()
	ON_WM_SIZE()
	ON_WM_ERASEBKGND()
END_MESSAGE_MAP()



// CRTScrollControlContainer 消息处理程序


void CRTScrollControlContainer::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	m_Control->SendMessage(WM_HSCROLL,MAKEWPARAM(nSBCode,nPos),NULL);
}

void CRTScrollControlContainer::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	m_Control->SendMessage(WM_VSCROLL,MAKEWPARAM(nSBCode,nPos),NULL);
}

BOOL CRTScrollControlContainer::Create(CWnd* pControl)
{
	if(pControl == NULL)return FALSE;

	m_Control = pControl;

	CRect rtWnd;
	pControl->GetWindowRect(&rtWnd);
	pControl->GetParent()->ScreenToClient(&rtWnd);
	DWORD style = WS_CHILD|WS_VISIBLE;
	DWORD ExStyle = 0;
    DWORD MoveStyle = 0;
	DWORD MoveExStyle = 0;
	DWORD ListStyle = pControl->GetStyle();
	DWORD ListExStyle = pControl->GetExStyle();

	if((ListStyle & WS_BORDER) == WS_BORDER)
	{
		style |= WS_BORDER;
		MoveStyle = WS_BORDER;
	}
	if((ListStyle & WS_DLGFRAME) == WS_DLGFRAME)
	{
		style |= WS_DLGFRAME;
		MoveStyle |= WS_DLGFRAME;
	}
	if((ListExStyle & WS_EX_CLIENTEDGE) == WS_EX_CLIENTEDGE)
	{
		ExStyle |= WS_EX_CLIENTEDGE;
		MoveExStyle |= WS_EX_CLIENTEDGE;
	}
	if((ListExStyle & WS_EX_STATICEDGE) == WS_EX_STATICEDGE)
	{
		ExStyle |= WS_EX_STATICEDGE;
		MoveExStyle |= WS_EX_STATICEDGE;
	}
	if((ListExStyle & WS_EX_WINDOWEDGE ) == WS_EX_WINDOWEDGE)
	{
		ExStyle |= WS_EX_WINDOWEDGE;
		MoveExStyle |= WS_EX_WINDOWEDGE;
	}

	if(!CreateEx(ExStyle,NULL,NULL,style,rtWnd,pControl->GetParent(),65535))return FALSE;

	pControl->SetParent(this);
	GetClientRect(&rtWnd);

	pControl->ModifyStyle(MoveStyle,0);
	pControl->ModifyStyleEx(MoveExStyle,0);
	
	m_VerScrollBar.Create(WS_CHILD|SBS_VERT,CRect(0,0,0,0),pControl->GetParent(),65535);
	m_HorScrollBar.Create(WS_CHILD|SBS_HORZ,CRect(0,0,0,0),pControl->GetParent(),65535);
	m_VerScrollBar.SetSizeArea(CRTScrollBar::AreaBottom);
	InitializeFlatSB(pControl->m_hWnd);
	FlatSB_EnableScrollBar(pControl->m_hWnd, SB_BOTH, ESB_DISABLE_BOTH);
	FlatSB_ShowScrollBar(pControl->m_hWnd,SB_BOTH,FALSE);
	ReSize();
	return 0;
}

void CRTScrollControlContainer::OnSize(UINT nType, int cx, int cy)
{
	CWnd::OnSize(nType, cx, cy);

	if(!IsWindow(m_HorScrollBar.m_hWnd))return;
	if(!IsWindow(m_VerScrollBar.m_hWnd))return;
	if(!IsWindow(m_Control->m_hWnd))return;
	ReSize();
}


void CRTScrollControlContainer::ReSize(void)
{
	if(m_Control == NULL)return;
	CRect rtWnd;
	GetClientRect(&rtWnd);

	CRect rtList;
	CRect rtVer;
	CRect rtHor;

	DWORD ListExStyle = m_Control->GetExStyle();
	int ScrollWidth = 0;
	int ScrollHeight = 0;

	if(m_VerScrollBar.IsWindowVisible())
	{
		ScrollWidth = GetSystemMetrics(SM_CXVSCROLL);
	}
	
	if(m_HorScrollBar.IsWindowVisible())
	{
		ScrollHeight = GetSystemMetrics(SM_CYHSCROLL);
	}

	if((ListExStyle & WS_EX_RIGHTSCROLLBAR) == WS_EX_RIGHTSCROLLBAR)
	{
		rtList.SetRect(rtWnd.left,rtWnd.top,rtWnd.right - ScrollWidth,rtWnd.bottom - ScrollHeight);
		rtVer.SetRect(rtList.right,rtWnd.top,rtWnd.right,rtWnd.bottom);
		rtHor.SetRect(rtWnd.left,rtList.bottom,rtList.right,rtWnd.bottom);
	}
	else
	{
		rtList.SetRect(rtWnd.left + ScrollWidth,rtWnd.top,rtWnd.right,rtWnd.bottom - ScrollHeight);
		rtVer.SetRect(rtWnd.left,rtWnd.top,rtList.left,rtWnd.bottom);
		rtHor.SetRect(rtList.left,rtList.bottom,rtWnd.right,rtWnd.bottom);
	}
	if(IsWindow(m_Control->m_hWnd))m_Control->MoveWindow(&rtList);
	if(IsWindow(m_VerScrollBar.m_hWnd))m_VerScrollBar.MoveWindow(&rtVer);
	if(IsWindow(m_HorScrollBar.m_hWnd))m_HorScrollBar.MoveWindow(&rtHor);
}

void CRTScrollControlContainer::SetHorPos(int pos, BOOL redraw)
{
	m_HorScrollBar.SetPos(pos,redraw);
}

void CRTScrollControlContainer::SetVerRange(int nmin, int nmax,BOOL redraw)
{
	DWORD style = m_Control->GetStyle();

	if((style & WS_VSCROLL) == WS_VSCROLL)
	{
		if(!m_VerScrollBar.IsWindowVisible())
		{
			m_VerScrollBar.ShowWindow(SW_SHOW);
			if(m_HorScrollBar.IsWindowVisible())
			{
				m_VerScrollBar.SetSizeArea(CRTScrollBar::AreaBottom);
			}
			else
			{
				m_VerScrollBar.SetSizeArea(CRTScrollBar::AreaNone);
			}
			ReSize();
		}
	}
	else
	{
		if(m_VerScrollBar.IsWindowVisible())
		{
			m_VerScrollBar.ShowWindow(SW_HIDE);
			ReSize();
		}
	}
	m_VerScrollBar.SetRange(nmin,nmax,redraw);
}


void CRTScrollControlContainer::SetVerPos(int pos, BOOL redraw)
{
	m_VerScrollBar.SetPos(pos,redraw);
}

void CRTScrollControlContainer::SetHorRange(int nmin, int nmax,BOOL redraw)
{
	DWORD style = m_Control->GetStyle();

	if((style & WS_HSCROLL) == WS_HSCROLL)
	{
		if(!m_HorScrollBar.IsWindowVisible())
		{
			m_HorScrollBar.ShowWindow(SW_SHOW);
			m_VerScrollBar.SetSizeArea(CRTScrollBar::AreaBottom);
			ReSize();
		}
	}
	else
	{
		if(m_HorScrollBar.IsWindowVisible())
		{
			m_HorScrollBar.ShowWindow(SW_HIDE);
			m_VerScrollBar.SetSizeArea(CRTScrollBar::AreaNone);
			ReSize();
		}
	}
	
	m_HorScrollBar.SetRange(nmin,nmax,redraw);
}

BOOL CRTScrollControlContainer::OnEraseBkgnd(CDC* pDC)
{
	return TRUE;
}

BOOL CRTScrollControlContainer::PassMessage(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam, LRESULT* lpResult)
{
	return FALSE;
}

LRESULT CRTScrollControlContainer::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	if(message > WM_USER)
	{
		CWnd* pParent = GetParent();
		if(pParent != NULL)pParent->SendMessage(message,wParam,lParam);
	}
	return CWnd::WindowProc(message, wParam, lParam);
}

⌨️ 快捷键说明

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