📄 sdmenu.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "sdMenu.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//====================================
//(TsdMenuItem)子菜单项目维护
//====================================
TsdMenuItem::TsdMenuItem()
{
m_MenuItem=new TsdCollection ;
}
TsdMenuItem::~TsdMenuItem()
{
delete m_MenuItem;
}
void TsdMenuItem::AddMenuItem()
{
TsdMenuItem *p=new TsdMenuItem;
p->Assign(this);
m_MenuItem->Add((void *)p,p->ItemCode);
sdParent->sdParent->Navpic->NavpicRight=m_RightLevel;
}
bool TsdMenuItem::LocateByIndex(int Index)
{
try
{
TsdMenuItem *p=(TsdMenuItem *)m_MenuItem->Item(Index);
this->Assign(p);
return true;
}
catch(Exception &e)
{
return false;
}
}
bool TsdMenuItem::LocateByKey(AnsiString Key)
{
try
{
TsdMenuItem *p=(TsdMenuItem *)m_MenuItem->Value(Key);
this->Assign(p);
return true;
}
catch(Exception &e)
{
return false;
}
}
void TsdMenuItem::Assign(TsdMenuItem *p)
{
this->m_ItemCode=p->m_ItemCode;
this->m_ItemLib=p->m_ItemLib;
this->m_ItemUpperCode=p->m_ItemUpperCode;
this->m_ItemCaption=p->m_ItemCaption;
this->m_ItemNo=p->m_ItemNo;
this->m_RightLevel=p->m_RightLevel;
this->m_ItemFormName=p->m_ItemFormName;
this->m_ItemNeedCheck=p->m_ItemNeedCheck;
}
int TsdMenuItem::GetMenuItemCount()
{
return m_MenuItem->Count();
}
//====================================
//(TsdSubMenu)子菜单维护
//====================================
TsdSubMenu::TsdSubMenu(TPanel *FPanel,TsdTask *p)
{
m_Task=p;
m_Child=new TsdCollection;
m_SubMenuPanel=FPanel;
m_sbLeft=NULL;
m_sbRight=NULL;
m_FirstIndex=-1;
m_Top=1;
m_Width=57;
m_Height=57;
m_HStep=24;
m_Space=33;
}
TsdSubMenu::~TsdSubMenu()
{
delete m_Child;
delete m_MenuItem;
}
void TsdSubMenu::HideSubMenu()
{
for(int i=0;i<m_Child->Count();i++)
{
LocateByIndex(i);
delete m_ImagePanel;
m_ImagePanel=NULL;
TsdSubMenu *p=new TsdSubMenu(m_SubMenuPanel,m_Task);
p->Assign(this);
m_Child->Change((void *)p,p->SubMenuCode,p->SubMenuCode);
}
if(m_Child->Count()>0)
{
m_sbRight->Visible =false;
m_sbLeft->Visible =false;
}
}
void TsdSubMenu::ShowSubMenu()
{
m_FirstIndex=0;
m_cVisNum=(m_SubMenuPanel->Width+1-2*m_Space+m_HStep)/(m_Width+m_HStep);
for(int i=0;i<m_Child->Count();i++)
{
LocateByIndex(i);
if(i<m_FirstIndex||i>=m_FirstIndex+m_cVisNum)
{
if(m_ImagePanel!=NULL)
{
delete m_ImagePanel;
m_ImagePanel=NULL;
TsdSubMenu *p=new TsdSubMenu(m_SubMenuPanel,m_Task);
p->Assign(this);
m_Child->Change((void *)p,p->SubMenuCode,p->SubMenuCode);
}
}
else
{
if(m_ImagePanel==NULL)
{
m_ImagePanel=new TImagePanel(m_SubMenuPanel);
m_ImagePanel->Parent=m_SubMenuPanel;
m_ImagePanel->Height=m_Height;
m_ImagePanel->Width=m_Width;
m_ImagePanel->Top=m_Top;
m_ImagePanel->Hint=m_SubMenuDesc;
m_ImagePanel->ShowHint=false;
m_ImagePanel->Tag =i;
m_ImagePanel->OnPopupClick=SubMenuItemClick;
m_ImagePanel->OnClick=SubMenuClick;
m_ImagePanel->Items->Add(m_SubMenuCaption);
for(int j=0;j<m_MenuItem->MenuItemCount;j++)
{
m_MenuItem->LocateByIndex(j);
m_ImagePanel->Items->Add(m_MenuItem->ItemCaption);
}
Graphics::TBitmap *FBmp1=new Graphics::TBitmap();
Graphics::TBitmap *FBmp2=new Graphics::TBitmap();
FBmp1->LoadFromResourceName((int)HInstance,m_SubMenuCode+AnsiString("-1"));
m_ImagePanel->Picture->Assign(FBmp1);
FBmp2->LoadFromResourceName((int)HInstance,m_SubMenuCode+AnsiString("-2"));
m_ImagePanel->PictureSelected->Assign(FBmp2);
delete FBmp1;
delete FBmp2;
TsdSubMenu *p=new TsdSubMenu(m_SubMenuPanel,m_Task);
p->Assign(this);
m_Child->Change((void *)p,p->SubMenuCode,p->SubMenuCode);
}
m_ImagePanel->Left =(i-m_FirstIndex)*(m_Width+HStep)+m_Space;
m_ImagePanel->Visible=true;
}
}
if(m_Child->Count()>0)
{
if(m_FirstIndex>0)
m_sbLeft->Visible =true;
else
m_sbLeft->Visible =false;
if(m_FirstIndex+m_cVisNum<m_Child->Count())
m_sbRight->Visible =true;
else
m_sbRight->Visible =false;
}
}
void TsdSubMenu::ShowNextPageMenu()
{
m_cVisNum=(m_SubMenuPanel->Width+1-2*m_Space+m_HStep)/(m_Width+m_HStep);
if(m_FirstIndex+m_cVisNum<m_Child->Count())
m_FirstIndex++;
for(int i=0;i<m_Child->Count();i++)
{
LocateByIndex(i);
if(i<m_FirstIndex||i>=m_FirstIndex+m_cVisNum)
{
if(m_ImagePanel!=NULL)
{
delete m_ImagePanel;
m_ImagePanel=NULL;
TsdSubMenu *p=new TsdSubMenu(m_SubMenuPanel,m_Task);
p->Assign(this);
m_Child->Change((void *)p,p->SubMenuCode,p->SubMenuCode);
}
}
else
{
if(m_ImagePanel==NULL)
{
m_ImagePanel=new TImagePanel(m_SubMenuPanel);
m_ImagePanel->Parent=m_SubMenuPanel;
m_ImagePanel->Height=m_Height;
m_ImagePanel->Width=m_Width;
m_ImagePanel->Top=m_Top;
m_ImagePanel->Hint=m_SubMenuDesc;
m_ImagePanel->ShowHint=false;
m_ImagePanel->Tag =i;
m_ImagePanel->OnPopupClick=SubMenuItemClick;
m_ImagePanel->OnClick=SubMenuClick;
m_ImagePanel->Items->Add(m_SubMenuCaption);
for(int j=0;j<m_MenuItem->MenuItemCount;j++)
{
m_MenuItem->LocateByIndex(j);
m_ImagePanel->Items->Add(m_MenuItem->ItemCaption);
}
Graphics::TBitmap *FBmp1=new Graphics::TBitmap();
Graphics::TBitmap *FBmp2=new Graphics::TBitmap();
FBmp1->LoadFromResourceName((int)HInstance,m_SubMenuCode+AnsiString("-1"));
m_ImagePanel->Picture->Assign(FBmp1);
FBmp2->LoadFromResourceName((int)HInstance,m_SubMenuCode+AnsiString("-2"));
m_ImagePanel->PictureSelected->Assign(FBmp2);
delete FBmp1;
delete FBmp2;
TsdSubMenu *p=new TsdSubMenu(m_SubMenuPanel,m_Task);
p->Assign(this);
m_Child->Change((void *)p,p->SubMenuCode,p->SubMenuCode);
}
m_ImagePanel->Left =(i-m_FirstIndex)*(m_Width+HStep)+m_Space;
m_ImagePanel->Visible=true;
}
}
if(m_Child->Count()>0)
{
if(m_FirstIndex>0)
m_sbLeft->Visible =true;
else
m_sbLeft->Visible =false;
if(m_FirstIndex+m_cVisNum<m_Child->Count())
m_sbRight->Visible =true;
else
m_sbRight->Visible =false;
}
}
void TsdSubMenu::ShowPriorPageMenu()
{
m_cVisNum=(m_SubMenuPanel->Width+1-2*m_Space+m_HStep)/(m_Width+m_HStep);
if(m_FirstIndex>0)
m_FirstIndex--;
for(int i=0;i<m_Child->Count();i++)
{
LocateByIndex(i);
if(i<m_FirstIndex||i>=m_FirstIndex+m_cVisNum)
{
if(m_ImagePanel!=NULL)
{
delete m_ImagePanel;
m_ImagePanel=NULL;
TsdSubMenu *p=new TsdSubMenu(m_SubMenuPanel,m_Task);
p->Assign(this);
m_Child->Change((void *)p,p->SubMenuCode,p->SubMenuCode);
}
}
else
{
if(m_ImagePanel==NULL)
{
m_ImagePanel=new TImagePanel(m_SubMenuPanel);
m_ImagePanel->Parent=m_SubMenuPanel;
m_ImagePanel->Height=m_Height;
m_ImagePanel->Width=m_Width;
m_ImagePanel->Top=m_Top;
m_ImagePanel->Hint=m_SubMenuDesc;
m_ImagePanel->ShowHint=false;
m_ImagePanel->Tag =i;
m_ImagePanel->OnPopupClick=SubMenuItemClick;
m_ImagePanel->OnClick=SubMenuClick;
m_ImagePanel->Items->Add(m_SubMenuCaption);
for(int j=0;j<m_MenuItem->MenuItemCount;j++)
{
m_MenuItem->LocateByIndex(j);
m_ImagePanel->Items->Add(m_MenuItem->ItemCaption);
}
Graphics::TBitmap *FBmp1=new Graphics::TBitmap();
Graphics::TBitmap *FBmp2=new Graphics::TBitmap();
FBmp1->LoadFromResourceName((int)HInstance,m_SubMenuCode+AnsiString("-1"));
m_ImagePanel->Picture->Assign(FBmp1);
FBmp2->LoadFromResourceName((int)HInstance,m_SubMenuCode+AnsiString("-2"));
m_ImagePanel->PictureSelected->Assign(FBmp2);
delete FBmp1;
delete FBmp2;
TsdSubMenu *p=new TsdSubMenu(m_SubMenuPanel,m_Task);
p->Assign(this);
m_Child->Change((void *)p,p->SubMenuCode,p->SubMenuCode);
}
m_ImagePanel->Left =(i-m_FirstIndex)*(m_Width+HStep)+m_Space;
m_ImagePanel->Visible=true;
}
}
if(m_Child->Count()>0)
{
if(m_FirstIndex>0)
m_sbLeft->Visible =true;
else
m_sbLeft->Visible =false;
if(m_FirstIndex+m_cVisNum<m_Child->Count())
m_sbRight->Visible =true;
else
m_sbRight->Visible =false;
}
}
bool TsdSubMenu::LocateByIndex(int Index)
{
try
{
TsdSubMenu *p=(TsdSubMenu *)m_Child->Item(Index);
Assign(p);
return true;
}
catch(Exception &e)
{
return false;
}
}
bool TsdSubMenu::LocateByKey(AnsiString Key)
{
try
{
TsdSubMenu *p=(TsdSubMenu *)m_Child->Value(Key);
Assign(p);
return true;
}
catch(Exception &e)
{
return false;
}
}
void TsdSubMenu::Assign(TsdSubMenu * p)
{
this->m_SubMenuPanel=p->m_SubMenuPanel;
this->m_ImagePanel=p->m_ImagePanel;
this->m_sbLeft=p->m_sbLeft;
this->m_sbRight=p->m_sbRight;
this->m_MenuItem=p->m_MenuItem;
this->m_SubMenuCode=p->m_SubMenuCode;
this->m_SubMenuUpperCode=p->m_SubMenuUpperCode;
this->m_SubMenuCaption=p->m_SubMenuCaption;
this->m_SubMenuDesc=p->m_SubMenuDesc;
this->m_SubMenuNo=p->m_SubMenuNo;
this->m_RightLevel=p->m_RightLevel;
this->m_SubMenuPicName=p->m_SubMenuPicName;
this->m_SubMenuSelPicName=p->m_SubMenuSelPicName;
}
void TsdSubMenu::AddSubMenu()
{
m_ImagePanel=NULL;
m_MenuItem=new TsdMenuItem;
m_MenuItem->sdParent=this;
TsdSubMenu *p=new TsdSubMenu(m_SubMenuPanel,m_Task);
if(m_sbLeft==NULL)
{
m_sbLeft=new TSpeedButton(m_SubMenuPanel);
m_sbLeft->Parent=m_SubMenuPanel;
m_sbLeft->Flat=true;
m_sbLeft->Glyph->LoadFromResourceName((int)HInstance,"MenuLeft");
m_sbLeft->Height=m_SubMenuPanel->Height-4;
m_sbLeft->Width=20;
m_sbLeft->Left=2;
m_sbLeft->Top =2;
m_sbLeft->Visible =false;
m_sbLeft->OnClick=SubMenuMoveLeftClick;
}
if(m_sbRight==NULL)
{
m_sbRight=new TSpeedButton(m_SubMenuPanel);
m_sbRight->Parent=m_SubMenuPanel;
m_sbRight->Flat=true;
m_sbRight->Glyph->LoadFromResourceName((int)HInstance,"MenuRight");
m_sbRight->Height=m_SubMenuPanel->Height-4;
m_sbRight->Width=20;
m_sbRight->Left=m_SubMenuPanel->Width-m_sbRight->Width - 2;
m_sbRight->Top =2;
m_sbRight->Visible =false;
m_sbRight->OnClick=SubMenuMoveRightClick;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -