4895|9

63

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

wince UI程序窗口覆盖问题 Z order [复制链接]

大家好,问个wince UI程序的问题。
问题描述:
系统开机后启动主程序(A对话框)。
1、在A对话框通过createprocess启动B程序(B对话框)。这时候B完全覆盖A,
   A对话框内开启了一个通讯监视线程,如果有来电,则A对话框会创建一个非模态对话框C,这时候C对话框是       在窗口最上面。
2、问题是,当通讯结束时,关闭C对话框。这时候A对话框覆盖在B之上。而B程序只运行一个实例,必须在A再次 启动B程序时,将B提到窗口TOP层。用SetForegroundWindow之类的函数都不行啊。


最新回复

谢谢8楼!!!!! 我再将所有的窗口都通过消息机制来弄吧。可能需要的消息比较多一点,相互之间配合也需要好好理顺。但应该要比统一由调用程序重新激活被调用程序窗口比较好理解。 a:如果可以将所有功能集中在一个程序中,只需要将一堆的DLG统一在一起管理,通过show/hide即可实现显示管理    刚开始我是想这样子在一个应用程序里做。一般简单一点的像类似GPS界面我也是这么搞的。但后来考虑到组之间成员相互合作问题。就将一些模块分成单独的进程进行处理。(我了解了一下,我的wm手机上就是将设置等分成单独的程序做的)。     详情 回复 发表于 2010-1-28 17:31
点赞 关注

回复
举报

89

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

HWND FindWindow(
  LPCTSTR lpClassName,
  LPCTSTR lpWindowName
);
然后
BOOL SetWindowPos(
  HWND hWnd,
  HWND hWndInsertAfter,
  int X,
  int Y,
  int cx,
  int cy,
  UINT uFlags
);
hWndInsertAfter 设置为 HWND_TOPMOST
不行吗?
不行再去WinCE的帮助文档查一下其他的函数
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
隐藏A,显示B
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
我是在B程序等初始化时,增加以下代码,让它只运行一个实例。并在找到先前的实例后,激活先前实例,关闭本次实例。但是用了以下注释的所有方法都没能成功,貌视用:::SetWindowPos(hwnd,   HWND_NOTOPMOST,   0,   0,   800,   480,   SWP_SHOWWINDOW);
//                                ::SetWindowPos(hwnd,   HWND_TOPMOST,   0,   0,   800,   480,   SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW);
还能将B程序激活,但不确定,只是看到一个窗口放大又缩小。却始终被A挡住。

HANDLE hEvent;
        HWND hwnd;
        WCHAR className[100];
        ::GetClassName(this->m_hWnd,className,100);
        hEvent  = CreateEvent(NULL,TRUE,FALSE,_T("setting"));
        if(NULL != hEvent)
        {
                if(GetLastError() == ERROR_ALREADY_EXISTS)
                {
                        Sleep(10);
                        hwnd = ::FindWindow(className,NULL);
                        if(hwnd != NULL)
                        {
//                                if(0 == ::SetForegroundWindow((HWND)(((ULONG) hwnd) | 0x01) ))
//                                {
//                                        MessageBox(_T("窗口激活失败"));
//                                }
//                                ::ShowWindow(hwnd,SW_SHOWMAXIMIZED);
//                                ::SetWindowPos(hwnd,   HWND_NOTOPMOST,   0,   0,   800,   480,   SWP_SHOWWINDOW);
//                                ::SetWindowPos(hwnd,   HWND_TOPMOST,   0,   0,   800,   480,   SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW);   
//                                ::SetForegroundWindow((HWND)(((ULONG) hwnd) | 0x01) );
//                        ::SetActiveWindow(hwnd);
//                        ::SetWindowPos(hwnd,   HWND_TOP,   0,   0,   800,   480,   SWP_SHOWWINDOW | SWP_NOREPOSITION | SWP_NOOWNERZORDER);
                        ::BringWindowToTop(hwnd);                       
                        CloseHandle(hEvent);
                                DestroyWindow();
                        }
                }
        }

91program
隐藏A,显示B
由于A是系统启动时一并启动的,感觉有点像mobile手机上的桌面程序一样。似乎隐藏它不太好。而且,在什么时候隐藏什么时候显示也是个问题。
   因为不光只有ABC的,而且,B对话框里也有像A一样能通过createprocess启动其它程序如“播放器”之类的窗口D,挡在AB之上,这样子的话,如果有来电时,A叫出来的C对话框,就在ABD之上。然后,通话结束后,本应该是ABD这样的顺序,却变成BDA。
   
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

5
 
不是由函数可以设置窗口层次吗?忘记了。记得看见过
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

6
 
最好不要依赖SetForegroundWindow,可以考虑通过自定义消息决定各个窗口的显示/隐藏来决定显示的界面

你这个问题的出现在于新创建的非模态对话框的父窗口为该程序的主窗口造成的,将该非模态对话框父窗口设为桌面即可

ps:
我记得create时传NULL是不行的,要获取桌面窗口句柄并传入

 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

7
 
你的对话框比较多,建议先规整一下流程,为什么不考虑使用MDI窗体呢?
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 5 楼 rainsly 的回复:
最好不要依赖SetForegroundWindow,可以考虑通过自定义消息决定各个窗口的显示/隐藏来决定显示的界面

你这个问题的出现在于新创建的非模态对话框的父窗口为该程序的主窗口造成的,将该非模态对话框父窗口设为桌面即可

ps:
我记得create时传NULL是不行的,要获取桌面窗口句柄并传入



嗯。有些窗口是由父窗口通过创建非模态对话框创建的。但有些是直接通过createprocess创建的进程。
我研究了一下一般的wm手机。比如它的设置啊,附件啊都是一个单独的程序。可以用挂机键等退到主窗口而不退出设置等程序。下次你再次点设置时,它就会把之前的设置程序调出来。
   我像这样做呢大致上可行。但是,由于我的系统不太同于智能手机。像这样子调出来的话,恐给用户误解。因为必须在退出通话之后,再次通过按键激活先前程序。而不是退出通话后直接激活先前程序。
   

你的对话框比较多,建议先规整一下流程,为什么不考虑使用MDI窗体呢?
呵呵!在这方面做的不多。也不知道wince的界面应用程序一般是怎么样弄的。所以每回都是对话框。MDI窗体可行不?
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

9
 
如果是多个进程配合工作则可以通过将需要显示的窗口topmost来实现窗口的切换
比如定义一个自定义消息,参数传要显示的窗口句柄,每个窗口都处理该消息,如果发现自己是当前窗口,则将自己topmost,否则将自己去除topmost属性
然后任何需要切换焦点的程序都可以findwindow/postmsg来设置要显示的窗口

如果可以将所有功能集中在一个程序中,只需要将一堆的DLG统一在一起管理,通过show/hide即可实现显示管理

嵌入式平台不推荐MDI
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

10
 
谢谢8楼!!!!!

我再将所有的窗口都通过消息机制来弄吧。可能需要的消息比较多一点,相互之间配合也需要好好理顺。但应该要比统一由调用程序重新激活被调用程序窗口比较好理解。

a:如果可以将所有功能集中在一个程序中,只需要将一堆的DLG统一在一起管理,通过show/hide即可实现显示管理
   刚开始我是想这样子在一个应用程序里做。一般简单一点的像类似GPS界面我也是这么搞的。但后来考虑到组之间成员相互合作问题。就将一些模块分成单独的进程进行处理。(我了解了一下,我的wm手机上就是将设置等分成单独的程序做的)。
  
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表