用SetWindowRgn,关于动画,不不太懂,但这跟不规则窗体无关。

解决方案 »

  1.   

    用SetWindowRgn,关于动画,不太懂,但应该跟不规则窗体无关。
      

  2.   

    SetWindowRgn好像只能显示比较规则的吧!
    但是现在的是完全不规则的如果图中间有一个洞能能!
      

  3.   

    我给你一个不规则的窗体历程,你可以在对话框中加任何空间呀。
    当然动画是在这个不规则窗体之中的。有兴趣吗?JINXI_GAO@263。NET
      

  4.   

    //-------------------------------------------------------------------------------------
    //函数名称:SetRegion()
    //描述:用来裁减窗口
    //-------------------------------------------------------------------------------------
    void SetupRegion(CDC *pDC, CBitmap *pBit, unsigned short BackID, unsigned short MaskID)
    {
    CDC     memDC;
    CBitmap cBitmap;
    CBitmap* pOldMemBmp = NULL;
    COLORREF col;
    CRect cRect;
    int x, y;
    CRgn wndRgn, rgnTemp; //wndRgn为要创建的CRgn, rgnTemp为临时的CRgn
    //得到背景图片
    pBit->Detach();
    pBit->LoadBitmap(BackID);
    //得到Mask图片
        BITMAP bm;
    cBitmap.LoadBitmap(MaskID);
    //得到Mask图片的尺寸等信息
    cBitmap.GetBitmap(&bm);
        //将窗口设为与Mask尺寸一样
    SetWindowPos(&wndTop , 0, 0, bm.bmWidth, bm.bmHeight, SWP_NOMOVE);
    //创建一个与当前DC兼容的内存DC
    memDC.CreateCompatibleDC(pDC);
    //记录内存DC中将被覆盖的句柄,以便恢复
    pOldMemBmp = memDC.SelectObject(&cBitmap);
    //创建一个与窗口一样大小的矩形CRgn 
    wndRgn.CreateRectRgn(0, 0, bm.bmWidth, bm.bmHeight);
    //下面就是对wndRgn按Maks图片中的信息(黑色为透明区域,白色为保留区域)进行裁减
    for(x=0; x<= bm.bmWidth; x++)
    {
    for(y=0; y<= bm.bmHeight; y++)
    {
    col = memDC.GetPixel(x, y);    //得到当前坐标点的颜色
    if(col == 0)                   //如果为黑色则将其减去
    {
    rgnTemp.CreateRectRgn(x, y, x+1, y+1);         //以点来创建矩形CRgn
    wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_XOR); //将wndRgn中相同的地方移去
    rgnTemp.DeleteObject();                        //将rgbTemp中的内容清空
    }
    }
    }
    if (pOldMemBmp) memDC.SelectObject(pOldMemBmp); //恢复原来内存DC中的内容
    SetWindowRgn((HRGN)wndRgn, TRUE);               //不用多说了,裁之!!!!! 
    }
      

  5.   

    当然要了,谢谢
    [email protected]
      

  6.   

    在pc系统中出现了越来越多的应用程序采用了非矩形外观的窗体,或者模拟现实中的事物,如钟、眼睛等;或者创造一个具有三维观感的非现实物体,这类程序以各种mp3播放器为代表,甚至一些大腕级的老牌应用程序(如norton),也开始拥有这种窗口。一来是因为windows操作系统和各类开发工具自身功能的极大提升;二来,也说明开发人员希望通过与众不同的外观,来强调使用时的第一映像,以期达到吸引用户的目的,毕竟,现在的pc是一个充满图形(图象)的世界,充分利用这一特点,也能在一定程度上改善程序界面的可操作性。而且,对于同一类型的应用程序,在功能、性能相差不大的情况下,用户也往往愿意选择外观漂亮的那种。因而,很多文章都在介绍如何创建不规则的窗口,但几乎千篇一律地基于vb进行说明。而笔者本人一直基于c/c++语言进行开发,因此,研究了一下在vc++5中实现不规则窗口的方法,下面就实现的主要方法进行说明。  
      vc++5提供了crgn类和setwindowrgn()函数来实现不规则的程序窗口。创建一个不规则窗口的过程是:首先定义一个crgn类,并用各种初始化函数创建crgn类的具体区域,然后调用cwnd::setwindowrgn()函数创建不规则窗口。  
      crgn是从cgdiobject衍生出来的类,用来确定一个多边形、椭圆或者由多边形及椭圆合成的范围,在程序中主要会用到createrectrgnindirect()、createellipticrgnindirect()、createpolygonrgn()三个函数。  
      createrectrgnindirect(lpcrect   
    lprect)函数创建一个矩形区域,参数lprect指定所创建的矩形区域在窗口用户区中的left(左)、top(上)、right(右)、bottom(下)坐标。例如:  
    crgn myrgn;   
    rect m_rect;   
    m_rect.left=0; m_rect.top=0; m_rect.right=500; m_rect.bottom=300;   
    myrgn.createrectrgnindirect( &m_rect );   
      createellipticrgnindirect(lpcrect   
    lprect)函数创建一个椭圆形区域,参数lprect指定所创建的椭圆形区域在窗口用户区中的left(左)、top(上)、right(右)、bottom(下)坐标,如果指定right坐标与left坐标之差等于bottom坐标与top坐标之差,则创建的区域是一个圆。例如:  
    crgn myrgn;   
    rect m_rect;   
    m_rect.left=0; m_rect.top=0; m_rect.right=500; m_rect.bottom=300;   
    myrgn.createellitpticrgnindirect( &m_rect );   
      createpolygonrgn(lppoint lppoints, int ncount, int   
    nmode)函数创建一个多边形区域,参数lppoints指向一个point结构数组,在point结构数组中每个point结构项,用来确定多边形顶点在窗口用户区中的坐标;ncount说明point结构数组中point结构项的数目,也就是多边形的顶点数;nmode指定多边形的填充方式,一般使用alternate方式。例如创建一个三角形:  
    crgn myrgn;   
    point points[3];   
    points[0].x=points[0].y=0; points[1].x=10; points[1].y=30; points[2].x=5; points[2].y=60;   
    myrgn.createpolygonrgn(points, 3, alternate);   
      利用以上的函数创建区域后,就可以调用cwnd::setwindowrgn(hrgn hrgn, bool   
    bredraw)来创建非矩形的窗口了。setwindowrgn()函数参数说明:hrgn是一个crgn类的句柄;bredraw如果被设置成true,那么,在窗口次序发生变化时,系统会发送wm_windowposchanging和wm_windowposchanged消息给窗口。  
      如果要创建外形更复杂的窗口,例如mp3播放器soniq的一个播放界面,就是两个圆形部分重合形成的。对于这类窗口的创建,还要用到crgn类另外一个极其重要的函数——combinergn()。首先要说明的是:在vc++5的在线帮助中,将这个函数归入了初始化(initialization)类型中,实际上,如果定义的crgn类在没有使用其它初始化函数初始化之前,就调用这个函数的话,程序将会失败,所以,这个函数似乎应该归入operation类更恰当。  
      combinergn(crgn* prgn1, crgn* prgn2, int   
    ncombinemode)函数用来创建一个由多个多边形、椭圆合成的不规则区域。prgn1、prgn2分别指向参与合成不规则区域的多边形或椭圆形;ncombinemode说明合成的方式:rgn_and最后的区域是prgn1和prgn2的重叠部分;rgn_diff最后的区域是prgn1中不包含prgn2的部分;rgn_or最后的区域同时包含prgn1和prgn2;rgn_xor最后的区域同时包含prgn1和prgn2,但不包含prng1和prng2重叠的部分。例如,创建一个类似soniq播放器的界面:  
    ......   
    rect m_cyc1;   
    rect m_cyc2;   
    crgn rgncyc1;   
    crgn rgncyc2;   
    crgn rgndlg;   
    m_cyc1.left=100; m_cyc1.top=5; m_cyc1.right=200; m_cyc1.bottom=105;   
    m_cyc2.left=80; m_cyc2.top=85; m_cyc2.right=180; m_cyc2.bottom=185;   
    rgndlg.createellipticrgnindirect( &m_cyc1 );   
    rgncyc1.createellipticrgnindirect( &m_cyc1 );   
    rgncyc2.createellipticrgnindirect( &m_cyc2 );   
    rgndlg.combinergn( &rgncyc1, &rgncyc2, rgn_or );   
    mywin.setwindowrgn( (hrgn)rgndlg, ture );   
    ......   
      以上就是利用vc++5实现不规则窗口的方法,相信大家看后都能创造出各种希奇古怪的窗口来,但是,有一点应该提请注意:对于windows操作系统而言,桌面上窗口的形状存储在内存中,所以,窗口外形的复杂程度应该适可而止,不要超过32767╳32767个逻辑单元,或者64k存储区  
    。当然,还有一点很重要:就是给窗口一张漂亮的脸,最好具有三维立体效果。 原文来自本站。
      

  7.   

    动画窗口??????????????/
    AnimateWindow( hwnd,200,AW_BLEND);
    搞定!!!!!!!!!!!!!
      

  8.   

    请访问http://wannaplay.51.net,
    下载optirgn.zip, 有全部源代码。
    一个用bitmap生成HRGN的实用类。
    支持多种来源:文件(BMP,RGNDATA),BITMAP资源, RCDATA资源,
    可以设定透明色的颜色范围,无64k内存限制,
    可以把RGNDATA存储在文件中并读取。
    生成动画嘛:只要用一个Timer把多幅图片依次CreateRegion(), SetWindowRgn()就可以了。:)另to 111222:
    AnimateWindow只支持几种特定的动画方式吧,我记得。