如何去掉动态创建的按钮边框

捡了一棵小白菜 2015-05-19 08:43:42
如图所示,我动态创建了一个按钮,但是有一个感人的黑边框,我要怎么设置它的属性使这个按钮没有边框呢。创建代码如下:
DWORD dwStyle =WS_VISIBLE | BS_OWNERDRAW | WS_TABSTOP | BF_FLAT ;
CDiskPngButton *pDiskButtonItem = new CDiskPngButton( chLetter );

pDiskButtonItem->Create( wDiskName,dwStyle,CRect( pt.X , pt.Y , pt.X + 85 , pt.Y + 85 ) ,this , m_nDiskBtnID++);

这个CDiskPngButton 是继承CButton的,希望大家指点一下,谢谢。
...全文
413 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
看来没人关注了,就先结贴了吧,感谢楼上的帮助。
大树学长 2015-05-21
  • 打赏
  • 举报
回复
引用 5 楼 andy_luoy 的回复:
回复 @bigtree_mfc ,你的方法我试过了 不行,我用GetStyle()发现 我已经在创建的时候激活了自绘功能, 我在创建时候设置的按钮风格 就是 可见、自绘、支持tab键,最后一个 BF_FLAT 我搜索得到的 认为是无边框 , 但是结果还是不行。 回复 @zgl7903 这个响应函数是绘制非客户区吧,我添加了 但是还是不起作用。
楼主你用的是XP系统吧
  • 打赏
  • 举报
回复
引用 10 楼 bigtree_mfc 的回复:
[quote=引用 5 楼 andy_luoy 的回复:] 回复 @bigtree_mfc ,你的方法我试过了 不行,我用GetStyle()发现 我已经在创建的时候激活了自绘功能, 我在创建时候设置的按钮风格 就是 可见、自绘、支持tab键,最后一个 BF_FLAT 我搜索得到的 认为是无边框 , 但是结果还是不行。 回复 @zgl7903 这个响应函数是绘制非客户区吧,我添加了 但是还是不起作用。
楼主你用的是XP系统吧[/quote] 我用的是win7系统,美化特效都没有关闭。
引用 8 楼 schlafenhamster 的回复:
border 属于 NC, 试试处理下 WM_NCPAINT 返回0
4楼给我说过,我响应了这个消息,发现这个响应函数本身返回值就是void类型。
void CDiskPngButton::OnNcPaint()
{
	// TODO: 在此处添加消息处理程序代码
	// 不为绘图消息调用 CButton::OnNcPaint()	
}
最终我这个问题还是没有解决,但是 我目前使用双缓冲机制,直接在在内存切换图片,刷新按钮,所以遮盖住了这个黑框,不会被发现,如果使用透明图片还是有黑框。 希望还有其他大神过来指导一下怎么解决这个黑框问题。 重绘代码如下:
// 重载DrawItem,自绘按钮
void CDiskPngButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
	DrawButton( lpDrawItemStruct->hDC );  
}

//自绘按钮
void CDiskPngButton::DrawButton( HDC hDestDC )
{
	CRect rc;  
	GetClientRect(rc);  
	int nWindth=rc.Width();  
	int nHeight=rc.Height();  
	HDC hDC=CreateCompatibleDC(hDestDC);//创建兼容DC,采用双缓冲画出  
	HDC hMaskDC=CreateCompatibleDC(hDestDC);  
	HBITMAP hBitmap=CreateCompatibleBitmap(hDestDC,nWindth,nHeight);  
	HBITMAP hMaskBitmap=CreateCompatibleBitmap(hDestDC,nWindth,nHeight);  
	HBITMAP hOldBitmap=(HBITMAP)SelectObject(hDC,hBitmap);  
	HBITMAP hOldMaskBitmap=(HBITMAP)SelectObject(hMaskDC,hMaskBitmap);  
	SetBkMode(hDC,TRANSPARENT);  

	Graphics graphics( hDC );

	// 绘制背景
	if (m_bgImage != NULL)
	{
		Rect rect = Rect(0, 0, m_bgRect.Width(), m_bgRect.Height());
		graphics.DrawImage(m_bgImage, rect, m_bgRect.left, m_bgRect.top, m_bgRect.Width(), m_bgRect.Height(), UnitPixel, NULL, NULL, NULL);
	}

	// 绘制按钮图标
	if (m_curImage != NULL)
	{
		graphics.DrawImage(m_curImage, 0, 0, m_curImage->GetWidth(), m_curImage->GetHeight());
	}

	// 绘制标题
	
	COLORREF oldColor = GetTextColor( hDC );
	if (m_enableFlag == FALSE)
	{
		::SetTextColor( hDC , m_titleDisColor);
	}
	else
	{
		m_titleNorColor == -1 ? NULL : ::SetTextColor( hDC ,m_titleNorColor);
	}

	CRect titleRect = m_titleRect;
	if (titleRect == CRect(0, 0, 0, 0))
	{
		GetClientRect(&titleRect);
	}

	if (m_titleFont != NULL)
	{
		CFont newFont;
		newFont.CreateFontIndirect(m_titleFont); 

		HFONT* oldFont = (HFONT*)SelectObject( hDC , newFont.GetSafeHandle());
		DrawText( hDC , m_titleText, m_titleText.GetLength(), &titleRect, m_titleAlignFormat);

		::SelectObject( hDC ,oldFont); 
		newFont.DeleteObject(); 
	}
	else
	{
		DrawText( hDC ,m_titleText, m_titleText.GetLength(), &titleRect, m_titleAlignFormat);
	}
	::SetTextColor( hDC , oldColor);
	//复制到控件的DC上------------------------  
	::BitBlt( hDestDC ,0,0,nWindth,nHeight,hDC,0,0,SRCCOPY);  
	//删除资源,释放内存-----------------------  
	SelectObject(hDC,hOldBitmap);  
	DeleteObject(hBitmap);  
	DeleteDC(hDC);  
	SelectObject(hMaskDC,hOldMaskBitmap);  
	DeleteObject(hMaskBitmap);  
	DeleteDC(hMaskDC);  
}
参考示例:自绘半透明按钮 谢谢大家,我过几天再结贴,看看还有没解决方法。
  • 打赏
  • 举报
