我在DrawItem()函数里面抄了一段CButtonST的代码(如下PaintBk函数),用来画按纽的背景图,但是编译后,在该按纽的位置出现了一片空白,根本就没出现背景图。
void CMyButton::PaintBk(CDC *pDC)
{
CClientDC clDC(GetParent());
CRect rect;
CRect rect1; GetClientRect(rect); GetWindowRect(rect1);
GetParent()->ScreenToClient(rect1); if (m_dcBk.m_hDC == NULL)
{
m_dcBk.CreateCompatibleDC(&clDC);
m_bmpBk.CreateCompatibleBitmap(&clDC, rect.Width(), rect.Height());
m_pbmpOldBk = m_dcBk.SelectObject(&m_bmpBk);
m_dcBk.BitBlt(0, 0, rect.Width(), rect.Height(),
&clDC,rect1.left,rect1.top, SRCCOPY);
}
pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &m_dcBk, 0, 0,
SRCCOPY);
}是不是m_dcBk.BitBlt(0, 0, rect.Width(), rect.Height(),
&clDC,rect1.left,rect1.top, SRCCOPY);
这段代码有问题,因为rect1的那个区域被按钮占着,结果m_dcBk里面什么也没保存,所以画出来也是空的。如果是上述错误,是不是要在调用上述函数前先将按纽区域的背景图保存下来,但那样的话就必须在按纽初始化前保存,这段代码(保存背景图)该写在哪儿呢?
如果不是上述错误,请给个解决的办法?
void CMyButton::PaintBk(CDC *pDC)
{
CClientDC clDC(GetParent());
CRect rect;
CRect rect1; GetClientRect(rect); GetWindowRect(rect1);
GetParent()->ScreenToClient(rect1); if (m_dcBk.m_hDC == NULL)
{
m_dcBk.CreateCompatibleDC(&clDC);
m_bmpBk.CreateCompatibleBitmap(&clDC, rect.Width(), rect.Height());
m_pbmpOldBk = m_dcBk.SelectObject(&m_bmpBk);
m_dcBk.BitBlt(0, 0, rect.Width(), rect.Height(),
&clDC,rect1.left,rect1.top, SRCCOPY);
}
pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &m_dcBk, 0, 0,
SRCCOPY);
}是不是m_dcBk.BitBlt(0, 0, rect.Width(), rect.Height(),
&clDC,rect1.left,rect1.top, SRCCOPY);
这段代码有问题,因为rect1的那个区域被按钮占着,结果m_dcBk里面什么也没保存,所以画出来也是空的。如果是上述错误,是不是要在调用上述函数前先将按纽区域的背景图保存下来,但那样的话就必须在按纽初始化前保存,这段代码(保存背景图)该写在哪儿呢?
如果不是上述错误,请给个解决的办法?
解决方案 »
- 关于MoveFile的问题
- 初学者问题,望高手指教!
- 显示位图的问题!
- 关于控件可移动的问题,鼠标拖拽 ????
- 如何得到与OnDraw相同的CDC
- 如果设置客户区域的逻辑坐标?
- CWnd::Attach()这个函数的作用是什么
- 在线等待。。。我的多线程为什么会造成程序死掉???
- 获得组件的接口的工具
- VC里是否什么工具可以用来做加密软件????
- 1。用Create出来的CListCtrl控件如何设置Extended Styles中的Transparent属性,如果用SetExtendedStyle(WS_EX_TRANSPARENT)似乎不管用,
- 高手帮帮我,为什么我VC做的程序到别的机器上不能运行,提示找不到MFC42D.DLL,在线等待
只要你在DrawItem的开始阶段保存画面就行了
你的可能是被后面画上的东西覆盖了
你检查一下你的代码,在画上背景后是不是用了
Rectangle(),FillRect(),FillRgn之类的函数void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CClientDC clDC(GetParent());
CRect rect;
CRect rect1;
CDC *pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
GetClientRect(rect); GetWindowRect(rect1);
GetParent()->ScreenToClient(rect1); if (m_dcBK.m_hDC == NULL)
{
m_dcBK.CreateCompatibleDC(&clDC);
m_bmpBK.CreateCompatibleBitmap(&clDC, rect.Width(), rect.Height());
m_pbmpOldBK = m_dcBK.SelectObject(&m_bmpBK);
m_dcBK.BitBlt(0, 0, rect.Width(), rect.Height(),
&clDC,rect1.left,rect1.top, SRCCOPY);
}
pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &m_dcBK, 0, 0,
SRCCOPY);
pDC->Draw3dRect(rect.left,rect.top,rect.right,rect.bottom,RGB(128,128,28),0);
pDC->SetBkMode(0);
pDC->SetTextColor(RGB(255,0,0));
pDC->SetTextAlign(TA_CENTER);
pDC->TextOut(rect.Width()/2,rect.Height()/2-5,"透明按纽");
}