读书人

自绘TPopupMenu出现白色边框,该怎么解

发布时间: 2014-01-09 23:07:34 作者: rapoo

自绘TPopupMenu出现白色边框
我继承TPopupMenu ,使用OwnerDraw = TRUE; 自绘菜单项,但是外面的白色边框该怎样绘制?
上代码:
//头文件
class TPopMenu : public TPopupMenu
{
private:
//TBitmap *m_pPicNormal, *m_pPicHover, *m_pPicChecked;
TFont *m_pFntText;
COLORREF m_clrNormal, m_clrHover, m_clrBreak, m_clrFrame;
public:
__fastcall TPopMenu(TComponent* Owner);
__fastcall ~TPopMenu();

void CreateCustomMenuItem( String strCaption, TNotifyEvent aClickEvent=NULL,
int subIndex=-1, bool bEnbaled=true, bool bChecked=false, int iTag=-1 );
void ClearMenuItem();
void __fastcall OwnerDrawItem(TObject* Sender, TCanvas* ACanvas, const TRect &ARect, TOwnerDrawState State);
void __fastcall OwnerMeasureItem(TObject* Sender, TCanvas* ACanvas, int &Width, int &Height);
};


//添加项 在添加项中 OnAdvancedDrawItem 与OnMeasureItem 实现自己绘制
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 __fastcall TPopMenu::OwnerDrawItem(TObject* Sender, TCanvas* ACanvas, const TRect &ARect, TOwnerDrawState State)
{
//绘制背景
if( State.Contains(odSelected) && !State.Contains(odDisabled) ){
//高亮项
m_pFntText->Color = m_clrHover;
ACanvas->Brush->Color = RGB(78,89,87);
ACanvas->FillRect(ARect);
}
else{
if( State.Contains(odDisabled) ){
//禁用项
m_pFntText->Color = CLR_DISABLE;
}
else{
//常规项
m_pFntText->Color = m_clrNormal;


}
ACanvas->Brush->Color = RGB(123,45,90);
ACanvas->FillRect(ARect);
}

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)
{
//这个函数空的。。。
}
[解决办法]

hMenu := WindowFromDC(ACanvas.Handle);
//Border flat...
if ( hMenu <> Handle ) and ( hMenu <> 0 ) then
begin
TmpCanvas := TCanvas.Create;

TmpCanvas.Handle := GetDC(0);
TmpCanvas.Pen.Color := $AE7323;//CF9365;
TmpCanvas.Brush.Color:= $AE7323;//CF9365;
GetWindowRect(hMenu, TmpRect);

TmpCanvas.FrameRect(TmpRect);
InflateRect(TmpRect, -1, -1);
TmpCanvas.Brush.Color := $FFFFFF;//DFDBDF;
TmpCanvas.FrameRect(TmpRect);
InflateRect(TmpRect, -1, -1);
TmpCanvas.FrameRect(TmpRect);

ReleaseDC(0, TmpCanvas.Handle);
TmpCanvas.Free;
end;这部分代码是DELPHI版绘制边框部分,你可以参考下。

读书人网 >.NET

热点推荐