zoukankan      html  css  js  c++  java
  • MFC中对话框窗体以动画形式显示

    先看图:
     窗体扩充过程中:
    MFC中对话框窗体以动画形式显示

    窗体完全显示:
    MFC中对话框窗体以动画形式显示

    要想实现动画窗体显示,需要把MoveWindow函数和定时器结合使用,MoveWindow函数可以改变指定窗口的位置和大小,结合定时器以后可以在一定时间内动态改变窗口的位置和尺寸。MoveWindow函数的原型如下:
     函数原型:BOOL MoveWindow( HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint );
      参数
      hWnd指定了窗口的句柄
      x指定了CWnd的左边的新位置。
      y指定了CWnd的顶部的新位置。
      nWidth指定了CWnd的新宽度。
      nHeight指定了CWnd的新高度。
      bRepaint指定了是否要重画CWnd。如果为TRUE,则CWnd象通常那样在OnPaint消息处理函数中接收到一条WM_PAINT消息。如果这个参数为FALSE,则不会发生任何类型的重画操作。这应用于客户区、非客户区(包括标题条和滚动条)和由于CWnd移动而露出的父窗口的任何部分。当这个参数为FALSE的时候,应用程序必须明确地使CWnd和父窗口中必须重画的部分无效或重画。
      MoveWindow给窗口发送WM_WINDOWPOSCHANGING,WM_WINDOWPOSCHANGED,WM_MOVE,WM_SIZE和WM_NCCALCSIZE消息

    MoveWindow()的两个重载函数

      void CWnd::MoveWindow( int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE );
      void CWnd::MoveWindow( LPCRECT lpRect, BOOL bRepaint = TRUE );
      参数
      x指定了CWnd的左边的新位置。
      y指定了CWnd的顶部的新位置。
      nWidth指定了CWnd的新宽度。
      nHeight指定了CWnd的新高度。
      bRepaint指定了是否要重画CWnd。如果为TRUE,则CWnd象通常那样在OnPaint消息处理函数中接收到一条WM_PAINT消息。如果这个参数为FALSE,则不会发生任何类型的重画操作。这应用于客户区、非客户区(包括标题条和滚动条)和由于CWnd移动而露出的父窗口的任何部分。当这个参数为FALSE的时候,应用程序必须明确地使CWnd和父窗口中必须重画的部分无效或重画。
      lpRectCRect对象或RECT结构,指定了新的大小和位置。说明这个函数改变窗口的位置和大小。对于顶层的CWnd对象,x和y参数是相对于屏幕的左上角的。对于子对象,它们是相对于父窗口客户区的左上角的。
      MoveWindow函数发送一条WM_GETMINMAXINFO消息。处理这个消息时,CWnd得到一个改变最大和最小的窗口缺省值的机会。如果传递给MoveWindow成员函数的参数超过了这些值,则在WM_GETMINMAXINFO处理函数中可以用最小或最大值来代替这些值。
    先看这个的实现过程:
    void CDHxsctDlg::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
      GetWindowRect(rect);
      GetDesktopWindow()->GetWindowRect(rc);
    MoveWindow((-m_dx+rc.Width()-rect.Width())/2,
    (-m_dy+rc.Height()-rect.Height())/2,
    +m_dx+rect.Width(),+m_dy+rect.Height());
    if(rect.Height()>=m_height)
    {
    m_dy=0;
    }
    if((rect.Width()>=m_width)&&(rect.Height()>=m_height))
    {
    KillTimer(1);
    }
    CDialog::OnTimer(nIDEvent);
    }
    在对话框初始化函数中:
    GetWindowRect(rect);
    GetDesktopWindow()->GetWindowRect(rc);
    MoveWindow((rc.Width()-rect.Width())/2,(rc.Height()-rect.Height())/2,0,0);
    m_width=rect.Width();
    m_height=rect.Height();
    m_dx=2;
    m_dy=2;
    SetTimer(1,10,NULL);
    这样便实现了上面的效果。
  • 相关阅读:
    PostgreSQL中的partition-wise join
    Partition-wise join
    外观模式 门面模式 Facade 结构型 设计模式(十三)
    桥接模式 桥梁模式 bridge 结构型 设计模式(十二)
    组合模式 合成模式 COMPOSITE 结构型 设计模式(十一)
    创建型设计模式对比总结 设计模式(八)
    原型模式 prototype 创建型 设计模式(七)
    单例模式 创建型 设计模式(六)
    建造者模式 生成器模式 创建型 设计模式(五)
    抽象工厂模式 创建型 设计模式(四)
  • 原文地址:https://www.cnblogs.com/lidabo/p/2620191.html
Copyright © 2011-2022 走看看