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

📄 switcherwnd.cpp

📁 visual c++ 实例编程
💻 CPP
字号:
// SwitcherWnd.cpp
//
// Programmed by: JIMMY BRUSH (Kathy007@email.msn.com)
// 
// Legal:
//
// THIS CODE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND.
// You may use and distribute this code provided that you do not
// remove this title header and that you do not charge money for
// it. If you want to update the code, feel free to do so, as long
// as you *mark your changes* in code AND in the revision log below
// (and send it to me ;)
//
//
//
// Version: 1.0 revision 1
//
// Revision Log:
//
// SUN MAR 14 1999 - JIMMY BRUSH -  Finished Writing version 1.0
// MON MAR 15 1999 - JIMMY BRUSH -  Fixed RemoveButton to correctly decrement selected button
//									Added CMemDC by Keith Rule
//									Fixed up Animation a bit
//
//
//
// In the next version \ Wish List:
//
// 1. Tool Tips in CSwitcherButton
// 2. Support for more buttons than can display (with the up/down button at the right)

#include "stdafx.h"
#include "SwitcherButton.h"
#include "SwitcherWnd.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define DEFAULTWIDTH 130
#define DEFAULTHEIGHT 25
#define MINWIDTH 24

/////////////////////////////////////////////////////////////////////////////
// CSwitcherWnd

CSwitcherWnd::CSwitcherWnd()
{
	m_iButtonWidth = DEFAULTWIDTH;
	m_iNextButtonStart = 0;
	m_iSelectedButton = -1;
}

CSwitcherWnd::~CSwitcherWnd()
{
}


BEGIN_MESSAGE_MAP(CSwitcherWnd, CWnd)
	//{{AFX_MSG_MAP(CSwitcherWnd)
	ON_WM_DESTROY()
	ON_WM_PAINT()
	ON_WM_SIZE()
	ON_WM_LBUTTONUP()
	//}}AFX_MSG_MAP
	ON_MESSAGE(SWM_SELCHANGE, OnSelChange)
	ON_MESSAGE(SWM_UNSELECT, OnUnselect)
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CSwitcherWnd message handlers

BOOL CSwitcherWnd::DoCreate(CWnd *parent, int x, int y, int cx, int cy, CString text)
{
	m_wndParent = parent;

	WNDCLASS myclass;
	myclass.style = CS_HREDRAW|CS_VREDRAW|CS_PARENTDC;
	myclass.lpfnWndProc = AfxWndProc;
	myclass.cbClsExtra = 0;
	myclass.cbWndExtra = 0;
	myclass.hInstance = AfxGetInstanceHandle();
	myclass.hIcon = NULL;
	myclass.hCursor = LoadCursor(NULL, IDC_ARROW);
	myclass.hbrBackground = NULL;
	myclass.lpszMenuName = NULL;
	myclass.lpszClassName = "SwitcherWndClass";
	AfxRegisterClass(&myclass);

	return Create("SwitcherWndClass", text, WS_CHILD|WS_VISIBLE, CRect(x,y,cx+x,cy+y), parent, 0);
}

BOOL CSwitcherWnd::AddButton(CString title, HICON icon)
{
	CRect rect;
	GetClientRect(&rect);

	CSwitcherButton* newbutton = new CSwitcherButton();
	newbutton->m_iIcon = icon;
	newbutton->m_iID = m_Buttons.GetSize();
	if (!newbutton->DoCreate(this, m_iNextButtonStart, rect.top, m_iButtonWidth, DEFAULTHEIGHT, title))
		return FALSE;

	m_Buttons.Add((void*)newbutton);
	m_iNextButtonStart += m_iButtonWidth + 3;

	if (m_iNextButtonStart-3 > rect.Width())
	{
		// this loop makes a neat little animation
		int newsize = (rect.Width() / (m_Buttons.GetSize())) - 3;
		register int y;
		for (y = m_iButtonWidth; y >= newsize; y-=3)
		{
			ResizeButtons(y);
			Sleep(15);
		}

		if (y != newsize) ResizeButtons(newsize);

		if (m_iButtonWidth < MINWIDTH)
		{
			// the smallest allowable button size has been reached...
			// in this version, we can't handle this
			ASSERT(0);
			return FALSE;
		}
	}
	return TRUE;
}

void CSwitcherWnd::OnDestroy() 
{
	RemoveAll();
	CWnd::OnDestroy();
}

void CSwitcherWnd::RemoveAll()
{
	// remove the first button over and over
	int size = m_Buttons.GetSize();
	for (int x = 1; x <= size; x++)
	{
		CSwitcherButton* btn = (CSwitcherButton*)m_Buttons.GetAt(0);
		delete btn;
		m_Buttons.RemoveAt(0);
	}

	m_iNextButtonStart = 0;
	m_iButtonWidth = DEFAULTWIDTH;
	m_iSelectedButton = -1;
}

void CSwitcherWnd::ResizeButtons(int NewSize)
{
	if (NewSize < MINWIDTH || NewSize > DEFAULTWIDTH)
		return;

	m_iButtonWidth = NewSize;
	m_iNextButtonStart = 0;

	for (register int x = 0; x < m_Buttons.GetSize(); x++)
	{
		CSwitcherButton* btn = (CSwitcherButton*)m_Buttons.GetAt(x);
		btn->SetWindowPos(NULL, m_iNextButtonStart, 0, m_iButtonWidth, DEFAULTHEIGHT, SWP_NOZORDER|SWP_NOCOPYBITS);
		m_iNextButtonStart += m_iButtonWidth + 3;
	}

	RedrawWindow();
}

void CSwitcherWnd::OnPaint() 
{
	CPaintDC dc(this); // device context for painting

	// simply paint it the window bg color
	CRect rect;
	GetClientRect(&rect);

	CBrush brush;
	brush.CreateSolidBrush(::GetSysColor(COLOR_3DFACE));
	dc.FillRect(&rect, &brush);
	brush.DeleteObject();
}

void CSwitcherWnd::OnSize(UINT nType, int cx, int cy) 
{
	CWnd::OnSize(nType, cx, cy);
	
	if (m_Buttons.GetSize() == 0)
		return;

	CRect rect;
	GetClientRect(&rect);

	int newsize = (rect.Width() / (m_Buttons.GetSize())) - 3;
	if (newsize <= DEFAULTWIDTH && m_iButtonWidth != newsize)
		ResizeButtons(newsize);
}

CSwitcherButton* CSwitcherWnd::GetButtonFromID(int id)
{
	return (CSwitcherButton*)m_Buttons.GetAt(id);
}

LRESULT CSwitcherWnd::OnSelChange(WPARAM wp, LPARAM)
{
	// sent when a button gets clicked
	CSwitcherButton* newsel = (CSwitcherButton*)wp;

	if (m_iSelectedButton > -1)
		GetButtonFromID(m_iSelectedButton)->Unselect();

	m_iSelectedButton = newsel->m_iID;

	return 1;
}

void CSwitcherWnd::OnLButtonUp(UINT nFlags, CPoint point) 
{
	CWnd::OnLButtonUp(nFlags, point);

	if (m_iSelectedButton > -1)
		GetButtonFromID(m_iSelectedButton)->Unselect();

	m_iSelectedButton = -1;
}

LRESULT CSwitcherWnd::OnUnselect(WPARAM, LPARAM)
{
	// sent when a button gets clicked when its selected
	// (which unselects it)
	m_iSelectedButton = -1;
	return 1;
}


BOOL CSwitcherWnd::RemoveButton(int index)
{
	if (index >= m_Buttons.GetSize() || index < 0)
	{
		ASSERT(0); // out of range
		return FALSE;
	}

	if (m_iSelectedButton == index)
		m_iSelectedButton = -1;
	if (m_iSelectedButton > index)
		m_iSelectedButton -= 1;

	delete GetButtonFromID(index);
	m_Buttons.RemoveAt(index);

	for (register int x = index; x < m_Buttons.GetSize(); x++)
		GetButtonFromID(x)->m_iID -= 1;

	m_iNextButtonStart -= m_iButtonWidth + 3;

	if (m_iButtonWidth != DEFAULTWIDTH)
	{
		// do that funky animation thing
		CRect rect;
		GetClientRect(&rect);
		int newsize = (rect.Width() / (m_Buttons.GetSize())) - 3;
		if (newsize > DEFAULTWIDTH) newsize = DEFAULTWIDTH;

		if (newsize > m_iButtonWidth)
		{
			register int y;
			for (y = m_iButtonWidth; y <= newsize; y+=3)
			{
				ResizeButtons(y);
				Sleep(15);
			}
			if (y != newsize) ResizeButtons(newsize);
		}
	}

	ResizeButtons(m_iButtonWidth);

	return TRUE;
}

// icon can be NULL to not search the icons, just text
int CSwitcherWnd::FindButton(CString text, HICON icon, int StartAt)
{
	if (StartAt < 0 || StartAt >= m_Buttons.GetSize())
	{
		ASSERT(0); // out of range
		return -1;
	}

	for (register int x = StartAt; x < m_Buttons.GetSize(); x++)
	{
		CSwitcherButton* btn = GetButtonFromID(x);
		CString title;
		btn->GetWindowText(title);

		if (icon == NULL)
		{
			if (title == text)
				return x;
		}
		else
		{
			if (title == text && icon == btn->m_iIcon)
				return x;
		}
	}

	return -1;
}

int CSwitcherWnd::GetSel()
{
	return m_iSelectedButton;
}

BOOL CSwitcherWnd::SetSel(int num)
{
	if (num < 0 || num >= m_Buttons.GetSize())
	{
		ASSERT(0); // out of range
		return FALSE;
	}

	if (m_iSelectedButton > -1)
		GetButtonFromID(m_iSelectedButton)->Unselect();

	GetButtonFromID(num)->Select();
	m_iSelectedButton = num;

	return TRUE;
}

CString CSwitcherWnd::GetButtonText(int id)
{
	if (id < 0 || id >= m_Buttons.GetSize())
	{
		ASSERT(0); // out of range
		return "";
	}

	CString retval = "";
	GetButtonFromID(id)->GetWindowText(retval);
	return retval;
}

HICON CSwitcherWnd::GetButtonIcon(int id)
{
	if (id < 0 || id >= m_Buttons.GetSize())
	{
		ASSERT(0); // out of range
		return NULL;
	}

	return GetButtonFromID(id)->m_iIcon;
}

// note that this is 1 greater than the last button ID
int CSwitcherWnd::GetNumButtons()
{
	return m_Buttons.GetSize();
}

BOOL CSwitcherWnd::ModifyButton(int index, CString text, HICON icon)
{
	if (index < 0 || index >= m_Buttons.GetSize())
	{
		ASSERT(0); // out of range
		return NULL;
	}

	CSwitcherButton* btn = GetButtonFromID(index);
	btn->SetWindowText(text);
	btn->m_iIcon = icon;
	btn->Refresh();

	return TRUE;
}

⌨️ 快捷键说明

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