按以下步骤:
1.自定义一个类,CButtonEx:public CButton.
2.在view中创建,CButtonEx btn;
   btn.Create( ..., WS_VISIBLE|WS_CHILD|BS_OWNERDRAW, ... );
3.CButtonEx中的DrawItem()函数,这样写:
void CButtonEx::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
CDC* pDC = CDC::FromHandle(lpDIS->hDC);
CRect rc;
GetClientRect(&rc); CWnd* pParent = GetParent();
CClientDC dcparent( pParent );
CRect rc1;
GetWindowRect( &rc1 );
pParent->ScreenToClient( &rc1 );
pDC->BitBlt( 0,0,rc.Width(),rc.Height(),&dcparent, rc1.left,rc1.top,SRCCOPY ); CBrush brush;
brush.CreateSolidBrush( RGB(128,128,128) );
CBrush* pold = pDC->SelectObject(&brush );
pDC->Ellipse( &rc );
pDC->SelectObject( pold );
}可能你已经知道我想干什么了,对,我想在自绘按钮上画一个圆,圆四周的空白我想它保持父窗口的背景..但是以上代码却运行不成功,圆的四周也并没有被父窗口的背景复盖..这是为什么呢?怎么解决呢?
我知道还可以用hrgn来实现这种效果,但最好不用这个,因为项目中不好加.

解决方案 »

  1.   

    我是这样写的,结果会得到一个椭圆: HBRUSH hBrushStaticTemp; hBrushStaticTemp=CreateSolidBrush(RGB(100, 213, 241));

    RECT rect = lpds->rcItem ;

    void *pOldBrush = SelectObject(lpds->hDC,hBrushStaticTemp);
    RoundRect(lpds->hDC, rect.left, rect.top, rect.right, rect.bottom, 10, 10);
    SelectObject(lpds->hDC, pOldBrush);
    DeleteObject(hBrushStaticTemp);很抱歉,我还不大习惯用mfc,所以没看你的代码
      

  2.   

    修改 DrawItemvoid CButtonEx::DrawItem(LPDRAWITEMSTRUCT lpDIS)
    {
    CDC* pDC = CDC::FromHandle(lpDIS->hDC);
    CRect rc;
    GetClientRect(&rc);CBrush brush;
    brush.CreateSolidBrush( RGB(128,128,128) );
    CBrush* pold = pDC->SelectObject(&brush );
    pDC->Ellipse( &rc );
    pDC->SelectObject( pold );
    }处理 WM_ERASEBKBND 消息, 注释掉CButton的默认处理
    BOOL CButtonEx::OnEraseBkgnd(CDC* pDC)
    {
      return TRUE;//CButton::OnEraseBkgnd(pDC);
    }