回复
回复 @bigtree_mfc ,你的方法我试过了 不行,我用GetStyle()发现 我已经在创建的时候激活了自绘功能, 我在创建时候设置的按钮风格 就是 可见、自绘、支持tab键,最后一个 BF_FLAT 我搜索得到的 认为是无边框 , 但是结果还是不行。

回复 @zgl7903 这个响应函数是绘制非客户区吧,我添加了 但是还是不起作用。
笨笨仔 2015-05-20
  • 打赏
  • 举报
回复
我到觉的你不如直接使用图标按钮
zgl7903 2015-05-20
  • 打赏
  • 举报
回复
试试处理下 WM_NCPAINT 返回0
大树学长 2015-05-20
  • 打赏
  • 举报
回复
//按钮类中 void C**Button::PreSubclassWindow() { //为按钮控件添加BS_OWNERDRAW,激活自绘功能 ModifyStyle(0,BS_OWNERDRAW);//我不知道去边框那个属性,反正差不多按照这样的 CButton::PreSubclassWindow(); } 你动态创建中DWORD dwStyle =WS_VISIBLE | BS_OWNERDRAW | WS_TABSTOP | BF_FLAT ;//这是设置按钮风格属性的,看有没有设置边框的
schlafenhamster 2015-05-20
  • 打赏
  • 举报
回复
border 属于 NC, 试试处理下 WM_NCPAINT 返回0
Eleven 2015-05-20
  • 打赏
  • 举报
回复
你自绘CButton,那你要看看你的CDiskPngButton 类中的DrawItem是怎么写的?
  • 打赏
  • 举报
回复
有没有大神 过来指导一下呀? 换了好多方式还是不行,我感觉就是在动态创建的时候少了一个属性没有设置,但是具体什么属性不清楚。
  • 打赏
  • 举报
回复
我继承的主要绘图代码如下:
// 背景重绘消息处理函数
BOOL CDiskPngButton::OnEraseBkgnd(CDC* pDC)
{
	return TRUE;
}


// 重载DrawItem,自绘按钮
void CDiskPngButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
	CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
	Graphics graphics(pDC->m_hDC);

	// 绘制背景
	if (m_bgImage != NULL)
	{
		Rect rect = Rect(0, 0, m_bgRect.Width(), m_bgRect.Height());
		graphics.DrawImage(m_bgImage, rect, m_bgRect.left, m_bgRect.top, m_bgRect.Width(), m_bgRect.Height(), UnitPixel, NULL, NULL, NULL);
	}

	// 绘制按钮图标
	if (m_curImage != NULL)
	{
		graphics.DrawImage(m_curImage, 0, 0, m_curImage->GetWidth(), m_curImage->GetHeight());
	}

	// 绘制标题
	pDC->SetBkMode(TRANSPARENT);
	COLORREF oldColor = pDC->GetTextColor();
	if (m_enableFlag == FALSE)
	{
		pDC->SetTextColor(m_titleDisColor);
	}
	else
	{
		m_titleNorColor == -1 ? NULL : pDC->SetTextColor(m_titleNorColor);
	}

	CRect titleRect = m_titleRect;
	if (titleRect == CRect(0, 0, 0, 0))
	{
		GetClientRect(&titleRect);
	}

	if (m_titleFont != NULL)
	{
		CFont newFont;
		newFont.CreateFontIndirect(m_titleFont); 

		CFont* oldFont = pDC->SelectObject(&newFont);
		pDC->DrawText(m_titleText, m_titleText.GetLength(), &titleRect, m_titleAlignFormat);

		pDC->SelectObject(oldFont); 
		newFont.DeleteObject(); 
	}
	else
	{
		pDC->DrawText(m_titleText, m_titleText.GetLength(), &titleRect, m_titleAlignFormat);
	}
	pDC->SetTextColor(oldColor);
}
这个好像和这个黑边框无关的,这个黑边框好像是CButton这个控己绘制的,我继承的PNGButton类只是在它基础上绘制了图片,如果图片是透明的话,就无法掩盖这个黑边框,我现在想知道怎么在创建的时候就不要黑边框,有没有一个属性能控制CButton的外观,不要黑边框呀?
洗洗睡去 2015-05-19
  • 打赏
  • 举报
回复
看你是怎么继承的了 参考cbitmapbutton吧

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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