动态对话框

来源:互联网 发布:取消淘宝手机验证码 编辑:程序博客网 时间:2024/04/29 14:03

6.4  动画窗体界面

0357  动画显示窗体

要实现动画显示窗体效果需要使用AnimateWindow函数,并设置0x00000010风格,由于该函数并没有被封装,所以需要进行手动导入User32动态库。并定义0x00000010风格为AW_CENTER。

#define AW_CENTER                   0x00000010 //动画

#define AW_HIDE                     0x00010000 //隐藏

BOOL CDonghuaDlg::OnInitDialog()

{

    ……

    CenterWindow();

    DWORD dwStyle = AW_CENTER;

    HINSTANCE hInst = LoadLibrary("User32.DLL");

    typedef BOOL(WINAPI MYFUNC(HWND,DWORD,DWORD));

    MYFUNC* AnimateWindow;

    AnimateWindow=(MYFUNC *)::GetProcAddress(hInst,"AnimateWindow");

    AnimateWindow(this->m_hWnd,1000,dwStyle);

    FreeLibrary(hInst);

    return TRUE; 

}

void CDonghuaDlg::OnClose()

{

    DWORD dwStyle = AW_CENTER;

    HINSTANCE hInst = LoadLibrary("User32.DLL");

    typedef BOOL(WINAPI MYFUNC(HWND,DWORD,DWORD));

    MYFUNC* AnimateWindow;

    AnimateWindow=(MYFUNC *)::GetProcAddress(hInst,"AnimateWindow");

    AnimateWindow(this->GetSafeHwnd(),700,AW_HIDE|dwStyle);

    FreeLibrary(hInst);

    CDialog::OnClose();

}

0358  淡入淡出的窗体

要实现淡入淡出的窗体效果需要使用AnimateWindow函数,并设置0x00080000风格,由于该函数并没有被封装,所以需要进行手动导入User32动态库。并定义0x00080000风格为AW_BLEND。

程序代码如下:

#define AW_BLEND                    0x00080000 //淡入淡出

#define AW_HIDE                     0x00010000 //隐藏

BOOL CFadeDlg::OnInitDialog()

{

    ……

    CenterWindow();

    DWORD dwStyle = AW_BLEND;

    HINSTANCE hInst = LoadLibrary("User32.DLL");

    typedef BOOL(WINAPI MYFUNC(HWND,DWORD,DWORD));

    MYFUNC* AnimateWindow;

    AnimateWindow = (MYFUNC *)::GetProcAddress(hInst,"AnimateWindow");

    AnimateWindow(this->m_hWnd,1000,dwStyle);

    FreeLibrary(hInst);   

    return TRUE;

}

void CFadeDlg::OnClose()

{

    DWORD dwStyle = AW_BLEND;

    HINSTANCE hInst=LoadLibrary("User32.DLL");

    typedef BOOL(WINAPI MYFUNC(HWND,DWORD,DWORD));

    MYFUNC* AnimateWindow;

    AnimateWindow=(MYFUNC *)::GetProcAddress(hInst,"AnimateWindow");

    AnimateWindow(this->GetSafeHwnd(),1000,AW_HIDE | dwStyle);

    FreeLibrary(hInst);

    CDialog::OnClose();

}

0359  如QQ般隐藏的窗体

如果把一些较小的窗体做成像QQ般隐藏的窗体将会更加吸引用户。要实现如QQ般隐藏的窗体需要在定时器中判断鼠标和窗体的位置,然后使用MoveWindow方法移动窗体,从而实现是隐藏还是显示。

程序代码如下:

void CQQHideDlg::OnTimer(UINT nIDEvent)

{

    CRect rc;

    CRect rect;

    GetWindowRect(&rect);

    rc.CopyRect(&rect);

    CPoint pOint;

    GetCursorPos(&pOint);

    if(rect.top < 0 && PtInRect(rect,pOint))

    {

        rect.top = 0;

        MoveWindow(rect.left,rect.top,rc.Width(),rc.Height());

    }

    else if(rect.top > -3 && rect.top < 3 && !PtInRect(rect,pOint))

    {

        rect.top = 3-rect.Height();

        MoveWindow(rect.left,rect.top,rc.Width(),rc.Height());

    }

    CDialog::OnTimer(nIDEvent);

}

