📄 fbctrls.cpp
字号:
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 + -