📄 bcmenu.cpp
字号:
m_fontMenu.DeleteObject();
}
void BCMenu::LoadCheckmarkBitmap(int unselect, int select)
{
if(unselect>0 && select>0){
m_selectcheck=select;
m_unselectcheck=unselect;
if(checkmaps)checkmaps->DeleteImageList();
else checkmaps=new(CImageList);
checkmaps->Create(m_iconX,m_iconY,ILC_MASK,2,1);
BOOL flag1=AddBitmapToImageList(checkmaps,unselect);
BOOL flag2=AddBitmapToImageList(checkmaps,select);
if(!flag1||!flag2){
checkmaps->DeleteImageList();
delete checkmaps;
checkmaps=NULL;
}
}
}
//--------------------------------------------------------------------------
//[18.06.99 rj]
BOOL BCMenu::GetMenuText(UINT id, CString& string, UINT nFlags/*= MF_BYPOSITION*/)
{
BOOL returnflag=FALSE;
if(MF_BYPOSITION&nFlags){
UINT numMenuItems = m_MenuList.GetUpperBound();
if(id<=numMenuItems){
string=m_MenuList[id]->GetString();
returnflag=TRUE;
}
}
else{
int uiLoc;
BCMenu* pMenu = FindMenuOption(id,uiLoc);
if(NULL!=pMenu) returnflag = pMenu->GetMenuText(uiLoc,string);
}
return(returnflag);
}
void BCMenu::DrawRadioDot(CDC *pDC,int x,int y,COLORREF color)
{
CRect rcDot(x,y,x+6,y+6);
CBrush brush;
CPen pen;
brush.CreateSolidBrush(color);
pen.CreatePen(PS_SOLID,0,color);
CBrush *pOldBrush=pDC->SelectObject(&brush);
CPen *pOldPen=pDC->SelectObject(&pen);
pDC->Ellipse(&rcDot);
pDC->SelectObject(pOldBrush);
pDC->SelectObject(pOldPen);
pen.DeleteObject();
brush.DeleteObject();
}
void BCMenu::DrawCheckMark(CDC* pDC,int x,int y,COLORREF color)
{
CPen m_penBack;
m_penBack.CreatePen (PS_SOLID,0,color);
CPen *pOldPen = pDC->SelectObject (&m_penBack);
pDC->MoveTo(x,y+2);
pDC->LineTo(x,y+5);
pDC->MoveTo(x+1,y+3);
pDC->LineTo(x+1,y+6);
pDC->MoveTo(x+2,y+4);
pDC->LineTo(x+2,y+7);
pDC->MoveTo(x+3,y+3);
pDC->LineTo(x+3,y+6);
pDC->MoveTo(x+4,y+2);
pDC->LineTo(x+4,y+5);
pDC->MoveTo(x+5,y+1);
pDC->LineTo(x+5,y+4);
pDC->MoveTo(x+6,y);
pDC->LineTo(x+6,y+3);
pDC->SelectObject (pOldPen);
m_penBack.DeleteObject();
}
BCMenuData *BCMenu::FindMenuList(UINT nID)
{
for(int i=0;i<=m_MenuList.GetUpperBound();++i){
if(m_MenuList[i]->nID==nID && !m_MenuList[i]->syncflag){
m_MenuList[i]->syncflag=1;
return(m_MenuList[i]);
}
}
return(NULL);
}
void BCMenu::InitializeMenuList(int value)
{
for(int i=0;i<=m_MenuList.GetUpperBound();++i)
m_MenuList[i]->syncflag=value;
}
void BCMenu::DeleteMenuList(void)
{
for(int i=0;i<=m_MenuList.GetUpperBound();++i){
if(!m_MenuList[i]->syncflag){
delete m_MenuList[i];
}
}
}
void BCMenu::SynchronizeMenu(void)
{
CTypedPtrArray<CPtrArray, BCMenuData*> temp;
BCMenuData *mdata;
CString string;
UINT submenu,nID=0,state,j;
InitializeMenuList(0);
for(j=0;j<GetMenuItemCount();++j){
mdata=NULL;
state=GetMenuState(j,MF_BYPOSITION);
if(state&MF_POPUP){
submenu=(UINT)GetSubMenu(j)->m_hMenu;
mdata=FindMenuList(submenu);
GetMenuString(j,string,MF_BYPOSITION);
if(!mdata)mdata=NewODMenu(j,
(state&0xFF)|MF_BYPOSITION|MF_POPUP|MF_OWNERDRAW,submenu,string);
else if(string.GetLength()>0)
#ifdef UNICODE
mdata->SetWideString(string); //SK: modified for dynamic allocation
#else
mdata->SetAnsiString(string);
#endif
}
else if(state&MF_SEPARATOR){
mdata=FindMenuList(0);
if(!mdata)mdata=NewODMenu(j,
state|MF_BYPOSITION|MF_SEPARATOR|MF_OWNERDRAW,0,_T(""));//SK: modified for Unicode correctness
else ModifyMenu(j,mdata->nFlags,nID,(LPCTSTR)mdata);
}
else{
nID=GetMenuItemID(j);
mdata=FindMenuList(nID);
GetMenuString(j,string,MF_BYPOSITION);
if(!mdata)mdata=NewODMenu(j,state|MF_BYPOSITION|MF_OWNERDRAW,
nID,string);
else{
mdata->nFlags=state|MF_BYPOSITION|MF_OWNERDRAW;
if(string.GetLength()>0)
#ifdef UNICODE
mdata->SetWideString(string);//SK: modified for dynamic allocation
#else
mdata->SetAnsiString(string);
#endif
ModifyMenu(j,mdata->nFlags,nID,(LPCTSTR)mdata);
}
}
if(mdata)temp.Add(mdata);
}
DeleteMenuList();
m_MenuList.RemoveAll();
m_MenuList.Append(temp);
temp.RemoveAll();
}
void BCMenu::UpdateMenu(CMenu *pmenu)
{
#ifdef _CPPRTTI
BCMenu *psubmenu = dynamic_cast<BCMenu *>(pmenu);
#else
BCMenu *psubmenu = (BCMenu *)pmenu;
#endif
if(psubmenu)psubmenu->SynchronizeMenu();
}
LRESULT BCMenu::FindKeyboardShortcut(UINT nChar, UINT nFlags,
CMenu *pMenu)
{
#ifdef _CPPRTTI
BCMenu *pBCMenu = dynamic_cast<BCMenu *>(pMenu);
#else
BCMenu *pBCMenu = (BCMenu *)pMenu;
#endif
if(pBCMenu && nFlags&MF_POPUP){
CString key(_T('&'),2);//SK: modified for Unicode correctness
key.SetAt(1,(TCHAR)nChar);
key.MakeLower();
CString menutext;
int menusize = (int)pBCMenu->GetMenuItemCount();
if(menusize!=(pBCMenu->m_MenuList.GetUpperBound()+1))
pBCMenu->SynchronizeMenu();
for(int i=0;i<menusize;++i){
if(pBCMenu->GetMenuText(i,menutext)){
menutext.MakeLower();
if(menutext.Find(key)>=0)return(MAKELRESULT(i,2));
}
}
}
return(0);
}
void BCMenu::DitherBlt (HDC hdcDest, int nXDest, int nYDest, int nWidth,
int nHeight, HBITMAP hbm, int nXSrc, int nYSrc,
COLORREF bgcolor)
{
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(bgcolor));
//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));
}
}
void BCMenu::GetFadedBitmap(CBitmap &bmp)
{
CDC ddc;
COLORREF bgcol,col;
BITMAP BitMap;
bmp.GetBitmap(&BitMap);
ddc.CreateCompatibleDC(NULL);
CBitmap * pddcOldBmp = ddc.SelectObject(&bmp);
// use this to get the background color, takes into account color shifting
CDC ddc2;
CBrush brush;
CBitmap bmp2;
ddc2.CreateCompatibleDC(NULL);
bmp2.CreateCompatibleBitmap(&ddc,BitMap.bmWidth,BitMap.bmHeight);
col=GetSysColor(COLOR_3DFACE);
brush.CreateSolidBrush(col);
CBitmap * pddcOldBmp2 = ddc2.SelectObject(&bmp2);
CRect rect(0,0,BitMap.bmWidth,BitMap.bmHeight);
ddc2.FillRect(rect,&brush);
bgcol=ddc2.GetPixel(1,1);
brush.DeleteObject();
ddc2.SelectObject(pddcOldBmp2);
for(int i=0;i<BitMap.bmWidth;++i){
for(int j=0;j<BitMap.bmHeight;++j){
col=ddc.GetPixel(i,j);
if(col!=bgcol)ddc.SetPixel(i,j,LightenColor(col,0.3));
}
}
ddc.SelectObject(pddcOldBmp);
}
void BCMenu::GetShadowBitmap(CBitmap &bmp)
{
CDC ddc;
COLORREF bgcol,col,shadowcol=GetSysColor(COLOR_BTNSHADOW);
BITMAP BitMap;
if(!IsWinXPLuna())shadowcol=LightenColor(shadowcol,0.49);
bmp.GetBitmap(&BitMap);
ddc.CreateCompatibleDC(NULL);
CBitmap * pddcOldBmp = ddc.SelectObject(&bmp);
// use this to get the background color, takes into account color shifting
CDC ddc2;
CBrush brush;
CBitmap bmp2;
ddc2.CreateCompatibleDC(NULL);
bmp2.CreateCompatibleBitmap(&ddc,BitMap.bmWidth,BitMap.bmHeight);
col=GetSysColor(COLOR_3DFACE);
brush.CreateSolidBrush(col);
CBitmap * pddcOldBmp2 = ddc2.SelectObject(&bmp2);
CRect rect(0,0,BitMap.bmWidth,BitMap.bmHeight);
ddc2.FillRect(rect,&brush);
bgcol=ddc2.GetPixel(1,1);
brush.DeleteObject();
ddc2.SelectObject(pddcOldBmp2);
for(int i=0;i<BitMap.bmWidth;++i){
for(int j=0;j<BitMap.bmHeight;++j){
col=ddc.GetPixel(i,j);
if(col!=bgcol)ddc.SetPixel(i,j,shadowcol);
}
}
ddc.SelectObject(pddcOldBmp);
}
BOOL BCMenu::AddBitmapToImageList(CImageList *bmplist,UINT nResourceID)
{
BOOL bReturn=FALSE;
// O.S.
if (m_bDynIcons){
bmplist->Add((HICON)nResourceID);
bReturn=TRUE;
}
else{
HBITMAP hbmp=LoadSysColorBitmap(nResourceID);
if(hbmp){
CBitmap bmp;
bmp.Attach(hbmp);
if(m_bitmapBackgroundFlag){
if(bmplist->Add(&bmp,m_bitmapBackground)>=0)bReturn=TRUE;
}
else{
if(bmplist->Add(&bmp,GetSysColor(COLOR_3DFACE))>=0)bReturn=TRUE;
}
bmp.Detach();
DeleteObject(hbmp);
}
else{
CBitmap mybmp;
if(mybmp.LoadBitmap(nResourceID)){
if(m_bitmapBackgroundFlag){
if(bmplist->Add(&mybmp,m_bitmapBackground)>=0)bReturn=TRUE;
}
else{
if(bmplist->Add(&mybmp,GetSysColor(COLOR_3DFACE))>=0)bReturn=TRUE;
}
}
}
}
if(bReturn&&IsLunaMenuStyle()&&xp_draw_3D_bitmaps){
CWnd *pWnd = AfxGetMainWnd(); // Get main window
if (pWnd == NULL) pWnd = CWnd::GetDesktopWindow();
CDC *pDC = pWnd->GetDC(); // Get device context
CBitmap bmp,bmp2;
GetBitmapFromImageList(pDC,bmplist,0,bmp);
GetFadedBitmap(bmp);
bmplist->Add(&bmp,GetSysColor(COLOR_3DFACE));
GetBitmapFromImageList(pDC,bmplist,0,bmp2);
GetShadowBitmap(bmp2);
bmplist->Add(&bmp2,GetSysColor(COLOR_3DFACE));
pWnd->ReleaseDC(pDC); // Release the DC
}
return(bReturn);
}
void BCMenu::SetBitmapBackground(COLORREF color)
{
m_bitmapBackground=color;
m_bitmapBackgroundFlag=TRUE;
}
void BCMenu::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 BCMenu::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;
BCMenuData* pData;
BCMenu *pSubMenu = FindMenuOption(nID, nLoc);
if (pSubMenu && nLoc >= 0)pData = pSubMenu->m_MenuList[nLoc];
else {
// Create a new BCMenuData structure
pData = new BCMenuData;
m_MenuList.Add(pData);
}
// Set some default structure members
pData->menuIconNormal = nResourceID;
pData->nID = nID;
pData->nFlags = MF_BYCOMMAND |
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -