按以下步骤:
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.自定义一个类,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来实现这种效果,但最好不用这个,因为项目中不好加.
解决方案 »
- VC工程里能直接导入EXE文件到资源里,然后再生成我自己的EXE吗?
- 在窗口中将CStatic控件,用FillRect填充了颜色,但是每当其他程序一档住,这颜色就没了。如果让它长久保持颜色呢?
- 在对话框的picture控件中显示图像问题
- 统计传入的字数问题
- 我在程序里调用了函数timeGetTime(),已经#include <windows.h>,为什么还说我没有定义?
- 那我的scrollbar想根据document的变化改变,怎么办??
- 请问如何让提取的随机数不重复?
- 谁知道stat(const char *, struct stat *)这个函数的作用?
- 毕业设计做一个从图片识别汉字和图形的程序怎么样?难度大不大?
- 有认谁愿意和我一起编程?
- 重复调dll的同一函数出错
- 我要做一个程序来访问SYBASE数据库,但是要联上服务器上的几个数据库,不知道如何操作?
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,所以没看你的代码
{
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);
}