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

📄 fbctrls.cpp

📁 在VC编程环境下
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	文件:FBCtrls.cpp

	版权:Firebird Software Workroom

	声明:本源程序的版权受《中华人民共和国著作权法》以及其
		  它相关法律和条约的保护。任何有机会得到本源程序的
		  个人和机构,未经作者明确授权,不得将本源程序用于
		  任何商业目的(直接的或间接的)。对于非商业目的的使
		  用 (包括复制、传播、编译和修改), 原则上没有特别
		  的限制条款,但请在相关文档中说明其来源,并尊重原
		  作者的署名权。

	编写:秦传安(chings)	1999.12 - 2000.4

	联络:Tel:(0792)6323086	E_mail:chings@163.net
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
#include "fclstd.h"
#include "FBCtrls.h"
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

//######################################################################
//	class CFBToolBar
//	工具栏
//###################################################################
#define RT_TOOLBAR  MAKEINTRESOURCE(241)

struct TOOLBAR_DATA
{
	WORD wVersion;
	WORD wWidth;
	WORD wHeight;
	WORD wItemCount;

	WORD* items()
		{ return (WORD*)(this+1); }
};

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CFBToolBar::CFBToolBar()
{
	m_nHotItem = -1;
}

CFBToolBar::~CFBToolBar()
{
}
//////////////////////////////////////////////////////////////////////////////
//创建函数
BOOL CFBToolBar::Create(CFBWnd* pParent,DWORD style,UINT nID)
{
	if(!pParent)return FALSE;

	InitCommonControls();

	style |= WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS |
			  TBSTYLE_BUTTON | TBSTYLE_TOOLTIPS|TBSTYLE_FLAT|TBSTYLE_AUTOSIZE|TBSTYLE_TRANSPARENT|
			  CCS_NOPARENTALIGN|CCS_NOMOVEY|CCS_NODIVIDER|CCS_NORESIZE;

	BOOL bRet  = CFBWnd::Create(TOOLBARCLASSNAME,
						NULL,
						pParent->GetInstance(),
						pParent,
						style,
						NULL);

	if(bRet)
	{
		style = GetClassLong(m_hWnd,GCL_STYLE);
		style |= CS_PARENTDC;
		SetClassLong(m_hWnd,GCL_STYLE,style);
	}

	return bRet;
}
////////////////////////////////////////////////////////////////////////
BOOL CFBToolBar::OnCreate()
{
    SendMessage(m_hWnd,TB_BUTTONSTRUCTSIZE,(WPARAM) sizeof(TBBUTTON),0); 
	return TRUE;
}
////////////////////////////////////////////////////////////////////////
//窗口过程
LRESULT CFBToolBar::WindowProc(UINT msg,WPARAM wParam,LPARAM lParam)
{
	LRESULT lResult = 1;

	switch(msg)
	{
	case WM_COMMAND:
		if(m_pOwner)
			SendMessage(m_pOwner->m_hWnd,msg,wParam,lParam);
		lResult = 0;//WM_COMMAND 消息必须返回 0.
		break;
	case WM_NOTIFY:
		OnNotify((LPNMHDR)lParam,lResult);
		break;
	default:
		lResult = CFBWnd::WindowProc(msg,wParam,lParam);
		break;
	}

	return lResult;
}
///////////////////////////////////////////////////////////////////////////////
BOOL CFBToolBar::LoadToolBar(UINT nID)
{
	if(!m_hWnd)return FALSE;

	HRSRC hRsrc = ::FindResource(GetInstance(), MAKEINTRESOURCE(nID), RT_TOOLBAR);
	if (hRsrc == NULL)
		return FALSE;

	HGLOBAL hGlobal = LoadResource(GetInstance(), hRsrc);
	if (hGlobal == NULL)
		return FALSE;

	TOOLBAR_DATA* pData = (TOOLBAR_DATA*)LockResource(hGlobal);
	if (pData == NULL)
		return FALSE;

	BOOL bResult;
	TBBUTTON tbb;
	memset(&tbb,0,sizeof(TBBUTTON));
	tbb.iString = -1;
	int iImage = 0;

	for (int i = 0; i < pData->wItemCount; i++)
	{
		tbb.fsState = TBSTATE_ENABLED;
		tbb.idCommand = pData->items()[i];
		if(tbb.idCommand == 0)
		{
			tbb.fsStyle = TBSTYLE_SEP;
			tbb.iBitmap = -1;
		}
		else
		{
			tbb.fsStyle = TBSTYLE_BUTTON;
			tbb.iBitmap = iImage++;
		}

		bResult = AddButtons(1,&tbb);

		if(!bResult)return FALSE;
	}

	if(bResult)
	{
		TBADDBITMAP tbab;

		tbab.hInst = GetInstance();
		tbab.nID = nID;
		SendMessage(m_hWnd,TB_ADDBITMAP,(WPARAM)pData->wItemCount,(LPARAM)&tbab);
	}

	UnlockResource(hGlobal);
	FreeResource(hGlobal);

	return bResult;
}
////////////////////////////////////////////////////////////////////////////
void CFBToolBar::OnToolTip(LPTOOLTIPTEXT ptt)
{
	ptt->hinst = GetInstance();

	if(LoadString(GetInstance(),ptt->hdr.idFrom,m_pText,80) == 0)
		return;

	char* pchr = strchr(m_pText,'\n');

	if(pchr)
		pchr[0] = '\0';
	ptt->lpszText = m_pText;

	SendMessage(m_pOwner->m_hWnd,FBWM_NOTIFY,MAKEWPARAM(GetWndID(),FB_TTN_SHOWING),(LPARAM)(pchr+1));
}
/////////////////////////////////////////////////////////////////////
void CFBToolBar::OnNotify(LPNMHDR pNMHDR,LRESULT& lResult)
{
	lResult = 1;
	switch(pNMHDR->code)
	{
	case TTN_NEEDTEXT:
		if(GetHotItem() != m_nHotItem)
			OnToolTip((LPTOOLTIPTEXT)pNMHDR);
		break;
	case TTN_POP:
		SendMessage(m_pOwner->m_hWnd,FBWM_NOTIFY,MAKEWPARAM(GetWndID(),FB_TTN_HIDEN),0);
		break;
	case TBN_DROPDOWN:
		{
			LPNMTOOLBAR pnmtb = (LPNMTOOLBAR)pNMHDR;

			TBBUTTONINFOA tbi;
			tbi.cbSize = sizeof(tbi);
			tbi.dwMask = TBIF_COMMAND |TBIF_LPARAM;
			tbi.idCommand = pnmtb->iItem;

			int nIndex = SendMessage(m_hWnd,TB_COMMANDTOINDEX,(WPARAM)tbi.idCommand,0);

			SendMessage(m_hWnd,TB_GETBUTTONINFO,tbi.idCommand,(LPARAM)&tbi);
			HMENU hMenu = (HMENU)tbi.lParam;
			if(hMenu)
			{
				RECT rc;
				GetButtonRect(nIndex,&rc);
				ClientToScreen(m_hWnd,&rc);
				TrackPopupMenuEx(hMenu,
						TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_VERTICAL,
						rc.left,rc.bottom,m_pOwner->m_hWnd,NULL);
			}

			lResult = TBDDRET_DEFAULT;
		}
		break;
	case TBN_HOTITEMCHANGE:
		{
			LPNMTBHOTITEM phot = (LPNMTBHOTITEM)pNMHDR;
			if(phot->dwFlags & HICF_LEAVING)
				m_nHotItem = -1;
			else
				m_nHotItem = phot->idNew;
		}
		break;
	default:
		break;
	}
}
/////////////////////////////////////////////////////////////////////////
void CFBToolBar::CheckedButton(UINT uID,BOOL bCheck)
{
	UINT state = SendMessage(m_hWnd,TB_GETSTATE,uID,0);
	if(bCheck)
		state |= TBSTATE_CHECKED;
	else
		state &= ~TBSTATE_CHECKED;
	SendMessage(m_hWnd,TB_SETSTATE,uID,MAKELPARAM(state,0));
}
/////////////////////////////////////////////////////////////////////////////
void CFBToolBar::SetDropDowmBtn(UINT nID,HMENU hMenu)
{
	UINT style = SendMessage(m_hWnd,TB_GETEXTENDEDSTYLE,0,0);
	style |= TBSTYLE_EX_DRAWDDARROWS;
	SendMessage(m_hWnd,TB_SETEXTENDEDSTYLE,0,style);

	TBBUTTONINFOA tbi;
	tbi.cbSize = sizeof(tbi);
	tbi.dwMask = TBIF_STYLE|TBIF_LPARAM;
	tbi.idCommand = nID;

	SendMessage(m_hWnd,TB_GETBUTTONINFO,nID,(LPARAM)&tbi);

	tbi.fsStyle |= TBSTYLE_DROPDOWN;
	tbi.lParam = (LPARAM)hMenu;
	SendMessage(m_hWnd,TB_SETBUTTONINFO,nID,(LPARAM)&tbi);
}


//###################################################################
//	class CMenuBar
//	菜单栏
//###################################################################


#define MB_POPUPMENU		WM_USER+500
//////////////////////////////////////////////////////////////////////
//  构造函数和析构函数
//////////////////////////////////////////////////////////////////////

CMenuBar::CMenuBar()
{
	m_hMenu			= NULL;
	m_pMenu			= NULL;
}

CMenuBar::~CMenuBar()
{

}
////////////////////////////////////////////////////////////////////////////////
CMenuBar*		pMenuBar	= NULL;
HHOOK			g_hMsgHook	= NULL;
////////////////////////////////////////////////////////////////////////////////
LRESULT CMenuBar::MenuInputFilter(int nCode, WPARAM wParam, LPARAM lParam)
{
	MSG* pMsg = (MSG*)lParam;

	if(!pMenuBar || nCode!=MSGF_MENU)
		return CallNextHookEx(g_hMsgHook,nCode,wParam,lParam);
	if(pMenuBar->OnMenuInput(pMsg))
		return TRUE;
	else
		return CallNextHookEx(g_hMsgHook,nCode,wParam,lParam);
}
////////////////////////////////////////////////////////////////////////////
//	函数: LoadMenu
//	参数: hMenu		菜单句柄
//		  hMainWnd	主窗口句柄
//		  bRemove	是否移去窗口的主菜单
//	说明: 将菜单加载到工具栏上. 由于CMenuBar 是将主菜单从主窗口上剥离下来
//		  再加载到工具栏上, 所以应提供主窗口句柄以便向主窗口发送有关消息并让
//		  主窗口跟踪菜单命令
////////////////////////////////////////////////////////////////////////////
BOOL CMenuBar::LoadMenu(HMENU hMenu,BOOL bRemove)
{
	if(!m_hWnd || !hMenu)return FALSE;

	TBBUTTON		tbb; 
	int				i,nStr;
	BOOL			bRet;

	memset(&tbb,0,sizeof(TBBUTTON));

	tbb.fsState = TBSTATE_ENABLED;
	tbb.fsStyle = TBSTYLE_BUTTON|TBSTYLE_AUTOSIZE;

	m_nItemCount = GetMenuItemCount(hMenu);//菜单项目计数
	SetImageSize(0,0);//没有图标, 置图标尺寸为0.

	for(i=0;i<m_nItemCount;i++)
	{
		GetMenuString(hMenu,i,m_pText,80,MF_BYPOSITION);
		nStr = AddString(m_pText);
		tbb.iBitmap = -1;
		tbb.dwData = NULL;
		tbb.iString = nStr;
		tbb.idCommand = i+1;

		bRet = AddButtons(1,&tbb);

		if(!bRet)return FALSE;
	}

	if(bRemove)
		SetMenu(m_pOwner->m_hWnd,NULL);

	m_hMenu = hMenu;

	return bRet;
}
////////////////////////////////////////////////////////////////////////////
BOOL CMenuBar::LoadMenu(CFBMenu* pMenu,BOOL bRemove)
{
	if(!pMenu)
		return FALSE;

	return LoadMenu(pMenu->m_hMenu,bRemove);
}
///////////////////////////////////////////////////////////////////////
//窗口过程
LRESULT CMenuBar::WindowProc(UINT msg,WPARAM wParam,LPARAM lParam)
{
	LRESULT lResult = 1;

	switch(msg)
	{
	case WM_LBUTTONDOWN:
		OnLButtonDown(wParam,LOWORD(lParam),HIWORD(lParam));
		break;
	case MB_POPUPMENU:
		OnPopupMenu();
		break;
	case WM_MEASUREITEM:
		{
			LPMEASUREITEMSTRUCT pmis = (LPMEASUREITEMSTRUCT)lParam;
			if(pmis->CtlType == ODT_MENU && m_pMenu)
				m_pMenu->MeasureItem(pmis);
			else
				lResult = CFBToolBar::WindowProc(msg,wParam,lParam);
		}
		break;
	case WM_DRAWITEM:
		{
			LPDRAWITEMSTRUCT pds = (LPDRAWITEMSTRUCT)lParam;
			if(pds->CtlType == ODT_MENU && m_pMenu)
				m_pMenu->DrawItem(pds);
			else
				lResult = CFBToolBar::WindowProc(msg,wParam,lParam);
		}
		break;
	default:
		lResult = CFBToolBar::WindowProc(msg,wParam,lParam);
		break;
	}

	return lResult;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	函数: OnLButtonDown
void CMenuBar::OnLButtonDown(UINT fwKey,LONG x,LONG y)
{
	m_ptMouse.x = x;
	m_ptMouse.y = y;

⌨️ 快捷键说明

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