+ -
当前位置:首页 → 问答吧 → 可切换背景窗口实现透明问题。。。。请大大帮忙

可切换背景窗口实现透明问题。。。。请大大帮忙

时间:2011-11-29

来源:互联网

我这样实现了背景切换,然后又实现了窗口透明,可是只有第一个背景时候窗口是透明的,换了图片后就报错,点忽略图片换了可是不透明了。。。这是为什么呢?大大们帮帮忙 呃。
C/C++ code

BOOL CCalendarDlg::OnInitDialog()
    CBitmap bmp;
    bmp.LoadBitmap(m_nBkResID);
    m_brBk.CreatePatternBrush(&bmp);
    bmp.DeleteObject();

void CCalendarDlg::OnBnClickedChangebk()
{
    // TODO: 在此添加控件通知处理程序代码
    if ( m_nBkResID == IDB_BK1)
    {
        m_nBkResID = IDB_BK2;
    }
    else if(m_nBkResID == IDB_BK2)
    {
        m_nBkResID = IDB_BK3;
    }
    else
    {
        m_nBkResID = IDB_BK1;
    }
    
    OnInitDialog();
    Invalidate(TRUE);
}

实现透明:
C/C++ code

BOOL CCalendarDlg::OnInitDialog()
    SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
        GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
    HINSTANCE hInst = LoadLibrary("User32.DLL"); 
    if(hInst) 
    { 
        typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD); 
        MYFUNC fun = NULL;
        //取得SetLayeredWindowAttributes函数指针 
        fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
        if(fun)
            fun(this->GetSafeHwnd(),0,200,2);
        FreeLibrary(hInst); 
    } 

void CCalendarDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
        BYTE m=(BYTE)m_sld.GetPos();
        HINSTANCE hInst = LoadLibrary("User32.DLL"); 
        if(hInst) 
        {            
            typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
            MYFUNC fun = NULL;
            fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes"); //取得SetLayeredWindowAttributes函数指针  
            if(fun)
                fun(AfxGetMainWnd()->GetSafeHwnd(),0,m*2,2);  
        
            FreeLibrary(hInst); 
        };
        CString str;
        str.Format("窗体的透明度:%%%d",100 * m / 500);
        SetDlgItemText(IDC_TOUMING,str);


作者: wangyujonny   发布时间: 2011-11-29

换了图片后就报错,报什么错呢??内存错误???

作者: Q342210738   发布时间: 2011-11-29

引用 1 楼 q342210738 的回复:

换了图片后就报错,报什么错呢??内存错误???


Debug Assertion Failed!

在wingdi.cpp里
C/C++ code

    ASSERT(m_hObject == NULL);      // only attach once, detach on destroy
    if (hObject == NULL)
    {
        return FALSE;
    }


这里中断了

作者: wangyujonny   发布时间: 2011-11-29

忽略以后可以切换图片,第一次切换背景没有透明了,第二次又有了。。。。无奈。。。一共三个背景图片

作者: wangyujonny   发布时间: 2011-11-29

当我看到在你的切换图片的函数中,调用了OnInitDialog的时候,就知道 有些错误是必然的~

作者: wangweixu520   发布时间: 2011-11-29

引用 4 楼 wangweixu520 的回复:

当我看到在你的切换图片的函数中,调用了OnInitDialog的时候,就知道 有些错误是必然的~

呃呃,请问应该怎么做呢???这里不是调用是在这个对象下写的。。。

作者: wangyujonny   发布时间: 2011-11-29