小弟想实现一个透明的容器控件,参照了有人写的透明按钮的代码,把父窗体的相应位置保存起来,作为控件的背景,但是效果却是把窗体被穿透了,代码如下:
int CSecondActivxCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1) return -1;
// TODO: Add your specialized creation code here
CWnd *pWnd;
pWnd=GetParent();
CPaintDC clDC(pWnd);
CRect rect; CRect rect1;
GetClientRect(rect);
GetWindowRect(rect1);
pWnd->ScreenToClient(rect1);
if (m_dcBk->m_hDC == NULL)
{
m_dcBk->CreateCompatibleDC(&clDC);
m_bmpBk->CreateCompatibleBitmap(&clDC, rect.Width(), rect.Height());
CBitmap* pbmpOldBk = m_dcBk->SelectObject(m_bmpBk);
// m_dcBk->StretchBlt(0, 0, rect.Width(), rect.Height(), &clDC, rect1.left, rect1.top, rect.Width(), rect.Height(), SRCCOPY);
m_dcBk->BitBlt(0,0, rect.Width(), rect.Height(), &clDC, rect1.left, rect1.top, SRCCOPY);
m_dcBk->SelectObject(pbmpOldBk);
}
return 0;
}void CSecondActivxCtrl::OnDraw(
CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
CWnd *pWnd;
pWnd=GetParent();
CRect rect; GetClientRect(rect);
CBitmap* pbmpOldBk = m_dcBk->SelectObject(CBitmap::FromHandle(m_hBK));
pdc->BitBlt(0, 0, rect.Width(), rect.Height(), m_dcBk, 0, 0, SRCCOPY);
m_dcBk->SelectObject(pbmpOldBk);
}
其中,m_dcBk、m_hBK、m_bmpBk为控件的成员变量请哪位大侠指点一下迷津,为啥不能拷到父窗体的内容,而是穿透效果,或者各位有什么好的办法能够实现一个透明的容器控件,不胜感激!
int CSecondActivxCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1) return -1;
// TODO: Add your specialized creation code here
CWnd *pWnd;
pWnd=GetParent();
CPaintDC clDC(pWnd);
CRect rect; CRect rect1;
GetClientRect(rect);
GetWindowRect(rect1);
pWnd->ScreenToClient(rect1);
if (m_dcBk->m_hDC == NULL)
{
m_dcBk->CreateCompatibleDC(&clDC);
m_bmpBk->CreateCompatibleBitmap(&clDC, rect.Width(), rect.Height());
CBitmap* pbmpOldBk = m_dcBk->SelectObject(m_bmpBk);
// m_dcBk->StretchBlt(0, 0, rect.Width(), rect.Height(), &clDC, rect1.left, rect1.top, rect.Width(), rect.Height(), SRCCOPY);
m_dcBk->BitBlt(0,0, rect.Width(), rect.Height(), &clDC, rect1.left, rect1.top, SRCCOPY);
m_dcBk->SelectObject(pbmpOldBk);
}
return 0;
}void CSecondActivxCtrl::OnDraw(
CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
CWnd *pWnd;
pWnd=GetParent();
CRect rect; GetClientRect(rect);
CBitmap* pbmpOldBk = m_dcBk->SelectObject(CBitmap::FromHandle(m_hBK));
pdc->BitBlt(0, 0, rect.Width(), rect.Height(), m_dcBk, 0, 0, SRCCOPY);
m_dcBk->SelectObject(pbmpOldBk);
}
其中,m_dcBk、m_hBK、m_bmpBk为控件的成员变量请哪位大侠指点一下迷津,为啥不能拷到父窗体的内容,而是穿透效果,或者各位有什么好的办法能够实现一个透明的容器控件,不胜感激!
void CSongDemoDlg::ShowLayerMenuItem1()
{
m_Bitmap.LoadBitmap(IDB_LAYER_MENU_ITEM1);
CDC Bitmap_DC,HideBitmap_DC,*pDC;
CBitmap Bitmap;
pDC=GetDC(); Bitmap_DC.CreateCompatibleDC(pDC);
HideBitmap_DC.CreateCompatibleDC(pDC);
BITMAP m_tagBitmap;
m_Bitmap.GetBitmap(&m_tagBitmap); Bitmap.CreateBitmap(m_tagBitmap.bmWidth,m_tagBitmap.bmHeight,1,1,NULL);
HideBitmap_DC.SelectObject(&Bitmap); Bitmap_DC.SelectObject(&m_Bitmap);
Bitmap_DC.SetBkColor(RGB(255,255,255));
HideBitmap_DC.BitBlt(0,0,m_tagBitmap.bmWidth,m_tagBitmap.bmHeight,&Bitmap_DC,0,0,SRCCOPY);
Bitmap_DC.SetBkColor(RGB(0,0,0));
Bitmap_DC.SetTextColor(RGB(255,255,255));
Bitmap_DC.BitBlt(0,0,m_tagBitmap.bmWidth,m_tagBitmap.bmHeight,&HideBitmap_DC,0,0,SRCAND);
pDC->SetBkColor(RGB(255,255,255));
pDC->SetTextColor(RGB(0,0,0));
pDC->BitBlt(200,60,m_tagBitmap.bmWidth,m_tagBitmap.bmHeight,&HideBitmap_DC,0,0,SRCAND);
pDC->BitBlt(200,60,m_tagBitmap.bmWidth,m_tagBitmap.bmHeight,&Bitmap_DC,0,0,SRCPAINT); Bitmap.DeleteObject(); m_Bitmap.DeleteObject();
HideBitmap_DC.DeleteDC();
Bitmap_DC.DeleteDC();
pDC->DeleteDC();
}