📄 cjmenu.cpp
字号:
CMenu *pMenu)
{
#ifdef _CPPRTTI
CCJMenu *pCCJMenu = dynamic_cast<CCJMenu *>(pMenu);
#else
CCJMenu *pCCJMenu = (CCJMenu *)pMenu;
#endif
if(pCCJMenu && nFlags&MF_POPUP){
CString key(_T('&'),2);//SK: modified for Unicode correctness
key.SetAt(1,(TCHAR)nChar);
key.MakeLower();
CString menutext;
int menusize = (int)pCCJMenu->GetMenuItemCount();
if(menusize!=(pCCJMenu->m_MenuList.GetUpperBound()+1))
pCCJMenu->SynchronizeMenu();
for(int i=0;i<menusize;++i){
if(pCCJMenu->GetMenuText(i,menutext)){
menutext.MakeLower();
if(menutext.Find(key)>=0)return(MAKELRESULT(i,2));
}
}
}
return(0);
}
void CCJMenu::DitherBlt (HDC hdcDest, int nXDest, int nYDest, int nWidth,
int nHeight, HBITMAP hbm, int nXSrc, int nYSrc)
{
ASSERT(hdcDest && hbm);
ASSERT(nWidth > 0 && nHeight > 0);
// Create a generic DC for all BitBlts
HDC hDC = CreateCompatibleDC(hdcDest);
ASSERT(hDC);
if (hDC)
{
// Create a DC for the monochrome DIB section
HDC bwDC = CreateCompatibleDC(hDC);
ASSERT(bwDC);
if (bwDC)
{
// Create the monochrome DIB section with a black and white palette
struct {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[2];
} RGBBWBITMAPINFO = {
{ // a BITMAPINFOHEADER
sizeof(BITMAPINFOHEADER), // biSize
nWidth, // biWidth;
nHeight, // biHeight;
1, // biPlanes;
1, // biBitCount
BI_RGB, // biCompression;
0, // biSizeImage;
0, // biXPelsPerMeter;
0, // biYPelsPerMeter;
0, // biClrUsed;
0 // biClrImportant;
},
{
{ 0x00, 0x00, 0x00, 0x00 }, { 0xFF, 0xFF, 0xFF, 0x00 }
}
};
VOID *pbitsBW;
HBITMAP hbmBW = CreateDIBSection(bwDC,
(LPBITMAPINFO)&RGBBWBITMAPINFO, DIB_RGB_COLORS, &pbitsBW, NULL, 0);
ASSERT(hbmBW);
if (hbmBW)
{
// Attach the monochrome DIB section and the bitmap to the DCs
HBITMAP olddib = (HBITMAP)SelectObject(bwDC, hbmBW);
HBITMAP hdcolddib = (HBITMAP)SelectObject(hDC, hbm);
// BitBlt the bitmap into the monochrome DIB section
BitBlt(bwDC, 0, 0, nWidth, nHeight, hDC, nXSrc, nYSrc, SRCCOPY);
// Paint the destination rectangle in gray
FillRect(hdcDest, CRect(nXDest, nYDest, nXDest + nWidth, nYDest +
nHeight), GetSysColorBrush((IsNewShell())?COLOR_3DFACE:COLOR_MENU));
//SK: looks better on the old shell
// BitBlt the black bits in the monochrome bitmap into COLOR_3DHILIGHT
// bits in the destination DC
// The magic ROP comes from the Charles Petzold's book
HBRUSH hb = CreateSolidBrush(GetSysColor(COLOR_3DHILIGHT));
HBRUSH oldBrush = (HBRUSH)SelectObject(hdcDest, hb);
BitBlt(hdcDest,nXDest+1,nYDest+1,nWidth,nHeight,bwDC,0,0,0xB8074A);
// BitBlt the black bits in the monochrome bitmap into COLOR_3DSHADOW
// bits in the destination DC
hb = CreateSolidBrush(GetSysColor(COLOR_3DSHADOW));
DeleteObject(SelectObject(hdcDest, hb));
BitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight,bwDC,0,0,0xB8074A);
DeleteObject(SelectObject(hdcDest, oldBrush));
VERIFY(DeleteObject(SelectObject(bwDC, olddib)));
SelectObject(hDC, hdcolddib);
}
VERIFY(DeleteDC(bwDC));
}
VERIFY(DeleteDC(hDC));
}
}
BOOL CCJMenu::AddBitmapToImageList(CImageList *bmplist,UINT nResourceID)
{
BOOL bReturn=TRUE;
HBITMAP hbmp=LoadSysColorBitmap(nResourceID);
if(hbmp){
CBitmap bmp;
bmp.Attach(hbmp);
if(m_bitmapBackgroundFlag) bmplist->Add(&bmp,m_bitmapBackground);
else bmplist->Add(&bmp,GetSysColor(COLOR_3DFACE));
bmp.Detach();
DeleteObject(hbmp);
bReturn=TRUE;
}
else bReturn = FALSE;
return(bReturn);
}
void CCJMenu::SetBitmapBackground(COLORREF color)
{
m_bitmapBackground=color;
m_bitmapBackgroundFlag=TRUE;
}
void CCJMenu::UnSetBitmapBackground(void)
{
m_bitmapBackgroundFlag=FALSE;
}
// Given a toolbar, append all the options from it to this menu
// Passed a ptr to the toolbar object and the toolbar ID
// Author : Robert Edward Caldecott
void CCJMenu::AddFromToolBar(CToolBar* pToolBar, int nResourceID)
{
for (int i = 0; i < pToolBar->GetCount(); i++) {
UINT nID = pToolBar->GetItemID(i);
// See if this toolbar option
// appears as a command on this
// menu or is a separator
if (nID == 0 || GetMenuState(nID, MF_BYCOMMAND) == 0xFFFFFFFF)
continue; // Item doesn't exist
UINT nStyle;
int nImage;
// Get the toolbar button info
pToolBar->GetButtonInfo(i, nID, nStyle, nImage);
// OK, we have the command ID of the toolbar
// option, and the tollbar bitmap offset
int nLoc;
CCJMenuData* pData;
CCJMenu *pSubMenu = FindMenuOption(nID, nLoc);
if (pSubMenu && nLoc >= 0)pData = pSubMenu->m_MenuList[nLoc];
else {
// Create a new CCJMenuData structure
pData = new CCJMenuData;
m_MenuList.Add(pData);
}
// Set some default structure members
pData->menuIconNormal = nResourceID;
pData->nID = nID;
pData->nFlags = MF_BYCOMMAND | MF_OWNERDRAW;
pData->xoffset = nImage;
if (pData->bitmap)pData->bitmap->DeleteImageList();
else pData->bitmap = new CImageList;
pData->bitmap->Create(m_iconX, m_iconY,ILC_COLORDDB|ILC_MASK, 1, 1);
if(!AddBitmapToImageList(pData->bitmap, nResourceID)){
pData->bitmap->DeleteImageList();
delete pData->bitmap;
pData->bitmap=NULL;
pData->menuIconNormal = -1;
pData->xoffset = -1;
}
// Modify our menu
ModifyMenu(nID,pData->nFlags,nID,(LPCTSTR)pData);
}
}
BOOL CCJMenu::Draw3DCheckmark(CDC *dc, const CRect& rc,
BOOL bSelected, HBITMAP hbmCheck)
{
CRect rcDest = rc;
CBrush brush;
COLORREF col=GetSysColor((bSelected||!IsNewShell())?COLOR_MENU:COLOR_3DLIGHT);//SK: Looks better on the old shell
brush.CreateSolidBrush(col);
dc->FillRect(rcDest,&brush);
brush.DeleteObject();
if (IsNewShell()) //SK: looks better on the old shell
dc->DrawEdge(&rcDest, BDR_SUNKENOUTER, BF_RECT);
if (!hbmCheck)DrawCheckMark(dc,rc.left+4,rc.top+4,GetSysColor(COLOR_MENUTEXT));
else DrawRadioDot(dc,rc.left+5,rc.top+4,GetSysColor(COLOR_MENUTEXT));
return TRUE;
}
void CCJMenu::DitherBlt2(CDC *drawdc, int nXDest, int nYDest, int nWidth,
int nHeight, CBitmap &bmp, int nXSrc, int nYSrc)
{
// create a monochrome memory DC
CDC ddc;
ddc.CreateCompatibleDC(0);
CBitmap bwbmp;
bwbmp.CreateCompatibleBitmap(&ddc, nWidth, nHeight);
CBitmap * pddcOldBmp = ddc.SelectObject(&bwbmp);
CDC dc;
dc.CreateCompatibleDC(0);
CBitmap * pdcOldBmp = dc.SelectObject(&bmp);
// build a mask
ddc.PatBlt(0, 0, nWidth, nHeight, WHITENESS);
dc.SetBkColor(GetSysColor(COLOR_BTNFACE));
ddc.BitBlt(0, 0, nWidth, nHeight, &dc, nXSrc,nYSrc, SRCCOPY);
dc.SetBkColor(GetSysColor(COLOR_BTNHILIGHT));
ddc.BitBlt(0, 0, nWidth, nHeight, &dc, nXSrc,nYSrc, SRCPAINT);
// Copy the image from the toolbar into the memory DC
// and draw it (grayed) back into the toolbar.
dc.FillSolidRect(0,0, nWidth, nHeight, GetSysColor((IsNewShell())?COLOR_3DFACE:COLOR_MENU));
//SK: Looks better on the old shell
dc.SetBkColor(RGB(0, 0, 0));
dc.SetTextColor(RGB(255, 255, 255));
CBrush brShadow, brHilight;
brHilight.CreateSolidBrush(GetSysColor(COLOR_BTNHILIGHT));
brShadow.CreateSolidBrush(GetSysColor(COLOR_BTNSHADOW));
CBrush * pOldBrush = dc.SelectObject(&brHilight);
dc.BitBlt(0,0, nWidth, nHeight, &ddc, 0, 0, 0x00E20746L);
drawdc->BitBlt(nXDest+1,nYDest+1,nWidth, nHeight, &dc,0,0,SRCCOPY);
dc.BitBlt(1,1, nWidth, nHeight, &ddc, 0, 0, 0x00E20746L);
dc.SelectObject(&brShadow);
dc.BitBlt(0,0, nWidth, nHeight, &ddc, 0, 0, 0x00E20746L);
drawdc->BitBlt(nXDest,nYDest,nWidth, nHeight, &dc,0,0,SRCCOPY);
// reset DCs
ddc.SelectObject(pddcOldBmp);
ddc.DeleteDC();
dc.SelectObject(pOldBrush);
dc.SelectObject(pdcOldBmp);
dc.DeleteDC();
brShadow.DeleteObject();
brHilight.DeleteObject();
bwbmp.DeleteObject();
}
void CCJMenu::SetDisableOldStyle(void)
{
disable_old_style=TRUE;
}
void CCJMenu::UnSetDisableOldStyle(void)
{
disable_old_style=FALSE;
}
BOOL CCJMenu::GetDisableOldStyle(void)
{
return(disable_old_style);
}
HBITMAP CCJMenu::LoadSysColorBitmap(int nResourceId)
{
HINSTANCE hInst =
AfxFindResourceHandle(MAKEINTRESOURCE(nResourceId),RT_BITMAP);
HRSRC hRsrc =
::FindResource(hInst,MAKEINTRESOURCE(nResourceId),RT_BITMAP);
if (hRsrc == NULL)
return NULL;
return AfxLoadSysColorBitmap(hInst, hRsrc, FALSE);
}
BOOL CCJMenu::RemoveMenu(UINT uiId,UINT nFlags)
{
if(MF_BYPOSITION&nFlags){
CCJMenu* pSubMenu = (CCJMenu*) GetSubMenu(uiId);
if(NULL==pSubMenu){
UINT uiCommandId = GetMenuItemID(uiId);
for(int i=0;i<m_MenuList.GetSize(); i++){
if(m_MenuList[i]->nID==uiCommandId){
delete m_MenuList.GetAt(i);
m_MenuList.RemoveAt(i);
break;
}
}
}
else{
int numSubMenus = m_SubMenus.GetUpperBound();
for(int m = numSubMenus; m >= 0; m--){
if(m_SubMenus[m]==pSubMenu->m_hMenu){
int numAllSubMenus = m_AllSubMenus.GetUpperBound();
for(int n = numAllSubMenus; n>= 0; n--){
if(m_AllSubMenus[n]==m_SubMenus[m])m_AllSubMenus.RemoveAt(n);
}
m_SubMenus.RemoveAt(m);
}
}
int num = pSubMenu->GetMenuItemCount();
for(int i=num-1;i>=0;--i)pSubMenu->RemoveMenu(i,MF_BYPOSITION);
for(i=m_MenuList.GetUpperBound();i>=0;i--){
if(m_MenuList[i]->nID==(UINT)pSubMenu->m_hMenu){
delete m_MenuList.GetAt(i);
m_MenuList.RemoveAt(i);
break;
}
}
delete pSubMenu;
}
}
else{
int iPosition =0;
CCJMenu* pMenu = FindMenuOption(uiId,iPosition);
if(pMenu)pMenu->RemoveMenu(iPosition,MF_BYPOSITION);
}
return CMenu::RemoveMenu(uiId,nFlags);
}
BOOL CCJMenu::DeleteMenu(UINT uiId,UINT nFlags)
{
if(MF_BYPOSITION&nFlags){
CCJMenu* pSubMenu = (CCJMenu*) GetSubMenu(uiId);
if(NULL==pSubMenu){
UINT uiCommandId = GetMenuItemID(uiId);
for(int i=0;i<m_MenuList.GetSize(); i++){
if(m_MenuList[i]->nID==uiCommandId){
delete m_MenuList.GetAt(i);
m_MenuList.RemoveAt(i);
break;
}
}
}
else{
int numSubMenus = m_SubMenus.GetUpperBound();
for(int m = numSubMenus; m >= 0; m--){
if(m_SubMenus[m]==pSubMenu->m_hMenu){
int numAllSubMenus = m_AllSubMenus.GetUpperBound();
for(int n = numAllSubMenus; n>= 0; n--){
if(m_AllSubMenus[n]==m_SubMenus[m])m_AllSubMenus.RemoveAt(n);
}
m_SubMenus.RemoveAt(m);
}
}
int num = pSubMenu->GetMenuItemCount();
for(int i=num-1;i>=0;--i)pSubMenu->DeleteMenu(i,MF_BYPOSITION);
for(i=m_MenuList.GetUpperBound();i>=0;i--){
if(m_MenuList[i]->nID==(UINT)pSubMenu->m_hMenu){
delete m_MenuList.GetAt(i);
m_MenuList.RemoveAt(i);
break;
}
}
delete pSubMenu;
}
}
else{
int iPosition =0;
CCJMenu* pMenu = FindMenuOption(uiId,iPosition);
if(pMenu)pMenu->DeleteMenu(iPosition,MF_BYPOSITION);
}
return CMenu::DeleteMenu(uiId,nFlags);
}
BOOL CCJMenu::AppendMenuA(UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,int nIconNormal)
{
USES_CONVERSION;
return AppendMenuW(nFlags,nIDNewItem,A2W(lpszNewItem),nIconNormal);
}
BOOL CCJMenu::AppendMenuW(UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,int nIconNormal)
{
return AppendODMenuW(lpszNewItem,nFlags,nIDNewItem,nIconNormal);
}
BOOL CCJMenu::AppendMenuA(UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,CImageList *il,int xoffset)
{
USES_CONVERSION;
return AppendMenuW(nFlags,nIDNewItem,A2W(lpszNewItem),il,xoffset);
}
BOOL CCJMenu::AppendMenuW(UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,CImageList *il,int xoffset)
{
return AppendODMenuW(lpszNewItem,nFlags,nIDNewItem,il,xoffset);
}
BOOL CCJMenu::AppendMenuA(UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,CBitmap *bmp)
{
USES_CONVERSION;
return AppendMenuW(nFlags,nIDNewItem,A2W(lpszNewItem),bmp);
}
BOOL CCJMenu::AppendMenuW(UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,CBitmap *bmp)
{
if(bmp){
CImageList temp;
temp.Create(m_iconX,m_iconY,ILC_COLORDDB|ILC_MASK,1,1);
if(m_bitmapBackgroundFlag)temp.Add(bmp,m_bitmapBackground);
else temp.Add(bmp,GetSysColor(COLOR_3DFACE));
return AppendODMenuW(lpszNewItem,nFlags,nIDNewItem,&temp,0);
}
return AppendODMenuW(lpszNewItem,nFlags,nIDNewItem,NULL,0);
}
BOOL CCJMenu::InsertMenuA(UINT nPosition,UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,int nIconNormal)
{
USES_CONVERSION;
return InsertMenuW(nPosition,nFlags,nIDNewItem,A2W(lpszNewItem),nIconNormal);
}
BOOL CCJMenu::InsertMenuW(UINT nPosition,UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,int nIconNormal)
{
return InsertODMenuW(nPosition,lpszNewItem,nFlags,nIDNewItem,nIconNormal);
}
BOOL CCJMenu::InsertMenuA(UINT nPosition,UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,CImageList *il,int xoffset)
{
USES_CONVERSION;
return InsertMenuW(nPosition,nFlags,nIDNewItem,A2W(lpszNewItem),il,xoffset);
}
BOOL CCJMenu::InsertMenuW(UINT nPosition,UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,CImageList *il,int xoffset)
{
return InsertODMenuW(nPosition,lpszNewItem,nFlags,nIDNewItem,il,xoffset);
}
BOOL CCJMenu::InsertMenuA(UINT nPosition,UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,CBitmap *bmp)
{
USES_CONVERSION;
return InsertMenuW(nPosition,nFlags,nIDNewItem,A2W(lpszNewItem),bmp);
}
BOOL CCJMenu::InsertMenuW(UINT nPosition,UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,CBitmap *bmp)
{
if(bmp){
CImageList temp;
temp.Create(m_iconX,m_iconY,ILC_COLORDDB|ILC_MASK,1,1);
if(m_bitmapBackgroundFlag)temp.Add(bmp,m_bitmapBackground);
else temp.Add(bmp,GetSysColor(COLOR_3DFACE));
return InsertODMenuW(nPosition,lpszNewItem,nFlags,nIDNewItem,&temp,0);
}
return InsertODMenuW(nPosition,lpszNewItem,nFlags,nIDNewItem,NULL,0);
}
//--------------------------------------------------------------------------
//[21.06.99 rj]
CCJMenu* CCJMenu::AppendODPopupMenuW(wchar_t *lpstrText)
{
CCJMenu* pSubMenu = new CCJMenu;
pSubMenu->m_unselectcheck=m_unselectcheck;
pSubMenu->m_selectcheck=m_selectcheck;
pSubMenu->checkmaps=checkmaps;
pSubMenu->checkmapsshare=TRUE;
pSubMenu->CreatePopupMenu();
AppendODMenuW(lpstrText,MF_POPUP,(UINT)pSubMenu->m_hMenu, -1);
return pSubMenu;
}
//--------------------------------------------------------------------------
//[21.06.99 rj]
CCJMenu* CCJMenu::AppendODPopupMenuA(LPCSTR lpstrText)
{
USES_CONVERSION;
return AppendODPopupMenuW(A2W(lpstrText));
}
//*************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -