Initial commit
This commit is contained in:
+235
@@ -0,0 +1,235 @@
|
||||
//---------------------------------------------------------------------------
|
||||
#include <vcl.h>
|
||||
#pragma hdrstop
|
||||
|
||||
#include "GlobalUnit.h"
|
||||
#include "PopMenuUnit.h"
|
||||
//---------------------------------------------------------------------------
|
||||
#pragma package(smart_init)
|
||||
|
||||
#define POPMENU_MINWIDTH 60
|
||||
#define BREAK_HEIGHT 5
|
||||
#define CLR_DISABLE RGB(163,153,143)
|
||||
|
||||
__fastcall TPopMenu::TPopMenu(TComponent* Owner)
|
||||
: TPopupMenu( Owner )
|
||||
{
|
||||
m_pPicChecked = m_pPicNormal = m_pPicHover = NULL;
|
||||
|
||||
OwnerDraw = TRUE;
|
||||
AutoHotkeys = maManual;
|
||||
|
||||
m_pFntText = new TFont();
|
||||
m_pFntText->Name = "黑体";
|
||||
m_pFntText->Size = int(10 * 96.0 / g_yDpi + 0.5);
|
||||
|
||||
m_clrNormal = RGB(60,43,23);
|
||||
m_clrHover = RGB(232,212,191);
|
||||
m_clrBreak = RGB(150,118,80);
|
||||
m_clrFrame = RGB(206,162,126);
|
||||
|
||||
m_pPicNormal = new TBitmap;
|
||||
m_pPicNormal->LoadFromResourceName(int(HInstance), "MenuNormalBar");
|
||||
|
||||
m_pPicHover = new TBitmap;
|
||||
m_pPicHover->LoadFromResourceName(int(HInstance), "MenuHoverBar");
|
||||
|
||||
m_pPicChecked = new TBitmap;
|
||||
m_pPicChecked->LoadFromResourceName(int(HInstance), "MenuChecked");
|
||||
}
|
||||
|
||||
__fastcall TPopMenu::~TPopMenu()
|
||||
{
|
||||
if( m_pPicNormal )
|
||||
delete m_pPicNormal;
|
||||
if( m_pPicHover )
|
||||
delete m_pPicHover;
|
||||
if( m_pPicChecked )
|
||||
delete m_pPicChecked;
|
||||
if( m_pFntText )
|
||||
delete m_pFntText;
|
||||
|
||||
ClearMenuItem();
|
||||
}
|
||||
|
||||
void TPopMenu::CreateCustomMenuItem( String strCaption, TNotifyEvent aClickEvent,
|
||||
int subIndex, bool bEnabled, bool bChecked, int iTag )
|
||||
{
|
||||
TMenuItem * pItem = new TMenuItem( this );
|
||||
pItem->Caption = strCaption;
|
||||
|
||||
pItem->OnAdvancedDrawItem = OwnerDrawItem;
|
||||
pItem->OnMeasureItem = OwnerMeasureItem;
|
||||
pItem->OnClick = aClickEvent;
|
||||
pItem->Checked = bChecked;
|
||||
pItem->Enabled = bEnabled;
|
||||
|
||||
pItem->Tag = iTag;
|
||||
|
||||
if( subIndex==-1 )
|
||||
Items->Add( pItem );
|
||||
else
|
||||
Items->Items[subIndex]->Add( pItem );
|
||||
}
|
||||
|
||||
void TPopMenu::ClearMenuItem()
|
||||
{
|
||||
for( int i=Items->Count-1; i>=0; i-- ){
|
||||
Items->Delete(i);
|
||||
}
|
||||
}
|
||||
|
||||
void __fastcall TPopMenu::OwnerDrawItem(TObject* Sender, TCanvas* ACanvas, const TRect &ARect, TOwnerDrawState State)
|
||||
{
|
||||
TMenuItem *pItem = (TMenuItem*)Sender;
|
||||
TRect rectDraw(ARect.left , ARect.top, ARect.right, ARect.bottom);
|
||||
|
||||
if( pItem->MenuIndex==0 ){ //第一个菜单项
|
||||
|
||||
ACanvas->Pen->Color = m_clrBreak;
|
||||
ACanvas->MoveTo( ARect.left, ARect.top );
|
||||
ACanvas->LineTo( ARect.right, ARect.top );
|
||||
|
||||
ACanvas->Pen->Color = m_clrFrame;
|
||||
ACanvas->MoveTo( ARect.left+1, ARect.top+1 );
|
||||
ACanvas->LineTo( ARect.right-1, ARect.top+1 );
|
||||
|
||||
ACanvas->Pen->Color = m_clrBreak;
|
||||
ACanvas->MoveTo( ARect.left+2, ARect.top+2 );
|
||||
ACanvas->LineTo( ARect.right-2, ARect.top+2 );
|
||||
|
||||
ACanvas->Pixels[ARect.left][ARect.top+1] = m_clrBreak;
|
||||
ACanvas->Pixels[ARect.left][ARect.top+2] = m_clrBreak;
|
||||
ACanvas->Pixels[ARect.right-1][ARect.top+1] = m_clrBreak;
|
||||
ACanvas->Pixels[ARect.right-1][ARect.top+2] = m_clrBreak;
|
||||
ACanvas->Pixels[ARect.left+1][ARect.top+2] = m_clrFrame;
|
||||
ACanvas->Pixels[ARect.right-2][ARect.top+2] = m_clrFrame;
|
||||
|
||||
rectDraw.top += 3;
|
||||
}
|
||||
|
||||
TMenuItem * pItemParent = pItem->Parent;
|
||||
if( pItem->MenuIndex==pItemParent->Count-1 ){ //最后一个菜单项
|
||||
ACanvas->Pen->Color = m_clrBreak;
|
||||
ACanvas->MoveTo( ARect.left, ARect.bottom-1 );
|
||||
ACanvas->LineTo( ARect.right, ARect.bottom-1 );
|
||||
|
||||
ACanvas->Pen->Color = m_clrFrame;
|
||||
ACanvas->MoveTo( ARect.left+1, ARect.bottom-2 );
|
||||
ACanvas->LineTo( ARect.right-1, ARect.bottom-2 );
|
||||
|
||||
ACanvas->Pen->Color = m_clrBreak;
|
||||
ACanvas->MoveTo( ARect.left+2, ARect.bottom-3 );
|
||||
ACanvas->LineTo( ARect.right-2, ARect.bottom-3 );
|
||||
|
||||
ACanvas->Pixels[ARect.left][ARect.bottom-2] = m_clrBreak;
|
||||
ACanvas->Pixels[ARect.left][ARect.bottom-3] = m_clrBreak;
|
||||
ACanvas->Pixels[ARect.right-1][ARect.bottom-2] = m_clrBreak;
|
||||
ACanvas->Pixels[ARect.right-1][ARect.bottom-3] = m_clrBreak;
|
||||
ACanvas->Pixels[ARect.left+1][ARect.bottom-3] = m_clrFrame;
|
||||
ACanvas->Pixels[ARect.right-2][ARect.bottom-3] = m_clrFrame;
|
||||
|
||||
rectDraw.bottom -= 3;
|
||||
}
|
||||
|
||||
//绘制左边框
|
||||
ACanvas->Pen->Color = m_clrBreak;
|
||||
ACanvas->MoveTo( rectDraw.left, rectDraw.top );
|
||||
ACanvas->LineTo( rectDraw.left, rectDraw.bottom );
|
||||
|
||||
ACanvas->Pen->Color = m_clrFrame;
|
||||
ACanvas->MoveTo( rectDraw.left+1, rectDraw.top );
|
||||
ACanvas->LineTo( rectDraw.left+1, rectDraw.bottom );
|
||||
|
||||
ACanvas->Pen->Color = m_clrBreak;
|
||||
ACanvas->MoveTo( rectDraw.left+2, rectDraw.top );
|
||||
ACanvas->LineTo( rectDraw.left+2, rectDraw.bottom );
|
||||
|
||||
rectDraw.left += 3;
|
||||
|
||||
//绘制右边框
|
||||
ACanvas->Pen->Color = m_clrBreak;
|
||||
ACanvas->MoveTo( rectDraw.right-1, rectDraw.top );
|
||||
ACanvas->LineTo( rectDraw.right-1, rectDraw.bottom );
|
||||
|
||||
ACanvas->Pen->Color = m_clrFrame;
|
||||
ACanvas->MoveTo( rectDraw.right-2, rectDraw.top );
|
||||
ACanvas->LineTo( rectDraw.right-2, rectDraw.bottom );
|
||||
|
||||
ACanvas->Pen->Color = m_clrBreak;
|
||||
ACanvas->MoveTo( rectDraw.right-3, rectDraw.top );
|
||||
ACanvas->LineTo( rectDraw.right-3, rectDraw.bottom );
|
||||
|
||||
rectDraw.right -= 3;
|
||||
|
||||
//绘制背景
|
||||
if( State.Contains(odSelected) && !State.Contains(odDisabled) ){
|
||||
//高亮项
|
||||
m_pFntText->Color = m_clrHover;
|
||||
|
||||
ACanvas->StretchDraw( rectDraw, m_pPicHover );
|
||||
}
|
||||
else{
|
||||
if( State.Contains(odDisabled) ){
|
||||
//禁用项
|
||||
m_pFntText->Color = CLR_DISABLE;
|
||||
}
|
||||
else{
|
||||
//常规项
|
||||
m_pFntText->Color = m_clrNormal;
|
||||
}
|
||||
|
||||
ACanvas->StretchDraw( rectDraw, m_pPicNormal );
|
||||
}
|
||||
|
||||
//绘制Check框
|
||||
if( State.Contains(odChecked) ){
|
||||
TRect rectCheck( rectDraw.left+4, rectDraw.top+4, rectDraw.left+20, rectDraw.top+20 );
|
||||
ACanvas->StretchDraw( rectCheck, m_pPicChecked );
|
||||
}
|
||||
|
||||
//绘制伴奏类型颜色
|
||||
if( pItem->Tag>0 && (pItem->Tag & SHOW_STAGE_VAR) ){
|
||||
TRect rectVar( rectDraw.right-28, rectDraw.top+4, rectDraw.right-4, rectDraw.top+20 );
|
||||
|
||||
ACanvas->Pen->Color = m_clrFrame;
|
||||
ACanvas->Brush->Color = g_clrStage[pItem->Tag & 0xFFFF];
|
||||
ACanvas->Rectangle( rectVar );
|
||||
}
|
||||
|
||||
if( pItem->IsLine() ){
|
||||
ACanvas->Pen->Color = m_clrFrame;
|
||||
ACanvas->MoveTo( rectDraw.left+6, rectDraw.top+2 );
|
||||
ACanvas->LineTo( rectDraw.right-6, rectDraw.top+2 );
|
||||
}
|
||||
else{
|
||||
TFont *oldFont = ACanvas->Font;
|
||||
ACanvas->Font = m_pFntText;
|
||||
ACanvas->Brush->Style = bsClear;
|
||||
ACanvas->TextRect( ARect, rectDraw.left+24, rectDraw.top+6, pItem->Caption ); //输出菜单文字
|
||||
ACanvas->Font = oldFont;
|
||||
}
|
||||
}
|
||||
|
||||
void __fastcall TPopMenu::OwnerMeasureItem(TObject* Sender, TCanvas* ACanvas, int &Width, int &Height)
|
||||
{
|
||||
TMenuItem *pItem = (TMenuItem*)Sender;
|
||||
|
||||
// if( pItem->Tag>=0 )
|
||||
Width += 36;
|
||||
|
||||
// if( pItem->Checked )
|
||||
Width += 24;
|
||||
|
||||
if( pItem->IsLine() )
|
||||
Height = BREAK_HEIGHT;
|
||||
else{
|
||||
Height = m_pPicNormal->Height;
|
||||
if( pItem->MenuIndex==0 ) //第一个菜单项
|
||||
Height += 3;
|
||||
|
||||
TMenuItem * pItemParent = pItem->Parent;
|
||||
if( pItem->MenuIndex==pItemParent->Count-1) //最后一个菜单项
|
||||
Height += 3;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user