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

简介: 先看图:  窗体扩充过程中: 窗体完全显示: 要想实现动画窗体显示,需要把MoveWindow函数和定时器结合使用,MoveWindow函数可以改变指定窗口的位置和大小,结合定时器以后可以在一定时间内动态改变窗口的位置和尺寸。
先看图:
  窗体扩充过程中:
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);
这样便实现了上面的效果。
目录
相关文章
|
5月前
|
人工智能 自然语言处理 搜索推荐
生成式引擎优化将成为律师事务所营销大趋势
随着生成式引擎优化的出现,数字营销正在经历一场翻天覆地的变化,律师事务所必须适应新的流量获取方式,其中人工智能生成的内容将发挥核心作用。
306 2
|
5月前
|
人工智能 Java Nacos
基于 Nacos + Higress 的 MCP 开发新范式,手把手教程来了!
本文介绍了如何使用 Nacos 3.0.1 与 Higress 配合,实现 HTTP 服务转化为 MCP 协议服务,并支持自动注册与代理。通过 Docker 部署环境,结合 Spring AI Alibaba 框架,可实现服务的自动暴露和动态配置管理,适用于零改造存量应用适配 MCP 协议的场景。
2270 24
|
存储 缓存 固态存储
Elasticsearch高性能搜索
【11月更文挑战第1天】
190 6
|
JavaScript API 容器
react-31-路由配置-重定向-404-嵌套路由
路由 是中大型项目不可或缺的 先做一些准备工作2个界面组件 ,便于路由跳转 熟悉一下路由基础
355 0
react-31-路由配置-重定向-404-嵌套路由
|
移动开发 前端开发 JavaScript
uni-app使用WebSocket
uni-app使用WebSocket
1168 1
|
JavaScript
js 找出两个数组中不同元素和相同元素的几种方法
js 找出两个数组中不同元素和相同元素的几种方法
|
存储 缓存 前端开发
漫谈分层架构:为什么要进行架构分层?
为什么要分层 高内聚:分层的设计可以简化系统设计,让不同的层专注做某一模块的事 低耦合:层与层之间通过接口或API来交互,依赖方不用知道被依赖方的细节 复用:分层之后可以做到很高的复用 扩展性:分层架构可以让我们更容易做横向扩展 如果系统没有分层,当业务规模增加或流量增大时我们只能针对整体系统来做扩展。分层之后可以很方便的把一些模块抽离出来,独立成一个系统。
|
分布式计算 架构师 NoSQL
|
开发工具
MFC窗口特效之动画效果(一) .
最近在学习MFC的过程中,看到一个窗口动画特效例子,不过它是在一个对话框里面嵌入效果,我想如果能把它的代码提取出来再写成一个窗口动画类就好了。于是便着手写了这个类,你可以去CSND下载这个代码运行看看。
1401 0
MFC窗口特效之动画效果(一) .