0360  可横向伸展的对话框

在一些应用程序中,经常会见到一些可伸展的对话框,要实现可横向伸展的对话框需要在对话框中放置一个控件,然后跟根据控件的位置来显示或隐藏部分对话框。

程序代码如下:

BOOL CExtendDlg::OnInitDialog()

{

    ……  //此处代码省略

    m_bExpand=FALSE;

    CRect rcDlg, rcMarker;

    GetWindowRect(rcDlg);

    m_nExpandedWidth = rcDlg.Width();

    GetDlgItem(IDC_STATIC1)->GetWindowRect(rcMarker);

    m_nNormalWidth = (rcMarker.left - rcDlg.left);

    Display();

    return TRUE;

}

void CExtendDlg::Display()

{

    CRect rcDlg;

    GetWindowRect(rcDlg);

    if (m_bExpand)

    {

        rcDlg.SetRect( rcDlg.left, rcDlg.top,

            rcDlg.left + m_nExpandedWidth,

            rcDlg.top + rcDlg.Height());

    }

    else

    {

        rcDlg.SetRect(rcDlg.left, rcDlg.top,

            rcDlg.left + m_nNormalWidth,

            rcDlg.top + rcDlg.Height());

    }

    MoveWindow(rcDlg);

}

void CExtendDlg::OnButton1()

{

    m_bExpand = !m_bExpand;

    Display();

}

0361  可纵向伸展的对话框

要实现可纵向伸展的对话框效果,主要是通过MoveWindow函数来调整对话框的大小,从而实现对话框的伸展效果。

程序代码如下:

BOOL CExtendDlg::OnInitDialog()

{

    ……  //此处代码省略

    m_bExpand=FALSE;

    CRect rcDlg, rcMarker;

    GetWindowRect(rcDlg);

    m_nExpandedHeight = rcDlg.Height();

    GetDlgItem(IDC_STATIC1)->GetWindowRect(rcMarker);

    m_nNormalHeight = (rcMarker.top - rcDlg.top);

    Display();

    return TRUE;

}

void CExtendDlg::Display()

{

    CRect rcDlg;

    GetWindowRect(rcDlg);

    if (m_bExpand)

    {

        rcDlg.SetRect( rcDlg.left, rcDlg.top,

            rcDlg.left + rcDlg.Width(),

            rcDlg.top + m_nExpandedHeight);

    }

    else

    {

        rcDlg.SetRect(rcDlg.left, rcDlg.top,

            rcDlg.left + rcDlg.Width(),

            rcDlg.top + m_nNormalHeight);

    }

    MoveWindow(rcDlg);

}

void CExtendDlg::OnButton1()

{

    m_bExpand = !m_bExpand;

    Display();

}

0362  调用Office助手

Office助手是一个非常漂亮的工具,要实现Office助手效果,需要使用Microsoft提供的第三方控件Microsoft Agent Control 2.0,导入时根据需要选择相应的类。

程序代码如下:

BOOL COfficeDlg::OnInitDialog()

{

    …… //此处代码省略

    CString str = "merlin.acs";

    COleVariant value1(str);

    m_Agent.GetCharacters().Load("merlin",value1);

    return TRUE;

}

void COfficeDlg::OnButton1()

{

    m_Character = m_Agent.GetCharacters().Character("merlin");

    long prm = 0;

    COleVariant value(prm);

    m_Character.Show(value);

}

void COfficeDlg::OnButton2()

{

    CString str = "Announce";

    m_Character = m_Agent.GetCharacters().Character("merlin");

    m_Character.Play(str);

}

void COfficeDlg::OnButton3()

{

    CString str = "Congratulate";

    m_Character = m_Agent.GetCharacters().Character("merlin");

    m_Character.Play(str);

}

void COfficeDlg::OnButton4()

{

    CString str = "Congratulate_2";

    m_Character = m_Agent.GetCharacters().Character("merlin");

    m_Character.Play(str);

}

void COfficeDlg::OnButton5()

{

    CString str = "Domagic1";

    m_Character = m_Agent.GetCharacters().Character("merlin");

    m_Character.Play(str);

}

void COfficeDlg::OnButton6()

{

    m_Character = m_Agent.GetCharacters().Character("merlin");

    long prm = 0;

    COleVariant value(prm);

    m_Character.Hide(value);

}

0363  屏幕滚动字幕

屏幕滚动字幕是在主窗体中绘制要输出的字幕,绘制字幕时需要重载OnPaint方法,通过在定时器中使用MoveWindow方法使窗体从屏幕的右侧向左侧移动。

程序代码如下:

BOOL CCaptionDlg::OnInitDialog()

{

    ……  //此处代码省略

    SetTimer(1,10,NULL);

    CRect rect;

    GetClientRect(&rect);

    x = GetSystemMetrics(SM_CXSCREEN);

    y = GetSystemMetrics(SM_CYSCREEN);

    MoveWindow(x,y-70,rect.Width(),rect.Height());

    num = 1;

    return TRUE; 

}

void CCaptionDlg::OnPaint()

{

    CPaintDC dc(this);

    CString str="二十四桥仍在,波心荡、冷月无声。念桥边红药,年年知为谁生。";

    dc.TextOut(0,0,str);

}

void CCaptionDlg::OnTimer(UINT nIDEvent)

{

    CRect rect,rc;

    GetClientRect(&rect);

    MoveWindow(x-num,y-50,rect.Width(),rect.Height());

    if(num >= x+rect.Width())

        num = 1;

    else

        num++;   

    CDialog::OnTimer(nIDEvent);

}

0364  在窗体中显示彩虹文字

在窗体中显示彩虹文字,需要调用CDC类的BeginPath、EndPath和AbortPath等方法,并使用随机函数rand来设置颜色。如图6.12所示。

图6.12  在窗体中显示彩虹文字

程序代码如下:

void CRainbowDlg::OnTimer(UINT nIDEvent)

{

    CDC* pDC = GetDC();

    Font.CreatePointFont(400,"宋体",pDC);

    pDC->SelectObject(&Font);

    pDC->BeginPath();

    pDC->SetBkMode(TRANSPARENT);

    pDC->TextOut(70,45,"彩虹文字");

    pDC->EndPath();

    pDC->SelectClipPath(RGN_COPY);

    pDC->AbortPath();

    Font.DeleteObject();

    CRect rect;

    GetClientRect(&rect);

    int R,G,B;

    for(int i=0;i<rect.Height();i=i+5)

    {

        R = rand()/2;

        G = rand()/2;

        B = rand()/2;

        CPen pen1;

        pen1.CreatePen(PS_SOLID,5,RGB(255*R,255*G,255*B));

        pDC->SelectObject(&pen1);

        pDC->LineTo(0,i);

        pDC->MoveTo(rect.Width(),i);

        pen1.DeleteObject();

    }

    CDialog::OnTimer(nIDEvent);

}

0365  在窗体中实现文字横拉效果

在窗体中实现文字横拉效果,就是利用API函数中的SetTextCharacterExtra函数,该函数的作用主要是改变各字符串之间的间隔大小,该函数语法如下:

int SetTextCharacterExtra( int nCharExtra );

参数说明如下。

l     nCharExtra:要在字符间插入的额外空间的数量,采用设备场景的逻辑坐标系统。

如图6.13所示。

图6.13  在窗体中实现文字横拉效果

程序代码如下:

void CDraughtDlg::OnTimer(UINT nIDEvent)

{

    CDC* pDC = GetDC();

    CFont Font;

    Font.CreatePointFont(200,"宋体");

    pDC->SelectObject(&Font);

    if(num<25)

    {

        pDC->SetTextCharacterExtra(num);

        pDC->TextOut(40,50,"明日科技有限公司");

        num++;

    }

    else

    {

        CBrush m_brush (RGB(255,255,255));

        CRect m_rect;

        GetClientRect(m_rect);

        pDC->FillRect(m_rect,&m_brush);

        num = 1;

    }

    Font.DeleteObject();

    CDialog::OnTimer(nIDEvent);

}

0366  在窗体中实现万花筒效果

通过rand函数随机取出小圆半径的大小,使用cos和sin求出小圆上的点,然后使用CDC类的LineTo方法将各个点进行连接,从而绘制出不同的图案,实现万花筒效果。如图6.14所示。

程序代码如下:

BOOL CKaleidoscopeDlg::OnInitDialog()

{

    …… //此处代码省略

    CRect rect;

    GetClientRect(&rect);

    r1 = 150;

    r2 = 50;

    s  = 34;

    xo = rect.Width() / 2;

    yo = rect.Height() / 2;

    SetTimer(1,300,NULL);

    return TRUE;

}

void CKaleidoscopeDlg::OnTimer(UINT nIDEvent)

{

    this->RedrawWindow();

    r2 = rand()%(r1-10);

    if(r2-2 <= 1)

        s = 30;

    else

        s = rand()%(r2-2);

    CDC* pDC = GetDC();

    CPen pen;

    int R,G,B;

    R = rand()/2;

    G = rand()/2;

    B = rand()/2;

    pen.CreatePen(PS_SOLID,1,RGB(255*R,255*G,255*B));

    pDC->SelectObject(&pen);

    pDC->MoveTo(xo-(r1-r2+s),yo);

    for(int i=1;i<20000;i++)

    {

        a1 = (PI/360)*i;

        a2 = (r1*1.0/r2)*a1;

        xt = int(-(r1-r2)*cos(a1)-s*cos(a2-a1)+xo);

        yt = int((r1-r2)*sin(a1)-s*sin(a2-a1)+yo);

        pDC->LineTo(xt,yt);

    }

    pen.DeleteObject();

    CDialog::OnTimer(nIDEvent);

}

图6.14  在窗体中实现万花筒效果

0367  在窗体中实现动画效果

要实现背景图案的动画效果,就要让背景上的图案不停的变换,所以在实例中使用定时器不停地改变窗体背景,先在窗体取40个点,然后通过定时器控制每次显示不相邻的20个点,并将这20个点用线连接起来。如图6.15所示。

图6.15  在窗体中实现动画效果

程序代码如下:

BOOL CPictureCartoonDlg::OnInitDialog()

{

    ……  //此处代码省略

    lpi=0;

    arrays[0] = CPoint(148,0);

    n=40;

    for(int i=1;i<n;i++)

    {

        lpi+=(2*PI/n);

        if(lpi<=2*PI/4)

        {

            arrays[i] = CPoint(148+148*sin(2*i*PI/n),148-148*cos(2*i*PI/n));

        }

        if(lpi>2*PI/4 && lpi<=2*PI/2)

        {

            arrays[i] = CPoint(148+148*sin(PI-2*i*PI/n),148+148*cos(PI-2*i*PI/n));

        }

        if(lpi>2*PI/2 && lpi<=2*PI*3/4)

        {

            arrays[i] = CPoint(148-148*sin(2*i*PI/n-2*PI/2),148+148*cos(2*i*PI/n-2*PI/2));

        }

        if(lpi>2*PI*3/4 && lpi<=2*PI)

        {

            arrays[i] = CPoint(148-148*sin(2*PI-2*i*PI/n),148-148*cos(2*PI-2*i*PI/n));

        }

    }

    result = TRUE;

    SetTimer(1,300,NULL);

    return TRUE;

}

void CPictureCartoonDlg::OnTimer(UINT nIDEvent)

{

    CRect rc;

    m_picture.GetClientRect(&rc);

    CDC* pDC = m_picture.GetDC();

    pDC->FillRect(&rc,NULL);

    CPen pen;

    pen.CreatePen(PS_SOLID,1,RGB(0,0,255));

    pDC->SelectObject(&pen);

    if(result)

    {

        for(int j=0;j<n;j=j+2)

        {   

            for(int k=0;k<=j;k=k+2)

            {

                pDC->MoveTo(arrays[j]);

                pDC->LineTo(arrays[k]);

            }

        }

    }

    else

    {

        for(int j=1;j<=n;j=j+2)

        {   

            for(int k=1;k<=j;k=k+2)

            {

                pDC->MoveTo(arrays[j]);

                pDC->LineTo(arrays[k]);

            }

        }

    }

    result = !result;

    CDialog::OnTimer(nIDEvent);

}

 

http://book.csdn.net/bookfiles/565/10056518719.shtml