Pocket PC Dialog Full Screen
来源:互联网 发布:强氧科技淘宝 编辑:程序博客网 时间:2024/06/06 21:43
这两天在项目上有这样一个需求:在Pocket PC/Smartphone上全屏显示界面。听完后觉得很简单,于是迅速着手实施。
刚开始,我想到的是SHFullScreen这个API。来看看MSDN上对这个方法的介绍:
BOOL SHFullScreen ( HWND hwndRequester, DWORD dwState);
This function can be used to take over certain areas of the screen. It is used to modify the taskbar, Input Panel button, or Start menu icon.
其中dwState可以是:
SHFS_SHOWTASKBAR SHFS_HIDETASKBAR SHFS_SHOWSIPBUTTON SHFS_HIDESIPBUTTON SHFS_SHOWSTARTICON SHFS_HIDESTARTICON
光从这个参数的选项上就可以看出来,完全可以使用这个API来实现我的需求了。于是,我在我的函数中增加了这样一个方法:
void CMWatchHistoryDlg::OnFullScreen(BOOL bFullScreen)
{
SetForegroundWindow();
if(bFullScreen)
{
GetWindowRect(&m_rcSave);
SHFullScreen(m_hWnd, SHFS_HIDETASKBAR|SHFS_HIDESTARTICON|SHFS_HIDESIPBUTTON);
MoveWindow(0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), TRUE);
}
else
{
SHFullScreen(m_hWnd, SHFS_SHOWTASKBAR|SHFS_SHOWSIPBUTTON|SHFS_SHOWSTARTICON);
MoveWindow(m_rcSave);
}
}
添加成功以后,运行,结果却不尽如人意。因为我的Dialog上存在着两个自定义的按钮,在我调用了我的全屏的方法以后,屏幕下方仍然存在着这两个Menu。显然光光调用这SHFullScreen这个API是不能解决问题了。
于是上网google了一下,发现需要查找到自定义的Menu的句柄,然后将其隐藏起来。于是又有了这个API SHFindMenuBar,顾名思义,它就是能检索到Menu的API了,于是在代码中曾加如下代码:
隐藏时增加:HWND hmenBar = ::SHFindMenuBar(m_hWnd);
::ShowWindow(hmenBar, SW_HIDE);
显示时增加:HWND hmenBar = ::SHFindMenuBar(m_hWnd);
::ShowWindow(hmenBar, SW_SHOW);
编译运行,发现虽然我的自定义的Menu成功隐藏了,但是这时候屏幕下方的spin Button又没能成功隐藏,我就很奇怪,左思右想,不能明白。因为要全屏显示的Dialog是有别的Dialog使用非模态的方式弹出来的,起初我以为是前一个Dialog引起的,因为前一个Dialog同样有自定义的menu存在。于是我在OnFullScreen中增加全屏前一个Dialog的方法,编译运行,仍然不行。屏幕下方的Spin Button仍然完好无缺的显示着。
于是我不停的查资料,尝试了,为了测试方便,我新建了一个单文本的工程,由主窗口弹出一Dialog,然后再全屏显示Dialog。真是误打误着,我发现主页面能被完整的全屏,而Dialog却始终不能,然后在网上搜索相关文章,发现一篇:http://support.microsoft.com/default.aspx?scid=kb;%5Bln%5D;266244。里面大概是说,如果要全屏显示Dialog的话,必须要保证对话框上的所有控件都必须去除tabstop属性,可是我的Dialog没有任何控件存在。这毕竟是Microsoft Help and support网站啊,不敢大意,我甚至将Dialog上的menu都使用SetWindowLong去除掉TabStop属性,可是怎么都不行。
经过将近一天的尝试,始终解决了问题,方法如下:
在OnInitDialog里面创建自己的MenuBar之前,首先保存空的Menubar的句柄:
m_hEmptyMenuBar = ::SHFindMenuBar(m_hWnd);
然后在全屏的方法里:
void CMWatchLiveDlg::OnFullScreen(BOOL bFullScreen)
{
::SetForegroundWindow(GetSafeHwnd());
if(bFullScreen)
{
GetWindowRect(&m_rcSave);
if(m_hEmptyMenuBar)
::ShowWindow(m_hEmptyMenuBar, SW_HIDE);
if(m_hMenuBar)
::ShowWindow(m_hMenuBar, SW_HIDE);
SHFullScreen(m_hWnd, SHFS_HIDETASKBAR|SHFS_HIDESTARTICON|SHFS_HIDESIPBUTTON);
MoveWindow(0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), TRUE);
}
else
{
if(m_hEmptyMenuBar)
::ShowWindow(m_hEmptyMenuBar, SW_SHOW);
if(m_hMenuBar)
::ShowWindow(m_hMenuBar, SW_SHOW);
SHFullScreen(m_hWnd, SHFS_SHOWTASKBAR|SHFS_SHOWSTARTICON|SHFS_SHOWSIPBUTTON);
MoveWindow(m_rcSave);
}
}
通过这种方法就可以实现的PocketPC上的全屏操作了。
- Pocket PC Dialog Full Screen
- Pocket PC Dialog Full Screen
- Pocket PC 电视遥控器
- Pocket PC Protect
- Pocket PC Network Programming
- Pocket PC 基础知识
- sms api(pocket pc)
- mms讲解(pocket pc)
- Palm & Pocket PC Programming
- Pocket PC 笔记
- pocket pc 开发笔记
- Pocket PC C#
- pocket PC 播放声音文件
- pocket pc 2003 联网
- Full screen dialogs
- android full screen
- android full screen
- mplayer full screen
- log4j 学习笔记
- javascript(js)使用eval方法加密过的函数解密方法
- dedecms5.5 单页自动获取文章列表内容
- 写协议的一些思路
- 健康专家:久坐可致命
- Pocket PC Dialog Full Screen
- 在MyEclipse5.0中使用svn
- 如何实现在一个网页中弹出多个不同的小窗口
- Ext.data.SimpleStore简单的数据存储器 和Ext.grid.ColumnModel
- C#图像处理
- IIS 5.1网页打开时提示找不到该页?删除更名或不用
- 每天学习一点点,记录下来,加油。(圆角矩形框内加内容 --动画)
- JS密码强度验证(兼容IE,火狐,谷歌) -- 仿JQuery中文社区注册
- 明白