首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

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

2014-01-09 
自绘TPopupMenu出现白色边框我继承TPopupMenu ,使用OwnerDraw TRUE 自绘菜单项,但是外面的白色边框该怎

自绘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版绘制边框部分,你可以参考下。

热点排行