小弟想实现一个透明的容器控件,参照了有人写的透明按钮的代码,把父窗体的相应位置保存起来,作为控件的背景,但是效果却是把窗体被穿透了,代码如下:
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为控件的成员变量请哪位大侠指点一下迷津,为啥不能拷到父窗体的内容,而是穿透效果,或者各位有什么好的办法能够实现一个透明的容器控件,不胜感激!

解决方案 »

  1.   

    背景透明
    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();
    }