用user32.dll 里的setlayer...... 函数可以使用整个窗体透明化,
那部分透明怎么做?
例如对话框中间的一个椭圆形、正方形,让它透明怎么实现?gz

解决方案 »

  1.   

    在Windows 2000和Windows XP中的User32.dll中有一个新的函数SetLayeredWindowAttributes,为了使用这个函数,需要在创建窗口或后来使用SetWindowLong函数时给程序窗口风格设置WS_EX_LAYERED (0x00080000)位(bit),这样程序就能够通过窗口句柄调用这个函数,设置整个窗口透明或窗口的某种指定的颜色透明。此函数需要下列参数。HWND hWnd: 窗口句柄 
    COLORREF col: 设置位透明的颜色 
    BYTE bAlpha: 如果为0,窗口完全透明,255为正常显示 
    DWORD dwFlags: 如果为1,仅仅颜色col被设置为透明,如果为2,整个窗口根据设置的bAlpha值被设置为透明 
    代码的使用
      

  2.   


      
      SetWindowRgn
      

  3.   

    void SetupRegion()
    {
    CDC* pDC;
    CDC  memDC;
    CBitmap cBitmap;
    CBitmap* pOldMemBmp = NULL;
    COLORREF col;
    CRect cRect;
    int x, y;
    CRgn wndRgn, rgnTemp; pDC = GetDC();
    GetWindowRect(&cRect); //将模板位图选进设备场景中
    cBitmap.LoadBitmap(IDB_MASK);
    memDC.CreateCompatibleDC(pDC);
    pOldMemBmp = memDC.SelectObject(&cBitmap); //创建模板形状的不规则区域
    wndRgn.CreateRectRgn(0, 0, cRect.Width(), cRect.Height());
    for(x=0; x<=cRect.Width(); x++)
    {
    for(y=0; y<=cRect.Height(); y++)
    {
    //将位图中黑色小圆洞对应的区域抠掉
    col = memDC.GetPixel(x, y);
    if(col == 0)
    {
    rgnTemp.CreateRectRgn(x, y, x+1, y+1);
    wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_XOR);
    rgnTemp.DeleteObject();
    }
    }
    }
    if (pOldMemBmp) memDC.SelectObject(pOldMemBmp); //将不规则区域分配给窗体,也就是创建不规则的窗体
    SetWindowRgn((HRGN)wndRgn, TRUE);
    ReleaseDC(pDC);
    }