📄 fbctrls.cpp
字号:
/*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
文件: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 + -