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);
    这样便实现了上面的效果。
  • 相关阅读:
    519,伪类和伪元素的区别
    518,自定义字体的使用场景
    517,sytlus/sass/less的区别
    516,base64的原理及优缺点
    515,前端性能优化--减少http请求(待补充)
    514 ,css不同选择器的权重(css层叠的规则)
    513,如果需要手写动画,你认为最小时间间隔是多久,为什么?
    512,a标签的target属性
    511,display:inline-block什么时候不会显示间隙?
    510,position的值,relative和absolute定位原点是
  • 原文地址:https://www.cnblogs.com/lidabo/p/2620191.html
Copyright © 2011-2022 走看看