15,979
社区成员
发帖
与我相关
我的任务
分享
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++);
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);
}
参考示例:自绘半透明按钮 谢谢大家,我过几天再结贴,看看还有没解决方法。// 背景重绘消息处理函数
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的外观,不要黑边框呀?