窗口为什么被任务栏覆盖了(非mfc)?

code8238 2008-05-27 06:33:12
窗口的大小正好是屏幕的大小,窗口里有一个对话框子窗口,对话框上的控件全部是自绘控件,捕捉WM_DRAWITEM消息刷新控件。
问题是,最初显示的时候,没问题,窗口可以覆盖任务栏,反复更换焦点之后,只要这个窗口获得焦点,他仍然可以前端显示。
但是,当这个窗口被移动了一下之后(哪怕是稍微移动一下),任务栏就会把他覆盖,这是什么原因?

问题有难度,我给200分!
...全文
1621 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
xl_fly 2011-12-19
  • 打赏
  • 举报
回复
我想搂主想要的是这个:
ShowWindow(SW_MAXIMIZE);//使窗口全屏显示在前面(可跟别的窗口切换)
不过用SetWindowPos()设置窗口时最好用全屏的宽高设置,要不可不怎么好看

借贴的这位大侠是不是:
SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);中第一个参数是&wndTopMost
这样你的窗口级别跟任务栏一个级别(最高)了,就总是显示在最前面,别的窗口会被被覆盖。

--希望能对现在遇到同样问题的伙伴们有所帮助
zhgflx 2011-09-27
  • 打赏
  • 举报
回复
借此贴问下我这边有个界面在最大化之后看不到下面的状态栏,请问下如何调整
code8238 2008-06-01
  • 打赏
  • 举报
回复
Re:星岛孤裔林郎君(屹峰)
我不能要求客户用我的软件还必须改变电脑设置啊!

Re:alunlee
没有为什么,客户要求,咱就得照办!
alunlee 2008-06-01
  • 打赏
  • 举报
回复
你的要求怎么有点奇怪,又要全屏的窗口,又还可以拖动?这是为什么呢?
alan001 2008-06-01
  • 打赏
  • 举报
回复
把任务栏搞成侧边消隐或者设置成"不"保持在前端

设置一下任务栏属性
code8238 2008-05-30
  • 打赏
  • 举报
回复
还是没有让我满意的答案!各位高手帮帮忙吧!
code8238 2008-05-29
  • 打赏
  • 举报
回复
Re:磨刀霍霍向猪羊
我并没有激活任务栏,只是移动了一下窗口。为什么任务栏就变成topmost了呢?
weiym 2008-05-29
  • 打赏
  • 举报
回复
任务栏的TopMost属性是去不掉的,一激活任务栏,它会立刻变成TopMost。
解决方法就只有隐藏任务栏或是把你的窗口设置成TopMost, 想让非TopMost的窗口覆盖在TopMost窗口的上面本身就是违反Window的窗口规则的。

QQ截屏实际上也是覆盖了一个TopMost的透明窗口在上面。
my_girlf 2008-05-29
  • 打赏
  • 举报
回复
同意11L
是不是窗口移动的时候更改了窗口的显示风格?可能是你或者系统默认更改了这个设置,可以SetWindowPos试试,也可以ModifyStyle(0,WS_EX_TOPMOST)试试
palmax 2008-05-29
  • 打赏
  • 举报
回复
缺省状态下,系统不允许应用程序窗口大小超过工作区大小

在你的WindowProc中处理WM_GETMINMAXINFO,
switch (uMsg)
{
.............................
case WM_GETMINMAXINFO:
{
MINMAXINFO* lpMMI= (MINMAXINFO*)lParam;
CRect rc( 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN) ); //获得屏幕大小
rc.InflateRect( 10, 50 ); // 让你区域比这个屏幕区域大一些
lpMMI->ptMaxSize = CPoint(rc.Size());
lpMMI->ptMaxTrackSize = CPoint(rc.Size());

return 0;
}
break;
............................
}
Eleven 2008-05-29
  • 打赏
  • 举报
回复
Up
code8238 2008-05-29
  • 打赏
  • 举报
回复
Re:磨刀霍霍向猪羊
不想让任务栏隐藏,因为软件打开的时候,如果移动窗口,任务栏还可以操作,这是我想要的。
您说的方法还是治标不治本啊!
我觉得如果弄清楚移动窗口后就能被覆盖的原因,才是治本的方法。
Irene12 2008-05-29
  • 打赏
  • 举报
回复
CWnd::SetWindowPos
Irene12 2008-05-29
  • 打赏
  • 举报
回复
这是由于窗口绘制顺序问题,你可以指定最上面显示的 窗口句柄
rageliu 2008-05-28
  • 打赏
  • 举报
回复
重载WM_NCHITTEST消息响应函数,直接返回0,使拖动无效

CYourDlg::OnNcHitTest(CPoint point)
{
// TODO: Add your message handler code here and/or call default

return 0;
}
code8238 2008-05-28
  • 打赏
  • 举报
回复
Re:高手.高手.高高手
由于某些要求,程序是不能设置成topmost的
问题是正好把窗口大小设置成和屏幕一样大并且没有移动过的时候,就不会被任务栏覆盖。
这说明即使不设置成topmost,也可以实现前端显示!
这是为什么呢?
zgl7903 2008-05-28
  • 打赏
  • 举报
