CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  界面

在线等: 关于"让窗体最前"问题的新问题

楼主luoxg(累累累)2004-12-03 11:44:30 在 VC/MFC / 界面 提问

可以用SetWindowPos(&m_pMainWnd->wndTopMost,   0,   0,   0,   0,   SWP_NOSIZE)让窗体最前,  
  但个人感觉这个函数太霸道,   窗体一旦最前,系统如果有MessageBox也给挡住.  
  所以想用 ShowWindow(SW_SHOWNORMAL);  
  SetForegroundWindow();  
  但问题是,这两个函数只能好用一次,后续只能使Frame闪烁,并不能显示窗体内容;拿鼠标点一下才可以.有什么方法可以做到将窗体调整到最前,并且正常显示呢?  
   
  测试的工程如下:  
  1.新建一个SDI工程,在MainFrame的OnCreate中加SetTimer(1,3000,NULL);  
  2.加OnTimer,加入 ShowWindow(SW_SHOWNORMAL);SetForegroundWindow();  
  测试结果发现:   运行程序,只第一个3秒可以将窗体调到了前台,后面的3秒均是闪烁. 问题点数:100、回复次数:13Top

1 楼vcleaner(我没当大哥很久了.......)回复于 2004-12-03 12:19:30 得分 1

在OnPaint中试试Top

2 楼luoxg(累累累)回复于 2004-12-03 12:25:19 得分 0

一样,还是闪烁,不能调整到前面正常显示.Top

3 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2004-12-03 12:28:45 得分 30

请楼主阅读一下<Windows核心编程>p649  
  “为了制止这种现象,微软对SetForegroundWindow函数增加了更多的智能。特别规定,仅当调用一个子函数的线程已经连接到RIT或者当前与RIT相连接的线程在一定的时间内(这个时间量由SystemParamtersInfo函数和SPI_SETFOREGROUND_LOCKTIMEOUT值来控制)没有仍然输入,这个函数才有效。另外,如果有一个菜单是活动的,这个函数就失效。”Top

4 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2004-12-03 12:32:51 得分 10

SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT,0,0,0);  
  AllowSetForegroundWindow(ASFW_ANY);  
  SetForegroundWIndow(m_hWnd);Top

5 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2004-12-03 12:33:57 得分 10

SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT,0,0,0);  
  之前最好将将原来的值保存,窗口到前台后再还原,以免影响系统中其它程序的行为。Top

6 楼roger_ding(海天一色)回复于 2004-12-03 12:35:03 得分 25

1.   SetWindowPos(&m_pMainWnd->wndTopMost,   0,   0,   0,   0,   SWP_NOSIZE)  
  2.   SetWindowPos(&m_pMainWnd->wndNoTopMost,   0,   0,   0,   0,   SWP_NOSIZE)Top

7 楼hjunxu(hjun)回复于 2004-12-03 12:36:53 得分 1

我也有类似的问题,不过只在背后一个窗口是fullscreen的时候才有。  
  顶一下。  
  楼主的问题不知道用折中的设置可不可以?  
  用BringWindowToTop   ,或在setwindowpos的时候用HWND_TOP.Top

8 楼hjunxu(hjun)回复于 2004-12-03 12:37:49 得分 1

那样就没有那么霸道了,是个折中的办法。Top

9 楼Trashy(【叶落随风】)回复于 2004-12-03 12:42:50 得分 1

你的要求也有些高了吧Top

10 楼aoosang(智慧的鱼)回复于 2004-12-03 12:49:13 得分 1

接分Top

11 楼luoxg(累累累)回复于 2004-12-03 12:52:21 得分 0

去试试,一会回来...Top

12 楼blackboxboyb(jin)回复于 2004-12-03 14:52:49 得分 20

SetWindowPos(&m_pMainWnd->wndTopMost,   0,   0,   0,   0,   SWP_NOSIZE)  
  以后   再调用  
  SetWindowPos(&m_pMainWnd->wndNoTopMost,   0,   0,   0,   0,   SWP_NOSIZE)  
  这样就可以了!Top

13 楼luoxg(累累累)回复于 2004-12-04 16:53:44 得分 0

多谢各位!Top

相关问题

  • 如何让MDI窗体中的子窗体总在其他窗体的最前面
  • 请问MDI窗体中怎么判断那个子窗体打开了,那个窗体在最前面.
  • 我设了一个窗体,想把他始终在最前显示(有主窗体子窗体的时候)?
  • 窗体总在最前的实现
  • 如何让窗体总在最前?
  • 怎样将窗体带到最前面?
  • 如何使窗体总在最前
  • 我建立一个多窗体程序,最前一个是父窗体,其余的是子窗体,但是子窗体Close不了,
  • 如何使窗体始终置于最前面,但他不是主窗体.
  • 在MDI窗体中,如何使某子窗体总在最前面?

关键词

  • 函数
  • 窗体
  • setwindowpos
  • nosize
  • pmainwnd
  • swp
  • setforegroundwindow
  • wndtopmost
  • 问题
  • spi

得分解答快速导航

  • 帖主:luoxg
  • vcleaner
  • DentistryDoctor
  • DentistryDoctor
  • DentistryDoctor
  • roger_ding
  • hjunxu
  • hjunxu
  • Trashy
  • aoosang
  • blackboxboyb

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo