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

📄 fbctrls.cpp

📁 在VC编程环境下
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	int nTest = SendMessage(m_hWnd,TB_HITTEST,0,(LPARAM)&m_ptMouse);

	if(nTest<0 || nTest>=m_nItemCount)
		return;

	m_nPressed = nTest;
	TrackPopup();
}
//////////////////////////////////////////////////////////////////////////
//跟踪弹出子菜单
/////////////////////////////////////////////////////////////////////////
void CMenuBar::TrackPopup()
{
	HMENU hSubMenu = GetSubMenu(m_hMenu,m_nPressed);//得到子菜单句柄
	if(hSubMenu == NULL)return;

	m_bTrack = TRUE;
	PressButton(m_nPressed,TRUE);//压下按钮

	//得到按钮矩形
	RECT rc;
	GetButtonRect(m_nPressed,&rc);
	ClientToScreen(m_hWnd,&rc);

	TPMPARAMS tpm;
	tpm.cbSize = sizeof(tpm);
	tpm.rcExclude = rc;

	//设置钩子函数
	pMenuBar = this;
	g_hMsgHook = SetWindowsHookEx(WH_MSGFILTER,
			MenuInputFilter, NULL, GetCurrentThreadId());

	//跟踪菜单弹出
	TrackPopupMenuEx(hSubMenu,
				TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_VERTICAL,
				rc.left,rc.bottom,m_pOwner->m_hWnd,&tpm);

	PressButton(m_nPressed,FALSE);
	UnhookWindowsHookEx(g_hMsgHook);//解除钩子函数

	g_hMsgHook = NULL;
	pMenuBar = NULL;
}
/////////////////////////////////////////////////////////////////////////////////
BOOL CMenuBar::OnMenuInput(MSG* pMsg)
{
	BOOL bResult = FALSE;

	switch(pMsg->message)
	{
	case WM_MOUSEMOVE:
		{
			POINT pt;
			pt.x = LOWORD(pMsg->lParam);
			pt.y = HIWORD(pMsg->lParam);
			ScreenToClient(m_hWnd,&pt);
			if(m_ptMouse.x == pt.x && m_ptMouse.y == pt.y)
				return TRUE;
		
			m_ptMouse.x = pt.x;
			m_ptMouse.y = pt.y;

			int nTest = SendMessage(m_hWnd,TB_HITTEST,0,(LPARAM)&pt);

			if(nTest>=0 && nTest<m_nItemCount && nTest != m_nPressed)
			{
				PressButton(m_nPressed,FALSE);
				PostMessage(m_pOwner->m_hWnd,WM_CANCELMODE,0,0);
				m_nPressed = nTest;
				PostMessage(m_hWnd,MB_POPUPMENU,0,0);
				bResult = TRUE;
			}
		}
		break;
	case WM_LBUTTONDOWN:
		{
			POINT pt;
			pt.x = LOWORD(pMsg->lParam);
			pt.y = HIWORD(pMsg->lParam);
			ScreenToClient(m_hWnd,&pt);
			PostMessage(m_pOwner->m_hWnd,FBWM_NOTIFY,MAKEWPARAM(GetWndID(),FB_TTN_HIDEN),0);

			int nTest = SendMessage(m_hWnd,TB_HITTEST,0,(LPARAM)&pt);

			if(nTest<0)
				m_bTrack = FALSE;
			else if(nTest == m_nPressed)
			{
				m_bTrack = FALSE;
				PostMessage(m_pOwner->m_hWnd,WM_CANCELMODE,0,0);
				bResult = TRUE;
			}
		}
		break;
	case WM_KEYDOWN:
		{
			TCHAR vkey = pMsg->wParam;
			if(vkey == VK_LEFT)
			{
				PressButton(m_nPressed,FALSE);
				m_nPressed --;
				PostMessage(m_pOwner->m_hWnd,WM_CANCELMODE,0,0);
				PostMessage(m_hWnd,MB_POPUPMENU,0,0);
				bResult = TRUE;
			}
			else if(vkey == VK_RIGHT)
			{
				PressButton(m_nPressed,FALSE);
				m_nPressed ++;
				PostMessage(m_pOwner->m_hWnd,WM_CANCELMODE,0,0);
				PostMessage(m_hWnd,MB_POPUPMENU,0,0);
				bResult = TRUE;
			}
			else if (vkey == VK_ESCAPE)
			{
				PostMessage(m_pOwner->m_hWnd,FBWM_NOTIFY,MAKEWPARAM(GetWndID(),FB_TTN_HIDEN),0);
				PostMessage(m_pOwner->m_hWnd,WM_CANCELMODE,0,0);
				m_bTrack = FALSE;
				bResult = TRUE;
			}
		}
		break;
	case WM_MENUSELECT:
		OnMenuSelect(pMsg->wParam,pMsg->lParam);
		break;
	default:
		break;
	}

	return bResult;
}
////////////////////////////////////////////////////////////////////////////
void CMenuBar::OnPopupMenu()
{
	if(m_nPressed<0)
		m_nPressed = m_nItemCount - 1;
	if(m_nPressed>=m_nItemCount)
		m_nPressed = 0;
	TrackPopup();
}
//////////////////////////////////////////////////////////////////////////////
void CMenuBar::OnMenuSelect(WPARAM wParam,LPARAM lParam)
{
	UINT uItem = (UINT) LOWORD(wParam);
	if(!LoadString(GetInstance(),uItem,m_pText,80))
	{
		strcpy(m_pText,"\n就绪");
	}

	char* pchr = strchr(m_pText,'\n');
	if(pchr >= (m_pText+80))
	{
		strcpy(m_pText,"\n就绪");
		pchr = m_pText;
	}
	SendMessage(m_pOwner->m_hWnd,FBWM_NOTIFY,MAKEWPARAM(GetWndID(),FB_TTN_SHOWING),(LPARAM)pchr+1);
}
/////////////////////////////////////////////////////////////////////////
void CMenuBar::CheckMenuItem(UINT uID,BOOL bCheck)
{
	UINT flag;
	if(bCheck)
		flag = MF_CHECKED;
	else
		flag = MF_UNCHECKED;
	::CheckMenuItem(m_hMenu,uID,flag);
}
/////////////////////////////////////////////////////////////////////////
BOOL CMenuBar::GetMenuItemCheckState(UINT uID)
{
	MENUITEMINFO miif;
	miif.cbSize = sizeof(miif);
	miif.fMask = MIIM_ID|MIIM_STATE;
	miif.wID =uID;
	GetMenuItemInfo(m_hMenu,uID,FALSE,&miif);

	if(miif.fState&MFS_CHECKED)
		return TRUE;
	else
		return FALSE;
}
//////////////////////////////////////////////////////////////////////
BOOL CMenuBar::EnableMenuItem(UINT uID,BOOL bEnable)
{
	MENUITEMINFO miif;
	miif.cbSize = sizeof(miif);
	miif.fMask = MIIM_ID|MIIM_STATE;
	miif.wID =uID;
	if(bEnable)
		miif.fState = MFS_ENABLED;
	else
		miif.fState = MFS_DISABLED;
	
	return SetMenuItemInfo(m_hMenu,uID,FALSE,&miif);
}

//////////////////////////////////////////////////////////////////////

//###################################################################
//	class CFBStatusBar
//	状态栏
//###################################################################

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

CFBStatusBar::CFBStatusBar()
{

}

CFBStatusBar::~CFBStatusBar()
{

}
/////////////////////////////////////////////////////////////////////
CFBStatusBar::Create(CFBWnd* pParent,UINT uID)
{
	if(!pParent)return FALSE;

	InitCommonControls();

	DWORD style = WS_VISIBLE|WS_CHILD|WS_CLIPSIBLINGS|
				  CCS_NOPARENTALIGN|CCS_NODIVIDER|CCS_NORESIZE |
				  WS_CLIPCHILDREN|SBARS_SIZEGRIP;

	return CFBWnd::Create(STATUSCLASSNAME,
						NULL,
						pParent->GetInstance(),
						pParent,
						style);
}
////////////////////////////////////////////////////////////////////////////
LRESULT CFBStatusBar::WindowProc(UINT msg,WPARAM wParam,LPARAM lParam)
{
	if(msg == WM_LBUTTONUP || msg == WM_LBUTTONDBLCLK)
		return DefWindowProc(m_hWnd,msg,wParam,lParam);

	return CFBWnd::WindowProc(msg,wParam,lParam);
}
////////////////////////////////////////////////////////////////////////////////////////////
void CFBStatusBar::SetText(int nIndex,LPCTSTR strText)
{
	if(nIndex<0 || nIndex>m_nParts)return;

	SendMessage(m_hWnd,SB_SETTEXT,(WPARAM)nIndex,(LPARAM)strText);

}
////////////////////////////////////////////////////////////////////////////////////////////
void CFBStatusBar::SetParts(int nParts,LPINT lpParts)
{
	if(!nParts)return;

	m_nParts = nParts;
	SendMessage(m_hWnd, SB_SETPARTS, (WPARAM) m_nParts,(LPARAM)lpParts);
}
////////////////////////////////////////////////////////////////////////////////////////////
void CFBStatusBar::ReCalcLayout(LPRECT pRect)
{
	if(!IsShow())
		return;

	RECT rc;
	CopyRect(&rc,pRect);
	int pParts[32];
	SendMessage(m_hWnd,SB_GETPARTS,(WPARAM)m_nParts,(LPARAM)pParts);
	int space = (int)(pRect->right - pRect->left - pParts[m_nParts-1])/m_nParts;
	int sp = 0;
	for(int i=0;i<m_nParts;i++)
	{
		sp += space;
		pParts[i] += sp;
	}
	SendMessage(m_hWnd, SB_SETPARTS, (WPARAM) m_nParts,(LPARAM)pParts);

	rc.top = rc.bottom - 20;
	SetWindowPos(m_hWnd,NULL,rc.left,rc.top,
				rc.right - rc.left,rc.bottom - rc.top,
				SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOCOPYBITS);
	pRect->bottom -= rc.bottom - rc.top;
}
//////////////////////////////////////////////////////////////////////
//###################################################################
//	class CFBComboBox
//	组合框
//###################################################################

//////////////////////////////////////////////////////////////////////
// 构造函数和析构函数
//////////////////////////////////////////////////////////////////////
CFBComboBox::CFBComboBox()
{

}

CFBComboBox::~CFBComboBox()
{

}
//////////////////////////////////////////////////////////////////////
LRESULT CFBComboBox::WindowProc(UINT msg, WPARAM wParam, LPARAM lParam)
{
	LRESULT lResult = 0;
	if(msg == WM_COMMAND)
	{
		switch(HIWORD(wParam))
		{
		case CBN_DROPDOWN:
			{
				RECT rc;
				GetWindowRect(m_hWnd,&rc);
				SetWindowPos(m_hWnd,NULL,0,0,rc.right-rc.left,200,SWP_NOMOVE|SWP_NOACTIVATE);
			}
			break;
		case CBN_SELENDOK:
			{
				int index = GetCurSel();
				char text[MAX_PATH];
				GetLBText(index,text);
				SendMessage(m_pOwner->m_hWnd,FBWM_NOTIFY,MAKEWPARAM(GetWndID(),FB_CBN_SELCHANGED),(LPARAM)text);
			}
			break;
		default:
			lResult = CFBWnd::WindowProc(msg,wParam,lParam);
			break;
		}
	}
	else
		lResult = CFBWnd::WindowProc(msg,wParam,lParam);

	return lResult;
}
//////////////////////////////////////////////////////////////////////
BOOL CFBComboBox::Create(CFBWnd* pParent,UINT nID,DWORD style)
{
	if(!pParent)
		return FALSE;

	InitCommonControls();

	style |= WS_VISIBLE|WS_CHILD;

	return CFBWnd::Create("COMBOBOX",NULL,pParent->GetInstance(),
						  pParent,style,NULL,(HMENU)nID);
}
//////////////////////////////////////////////////////////////////////
BOOL CFBComboBox::OnCreate()
{
	HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
	SendMessage(m_hWnd,WM_SETFONT,(WPARAM)hFont,FALSE);

	return TRUE;
}
//////////////////////////////////////////////////////////////////////
void CFBComboBox::AddString(LPTSTR pszText,BOOL bSel)
{
	int index = Find(pszText);
	if(index == CB_ERR)
		SendMessage(m_hWnd,CB_ADDSTRING,0,(LPARAM)pszText);

	if(bSel)
	{
		if(index != CB_ERR)
			SetCurSel(index);
		else
			SetCurSel(0);
	}
}

/********************************************************************
*	class CFBStatic
*	静态控件
********************************************************************/

CFBStatic::CFBStatic()
{
}

CFBStatic::~CFBStatic()
{
}
//########################################################################
BOOL CFBStatic::Create(CFBWnd* pParent,UINT uID, DWORD style, UINT exStyle)
{
	if(pParent == NULL)
		return FALSE;

	style |= WS_CHILD | WS_VISIBLE;

	return CFBWnd::Create("STATIC",
						  NULL,
						  pParent->GetInstance(),
						  pParent,
						  style,
						  exStyle,
						  (HMENU)uID);
}

⌨️ 快捷键说明

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