自绘TPopupMenu出现白色边框

liuanqingoscar 2013-12-31 01:11:38
我继承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)
{
//这个函数空的。。。
}
...全文
140 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuanqingoscar 2014-01-02
  • 打赏
  • 举报
回复
不行的呢。。。 有白色边框,与我想要的风格完全不符合,求详细解决方案,谢谢。
我看见佛 2014-01-02
  • 打赏
  • 举报
回复
WIN XP下可以实现的说。
hzg134679hzg 2013-12-31
  • 打赏
  • 举报
回复
这个问题哥在三年前解决过!
liuanqingoscar 2013-12-31
  • 打赏
  • 举报
回复
大哥 按照你的方法 不成功呢。。。 void __fastcall TPopMenu::OwnerMeasureItem(TObject* Sender, TCanvas* ACanvas, int &Width, int &Height) { HWND hMenu= WindowFromDC(ACanvas->Handle); if( hMenu!=this->Handle&&hMenu!=0 ) { TCanvas *tempCanvas = new TCanvas(); tempCanvas->Handle = GetDC(0); tempCanvas->Pen->Color = RGB(0,255,0); tempCanvas->Brush->Color = RGB(0,0,255); tagRECT temRect; GetWindowRect(hMenu,&temRect); TRect tempRect((int)(temRect.left),(int)(temRect.top),(int)(temRect.right),(int)(temRect.bottom) ); ////////////////////// tempCanvas->FrameRect(tempRect); InflateRect(tempRect,-1,-1); tempCanvas->Brush->Color = RGB(0,0,0); tempCanvas->FrameRect(tempRect); InflateRect(tempRect,-1,-1); tempCanvas->FrameRect(tempRect); ReleaseDC(0,tempCanvas->Handle); delete tempCanvas; } }
我看见佛 2013-12-31
  • 打赏
  • 举报
回复
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版绘制边框部分,你可以参考下。
liuanqingoscar 2013-12-31
  • 打赏
  • 举报
回复

情况是这样 外面有个白色边框。。。

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