回复
SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);//把窗口放到最前边
zhoujianhei 2008-05-28
  • 打赏
  • 举报
回复
任务管理器,不会被任务栏覆盖,因为它具有TopMost属性。
在不改变任务栏的前提下,也只有修改你的程序啦。
weiym 2008-05-28
  • 打赏
  • 举报
回复
那就再你的全屏窗口出来时隐藏掉任务栏,退出时再让他出来
		HWND hWndTray = ::FindWindow(_T("Shell_TrayWnd"), NULL);
if(hWndTray != NULL)
{
::ShowWindow(hWndTray, SW_HIDE);
}
code8238 2008-05-28
  • 打赏
  • 举报
回复
Re珠穆朗玛
没有设置成顶级窗口,这是某些功能的需要。

Re磨刀霍霍向猪羊
那么为什么正好把窗口大小设置成和屏幕一样大的时候,就不会被任务栏覆盖呢?
有什么解决办法呢?

多谢两位回贴!
加载更多回复(5)
包含文件说明: 1. SolveFlashingAndRedrawv1.0.5 纯净版 无闪烁的MFC应用框架,实际使用时把此工程改名成你要建立的项目名称,然后开始开发即可。你熟悉MFC的话研究这个框架的半个小时应该就明白并熟练运用了。 2.SolveFlashingAndRedrawv1.0.5 demo版 利用SolveFlashingAndRedrawv1.0.4框架写的一个示例小程序,主要展示框架要实现的优点特性。 3.VCRn 修改vc工程名工具 ___作者 田彬.exe 用网上找到的一个MFC改工程名称的小工具,很实用。如果你想使用本框架就可以用它来改成你想要的工程名了。 4. 未使用本框架的类似功能简化程序 没有使用框架的程序,实现的功能和Demo类似。但是运行之后改变窗口大小等,会发现图形闪烁很厉害! 5. SolveFlashingAndRedrawv1.0.5 demo版 运行截图.jpg 6. ReadMe.txt 说明文件。 补充说明: 工程使用vc6.0开发,如果你用vc6.0双击.dsw文件无法打开,请先打开vc6.0然后把.dsw拖动到vc上面。 如果这种方法还是无法打开,你新建一个vc6.0 mfc sdi程序,把示例中框架拷贝到这个新工程中,运行即可,代码量不是太多。 框架说明: /****************************************************** SolveFlashingAndRedraw框架说明 ******************************************************/ /** 项目名称: demo框架 版本号: v1.0.5 第一作者: Jef 地址: 中国/江苏 日期: 20100724 电子邮箱: dungeonsnd@126.com 版权: 1.您可以修改及免费使用本程序。 2.修改之后附上您的个人信息发送到上面的作者邮箱,作者负责在全面测试后发布您修改后的新版本。 3.您使用本程序而导致任何伤害以及经济损失,由过错方依法承担所有责任,一概与第一作者及合作单位无关。 4.如果您使用本程序则表示您已经同意此版本协议!否则请勿使用! 项目功能: SolveFlashingAndRedraw框架是MFC解决窗口保存及重绘闪烁问题的一种比较好的方案(Win32解决方法类似)。 版本历史: v1.0.1 20091126 第一版本 v1.0.2 20091212 第二版本 1. 修改了部分变量的名字使其更符合其意义 2. 增加为两个工程,一是带demo例子的,另一是不带demo的纯净版. 3. 修改了其中一个错误. 如 CreateCompatibleDC之后没有调用DeleteDC等. v1.0.3 对v1.0.2进行了整理 v1.0.4 20100416 在v1.0.3的基础上进行整理,并增加了裁剪区,提高了绘图效率! v1.0.5 20100724 1. 添加了一个工具类CMemBmpDc,帮助产生一个内存DC,并把指定的内存位图选进去。方便绘图。 2. 演示了在适当时机如何高效画图,见Demo版的DrawSinwave(bool bDrawOnScreen)函数。 演示了用两种方法来绘图, 方法1. 直接绘图到屏幕上, 同时绘图到内存位图上,内存位图不会立即贴到屏幕上减少了内存拷贝的时间,提高了效率, 将来窗口失效时OnPait贴图到屏幕上. 这种方法的优点时减小了不必要的内存拷贝,缺点时当绘图内存复杂并且常耗时可能会导致闪烁。 故适用于像本Demo的这样绘图(本例函数只绘制一小段直线)。 方法2. 绘制到内存位图上后把应该重绘的这一小块设成裁剪区,然后立即OnPait重绘这个裁剪区。 运行步骤: 直接运行demo里面的程序,在窗口上任意拖拉鼠标画线,然后点击菜单栏的几个示范菜单项,然后移动窗口、 改变窗口大小、最大最小化窗口、用其它窗口覆盖窗口、鼠标放到任务栏。。。 以上种种操作观察窗口内的图像变化。可以发现窗口内图像几乎看不到闪烁,而且窗口的元素已经保存下来重绘时任然可以看到图像。 如何使用: 进行项目开发时,可以先建立项目,然后把本解决方案框架拷贝到新建项目中即可。 也可以自己根据需要修改纯净版。 其它: 友情提示,小心 View类头文件及View类的实现文件中有说明,使用时别把它弄到你实际项目里哦! 进行大量复杂的图形的输出,而且对效率要求特别高时要考虑适当修改此框架(如增加裁剪区)后再使用哦。 关于如何在此框架的基础上提高绘图效率可以参阅下面的文章 如何提高绘图的效率 文章摘录 http://hi.baidu.com/new8sun/blog/item/68ccba8a80c3aadafc1f1079.html MFC双缓冲解决图象闪烁 2009-06-13 23:03 显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题。而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案。 MFC的绘图效率的确不高但也不差,而且它的绘图函数使用常简单,只要使用方法得当,再加上一些技巧,用MFC可以得到效率很高的绘图程序。
/****************************************************** SolveFlashingAndRedraw框架说明 ******************************************************/ /** 项目名称: SolveFlashingAndRedraw框架 包含文件: 1. ReadMe.txt 2. SolveFlashingAndRedraw MFC工程 版本号: v1.0.1 第一作者: Jef 地址: 中国/江苏 日期: 20091126 电子邮箱: dungeonsnd@126.com QQ: 420554565 (加好友时注明下载的文件名) 版权: 1.您可以修改及免费使用本程序。 2.修改之后附上您的个人信息发送到上面的作者邮箱,作者负责在全面测试后发布您修改后的新版本。 3.您使用本程序而导致任何伤害以及经济损失,由过错方依法承担所有责任,一概与第一作者及合作单位无关。 4.如果您使用本程序则表示您已经同意此版本协议!否则请勿使用! 项目功能: SolveFlashingAndRedraw 样例工程是MFC解决窗口保存及重绘闪烁问题的一种比较好的方案(Win32解决方法类似)。 运行步骤: 直接运行里面的程序,在窗口上任意拖拉鼠标画线,然后点击菜单栏的几个示范菜单项,然后移动窗口、 改变窗口大小、最大最小化窗口、用其它窗口覆盖窗口、鼠标放到任务栏。。。 以上种种操作观察窗口内的图像变化。可以发现窗口内图像几乎看不到闪烁,而且窗口的元素已经保存下来重绘时任然可以看到图像。 如何使用: 进行项目开发时,可以先建立项目,然后把本解决方案框架拷贝到新建项目中即可。 也可以自己根据需要修改。 其它: 友情提示,小心 View类头文件及View类的实现文件中有说明,使用时别把它弄到你实际项目里哦! 进行大量复杂的图形的输出,而且对效率要求特别高时要考虑适当修改此框架(如增加裁剪区)后再使用哦。 如何有任何问题欢迎与作者分享!!!
/****************************************************** SolveFlashingAndRedraw框架说明 ******************************************************/ /** 项目名称: demo框架 版本号: v1.0.2 第一作者: Jef 地址: 中国/江苏 日期: 20091126 电子邮箱: dungeonsnd@126.com 版权: 1.您可以修改及免费使用本程序。 2.修改之后附上您的个人信息发送到上面的作者邮箱,作者负责在全面测试后发布您修改后的新版本。 3.您使用本程序而导致任何伤害以及经济损失,由过错方依法承担所有责任,一概与第一作者及合作单位无关。 4.如果您使用本程序则表示您已经同意此版本协议!否则请勿使用! 项目功能: SolveFlashingAndRedraw框架是MFC解决窗口保存及重绘闪烁问题的一种比较好的方案(Win32解决方法类似)。 版本历史: v1.0.1 20091126 第一版本 v1.0.2 20091212 第二版本 1. 修改了部分变量的名字使其更符合其意义 2. 增加为两个工程,一是带demo例子的,另一是不带demo的纯净版. 3. 修改了其中一个错误. 如 CreateCompatibleDC之后没有调用DeleteDC等. 运行步骤: 直接运行demo里面的程序,在窗口上任意拖拉鼠标画线,然后点击菜单栏的几个示范菜单项,然后移动窗口、 改变窗口大小、最大最小化窗口、用其它窗口覆盖窗口、鼠标放到任务栏。。。 以上种种操作观察窗口内的图像变化。可以发现窗口内图像几乎看不到闪烁,而且窗口的元素已经保存下来重绘时任然可以看到图像。 如何使用: 进行项目开发时,可以先建立项目,然后把本解决方案框架拷贝到新建项目中即可。 也可以自己根据需要修改纯净版。 其它: 友情提示,小心 View类头文件及View类的实现文件中有说明,使用时别把它弄到你实际项目里哦! 进行大量复杂的图形的输出,而且对效率要求特别高时要考虑适当修改此框架(如增加裁剪区)后再使用哦。 关于如何在此框架的基础上提高绘图效率可以参阅下面的文章 如何提高绘图的效率 文章摘录 http://hi.baidu.com/new8sun/blog/item/68ccba8a80c3aadafc1f1079.html MFC双缓冲解决图象闪烁

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