这几天在win7下编了个MFC的小程序,是vs2008下完成的。
    CDialog的属性设置了 Transparent == true。
    然后自己填充了背景图片,
    使用
   OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
   {
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if (pWnd == this)
{
return m_brBk;
}
return hbr;
   }
   
   最后发现在win7下,背景显示很正常。
   但是同样的程序在xp下背景真透明了。
   各位大侠来讨论一下,这方面win7和xp的差异。

解决方案 »

  1.   

    很多这样的情况
    像CMFC....的类,有些在XP下是显示异常的。
      

  2.   

    win7和xp的色彩显示有差异,用同样的RGB值感觉效果不一样。
    如果你想要透明效果的话可以在oninitialdialog里面加入。但是这个可能在会消耗资源,如果程序控件较多,会很明显的看出来。
    SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
    GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
    HINSTANCE hInst = LoadLibraryW(_T("User32.DLL"));
    if (hInst)
    {
    typedef BOOL(WINAPI *MYFUNC)(HWND, COLORREF, BYTE, DWORD);
    MYFUNC fun = NULL;
    fun = (MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes"); if (fun)
    {
    fun(this->GetSafeHwnd(), 0, 250, 2); //中间的250是调节透明度的
    }
    FreeLibrary(hInst);
    }
      

  3.   

    系统底层的变化没办法,把代码放到OnPaint里面避开这个问题吧
      

  4.   

    这个问题挺诡异的.不但win7和xp不一样,而且win7下debug与release下也不一样.管理员权限与普通用户也有区别.甚至有时候不同的工作目录下也有差异.
    谢谢各位捧场.