VC 窗口特效(栅条)

    技术2022-05-20  39

        想做一个栅条特效的窗口,在网上找到一篇VC窗口特效的文章,原文:http://blog.csdn.net/qiaozhangchi/archive/2008/12/11/3497367.aspx,发现并没有栅条特效,在网上找了很久也没找到,无奈只好自己想办法了。灵光一现下,想到以前做的异形窗口,便想用SetWindowRgn函数加定时器来实现。主要用到三个函数:

        BOOL CreateRectRgn(int x1, int y1, int x2, int y2);    int CombineRgn(CRgn* pRgn1, CRgn* pRgn2, int nCombineMode);    int SetWindowRgn(HWND hWnd, HRGN hRgn, BOOL bRedraw);

    以上函数详细使用请参见MSDN,程序实现如下:

    在OnInitDialog()函数中:

    //初始让窗口不显示 CRgn rgn1,rgn2; CRect rcWnd; GetWindowRect(&rcWnd); //得到窗口区域,用来创建RGN rgn1.CreateRectRgn(0,0,rcWnd.Width(),rcWnd.Height()); //创建RGN rgn2.CreateRectRgn(0,0,rcWnd.Width(),rcWnd.Height()); //创建RGN //合并RGN,合并结果为rgn1和rgn2的不同区域, //因为rgn1和rgn2的区域是一样的,所以合并结果就不存在窗口区域了 rgn1.CombineRgn(&rgn1,&rgn2,RGN_DIFF); SetWindowRgn((HRGN)rgn1,TRUE); SetTimer(1001,100,NULL); //启动定时器

    在定时器函数OnTimer()中:

    void CMyDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default CRect rcWnd; CRgn rgnWnd,rgn1,rgn2,rgn3,rgn4; //将窗口分成四个栅条显示 GetWindowRect(rcWnd); m_nHeight += 5; //初始为0,每次加5 rgnWnd.CreateRectRgn(0,0,rcWnd.Width(),rcWnd.Height()); //如果已经显示完整,则关闭定时器,并显示完整窗口 if (m_nHeight >= rcWnd.Height()/4) { KillTimer(1001); SetWindowRgn((HRGN)rgnWnd,TRUE); } rgn1.CreateRectRgn(0,m_nHeight,rcWnd.Width(),rcWnd.Height()*1/4); rgn2.CreateRectRgn(0,rcWnd.Height()*1/4 + m_nHeight,rcWnd.Width(),rcWnd.Height()*2/4); rgn3.CreateRectRgn(0,rcWnd.Height()*2/4 + m_nHeight,rcWnd.Width(),rcWnd.Height()*3/4); rgn4.CreateRectRgn(0,rcWnd.Height()*3/4 + m_nHeight,rcWnd.Width(),rcWnd.Height()); //合并RGN rgnWnd.CombineRgn(&rgnWnd,&rgn1,RGN_DIFF); rgnWnd.CombineRgn(&rgnWnd,&rgn2,RGN_DIFF); rgnWnd.CombineRgn(&rgnWnd,&rgn3,RGN_DIFF); rgnWnd.CombineRgn(&rgnWnd,&rgn4,RGN_DIFF); SetWindowRgn((HRGN)rgnWnd,TRUE); CDialog::OnTimer(nIDEvent); }

     

    通过以上方法,稍做修改,还可实现窗口的其它特效,如使用CreateEllipticRgn函数创建圆形RGN等等。如果哪位高人知道有更好的实现方法,请赐教^_^

    以上方法,如有雷同,纯属巧合……


    最新回复(0)