Windows Mobile窗口全屏总结

sdl的缩放问题 SDL是一种既是开源的,也是跨平台的多媒体开发包,在各种平台上应用很广,经常和FFMPEG等解码器同时使用。对于在windows mobile等缺乏通用播放器的平台来说,是一种很好的选择。网上很多代码,介绍SDL的用法,主要需要注意的情况有3种:第一: 绑定播放窗口问题:char sdl_var[128];     sprintf(sdl_var, "SDL_WINDOWID=0x%lx", m_ 阅读详情

经过细致研究和严格测试 负责任的给出《史上最全面的Windows Mobile窗口全屏总结》

开发和测试环境: VC2005 智能MFC

测试样机:dopod E616

-------------------------------------------------------------------

第一点:全屏到底用什么API最好

在MSDN、网络资料等有一下几种全屏方法:(都是简记 )

1、SHFullScreen

2、ShowWindow(FindWindow) 利用循环找出所有menuworker等等的窗口

3、EnumWindows(EnumWindowsProc) => EnumWindowsProc{GetClassName;ShowWindow;}

 

事实上,第2和第3 是一回事,都是通过找窗口 把符合条件的窗口找到然后隐藏,就像我在第5楼 说的一样:使用FindWindow 是个危险的做法 原因就在于,当用户主动结束掉应用程序,因来不及调用相应的显示而造成屏幕的部分系统级别的窗口缺失,让用户以为出了严重问题,我测试过,当用“运行的程序”结束进程,就会导致这类情况,当然重启WM可以恢复。(第4楼、第6楼就分别采用的这类方法)

 

然而,SHFullScreen是一个非常好的函数,他的参数是本窗体句柄,也就是说,无论在全屏后遭受如何的打击,即使进程强制关闭,都不会影响到系统整体。我强烈推荐使用SHFullScreen。 甚至如果你太懒,你可以不负责任的不去编写逆全屏代码。当然我还是会编写,因为可能考虑到在程序运行期间的主动退出全屏模式的可能。

 

 

第二点 如何隐藏菜单

让我把SHFullScreen的原型写出来:

SHFullScreen

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.

它的相应的宏标志:SHFS_SHOWTASKBAR、SHFS_HIDETASKBAR、SHFS_SHOWSIPBUTTON、 SHFS_HIDESIPBUTTON、SHFS_SHOWSTARTICON、SHFS_HIDESTARTICON也只有 “任务栏”、“SIPB(Standard Input Panel Button)”、开始菜单按钮的有效性(即在全屏后,是否可以列出开始菜单,可能的方法是手机硬键盘的windows标记按钮),并没有涉及菜单的标志。

 

因此,为了隐藏菜单,而且又为了不妨碍系统,就找到了SHFindMenuBar(hwnd)这个函数,它也是控制在本地句柄级别内的。

在用ShowWindow就可以隐藏找到的句柄。注意: SHFindMenuBar 只是找出现有可以看到的菜单的句柄,即如果你隐藏了,SHFindMenuBar就找不到了,所以如果你要恢复菜单,那么请你在隐藏前,保存找到的菜单句柄。

 

但是实际过程中,你会发现,ShowWindow(SHFindMenuBar(hwnd), SW_HIDE)并没有彻底隐藏菜单栏,而是隐藏了你自己的菜单,也就是说如果你执行ShowWindow(SHFindMenuBar(hwnd), SW_HIDE)一次后,会看到屏幕仍旧有一个空的菜单栏,只是原先有字的菜单不见了。 这是为什么呢?

事实上,原因是,一个窗口在没有建立用户自定义菜单时,已经有了一个默认菜单

ShowWindow(SHFindMenuBar(hwnd), SW_HIDE)之后 你再去SHFindMenuBar(hwnd),又会得到一个句柄,你得再把它隐藏掉。当然,如果你没有构造自定义菜单,那只有一个默认菜单。

 

如果你还需要在退出全屏时,重新显示菜单,那要怎么办呢,以建立了自定义菜单为例,理论上来说,你得把刚才的两次SHFindMenuBar(hwnd) 都保存句柄,然后依次ShowWindow(hmenu, SW_SHOW), hmenu有2个。

但是在实测过程中,我发现,没有必要显示默认的菜单栏,因为已经有自定义菜单栏覆盖在上面了。当然出于严谨的态度,我还是打算在最终版本中,将2个句柄都 SW_SHOW。以免造成纰漏。

如果没有自定义菜单,只有默认菜单,那只要一次来回就行了。

 

第三点 注意窗口的移动

由于上述的隐藏只是隐藏,WM不会向积木一样因为缺少了窗口而自动调整,因此在隐藏后的地方,仍旧没有重绘,需要我们自己用

MoveWindow来重新调整窗口位置。

在全屏过程中:SetRect(&SCR_Rect, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));获得窗口的最大表现。

在逆全屏过程中:SystemParametersInfo(SPI_GETWORKAREA, 0, &WORK_Rect, 0);获取本来面目大小。

 

 

第四点 全屏不受干扰

也许,你已经很满意了,这样就可以隐藏界面上所有的乱七八糟的东西了。

 

但是你会不经意发现,当点击SIPB、或者按了下手机上的照相机按钮等离开窗口时的动作发生后,原先已经全屏的窗口再一次变成了不全屏,也就是在本贴开头的提问, 不过由于没有人回答这个问题,我不得不自己找。

 

在MFC的窗体类中加入,2个消息ON_WM_SETTINGCHANGE()、ON_WM_ACTIVATE()

并本窗体内重载CDialog的OnSettingChange、OnActivate方法。

将OnSettingChange方法置为空方法{}

ON_WM_SETTINGCHANGE()消息可以被触发如,点击SIPB时,因此当触发时,就不让它做任何事,这样点击SIPB就不会还原,估计 CDialog的OnSettingChange方法内部具有还原全凭的代码。

 

但是这还不够,因为比如按了照相机按钮、短信按钮等,仍旧会让窗体的全屏失效,这时候ON_WM_ACTIVATE()消息就发挥了作用。

在重载的OnActivate方法中,再一次调用全屏代码,就能 即使窗体受到干扰,也能在干扰后“恢复”(其实就是再一次)全屏。

 

第五点 其他

剩下的就是如何有机的组合各种状态,比如我不隐藏“任务栏”,只隐藏菜单栏,那么窗体移动就要考虑位置问题,不能一味的往屏幕左上(0,0)移动,而是要往WorkArea的左上移动。等等的各类组合,就要自己灵活调整了。

 

读完此帖,应该可以解决基本上的所有全屏涉及的杂7杂8的问题了。没有语句检查,最恨技术贴有理解性的笔误,如果发现,留言。

 

from:http://topic.youkuaiyun.com/u/20090630/17/d06d6ed3-84fc-4ac2-b050-dafd26b827ae.html

 

在做了几个项目之后,终于找到了一个比较好的实现全屏的方法,之前做全屏的时候,在网上找了很多的实现方法,总结了下大致就2种(其他的大同小异):

1、         SetForegroundWindow();

        SHFullScreen(m_hWnd, SHFS_HIDESIPBUTTON);

        SHFullScreen(m_hWnd, SHFS_HIDETASKBAR);

        SHFullScreen(m_hWnd, SHFS_HIDESTARTICON);

 

2、        CWnd* pWndSIP = FindWindow( _T("menu_worker"), 0 );

        if ( pWndSIP )

        {

                pWndSIP->SetWindowPos(&wndBottom , 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE);

                pWndSIP->ShowWindow(SW_HIDE);

        }

        pWndSIP = FindWindow( _T("MS_SIPBUTTON"), 0 );

        if ( pWndSIP )

        {

                pWndSIP->SetWindowPos(&wndBottom , 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE);

                pWndSIP->ShowWindow(SW_HIDE);

        }

        pWndSIP = FindWindow( _T("HHTaskBar"), 0 );

        if ( pWndSIP )

        {

                pWndSIP->SetWindowPos(&wndBottom , 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE);

                pWndSIP->ShowWindow(SW_HIDE);

        }

 

这2种方法其实都可以实现窗口的全屏,但是在某些时候或者某些机器上,并不能成功,或者是开始是成功的,但是在某种情况下就跑出来了,而且之后一直就因此不了了,具体的原因我跟了下,因为Mobile自己带了很多系统的功能条,而且类名都是一样的,所以当时隐藏的可能只是其中的一个,并没有全部隐藏,当某些情况触发的时候就会将另外一个系统条弹出来,而且很难隐藏。

 

我找到的方法是,在程序启动的时候,或者是你需要隐藏的时候调用系统的EnumWindows函数去枚举所有的系统窗口,然后用 GetClassName(hwnd,szClassName,256);函数去根据窗口的名字去获取这个窗口的类名,然后根据你需要隐藏的类名去隐藏窗口,例如:

        if (!wcscmp(szClassName,L"HHTaskBar"))

        {

                ShowWindow(hwnd, SW_HIDE);

                //return FALSE;

        }

        if (!wcscmp(szClassName,L"menu_worker"))

        {

                //EnableWindow(hwnd, FALSE);

                ShowWindow(hwnd, SW_HIDE);

 

                //return FALSE;

        }

        if (!wcscmp(szClassName,L"MS_SIPBUTTON"))

        {

                //EnableWindow(hwnd, FALSE);

                ShowWindow(hwnd, SW_HIDE);

                //return FALSE;

        }

这样就可以保证所有的系统条都被隐藏了。

 

当然还有一点很重要,这样的函数执行了以后,一定要在你退出你的程序的时候写个逆隐藏函数,将之前隐藏的都显示出来(只需要将 ShowWindow(hwnd, SW_HIDE);改为ShowWindow(hwnd, SW_SHOW);),否则,退出你的程序之后可是什么都看不到了哦

 

MS_SIPBUTTON:下方中间的拼字那个窗口

menu_worker:下方的带颜色的长条,不算中间的拼字

HHTaskBar:上方的任务条

RAG优化知识库检索(4):混合检索技术 混合检索技术在RAG(检索增强生成)系统中的应用显著提升了检索效果。本文探讨了语义检索与关键词检索的优缺点,指出两者在语义理解和精确匹配方面的互补性。通过结合BM25与向量检索,混合检索系统能够更全面地捕捉文档的相关性。文章详细介绍了并行检索、级联检索、稀疏-密集混合表示等多种结合方式,并探讨了权重调整策略,如线性组合、动态权重调整和排序融合算法。此外,稀疏-密集混合检索架构的设计和实现方案也被深入分析,展示了如何通过结合不同检索方法的优势,提升RAG系统的检索质量和效率。 阅读详情

相关推荐

PCIe Electrical PHY(4)-PCIE SPEC第8章指标讲解

1.1 PCIE TX SPEC TX主要关心两类参数,一类是Voltage Parameters,一类是Jitter Parameters。 其中Voltage相关参数主要关心不同preset下差分电压幅度的准确性。以及共模电压的稳定性。 PCIE spec中对Jitter相关的参数测量定义如下: 分为两大类:DDJ(Data dependent Jitter)和UJ(Uncorrelated ...

maxwell2ic的博客 5949

Windows Mobile 窗口全屏

Dialog 模式:在OnInitDialog()内:BOOL CUbiMessageDialog::OnInitDialog(){    m_bFullScreen = FALSE; //    CDialog::OnInitDialog();     SHINITDLGINFO shidi;    memset(&shidi, 0, sizeof(SHINI

code09的专栏 983

CASS3D实战:高效三维房屋与地形采集绘制技巧

本文详细介绍了CASS3D在三维房屋与地形采集绘制中的高效技巧,包括智能绘房功能、不规则结构处理、特殊构件快速绘制及地形数据采集策略。通过实战案例和进阶操作指南,帮助用户快速掌握CASS3D的核心功能,提升三维采集与绘制效率。

weixin_29216049的博客 866

Windows Mobile程序全屏与非全屏

Windows Mobile如何让应用程序全屏显示,网上问这个问题的人很多,你也能轻松找到答案,但很多人反映效果不完美,如切换程序后又没了全屏效果,这次我花了些时间整理出我的实现,当然我也不保证我的就很完美,但至少在我用了这么久之后发觉自己这种方法还是蛮可靠的。所谓全屏,也就是让

jiangwei1989的专栏 798

坐标偏移不一致或瓦块重名的多个OSGB工程的融合

介绍如何使用实景三维小助手OSGBLab对坐标偏移不一致或瓦块重名的多个OSGB工程的融合

OSGBLab的博客 3231

给STM32F103的7寸屏找个新UI:LVGL 8.2裸机移植保姆级教程(附避坑清单)

本文详细介绍了如何将LVGL 8.2裸机移植到STM32F103开发板,特别针对7寸大屏(800×480分辨率)进行优化配置。从环境准备、工程搭建到显示驱动移植、内存优化与性能调优,提供完整的解决方案和避坑清单,帮助开发者快速实现美观的用户界面。

weixin_29181861的博客 413

Windows Mobile窗口全屏总结(zhuan)

TO:ALL 经过细致研究和严格测试 负责任的给出《史上最全面的Windows Mobile窗口全屏总结》 开发和测试环境: VC2005 智能MFC 测试样机:dopod E616 ------------------------------------------------------------------- 第一点:全屏到底用什么API最好 在MSDN、网络资

aikker的专栏 727

从摄像头选型到PCB布线:搞懂MIPI CSI带宽计算,避免你的嵌入式项目翻车

本文详细解析了MIPI CSI带宽计算在嵌入式项目中的关键作用,从摄像头选型到PCB布线提供全流程指导。通过实际案例和计算公式,帮助工程师准确计算带宽需求,避免图像丢帧和系统崩溃问题,同时优化PCB设计确保信号完整性。

weixin_30533109的博客 374

windows mobile下实现非全屏窗口显示

//切换到别的窗口再返回后,出现全屏显示的问题,已解决。初始化中代码将窗口居中显示。//实现方法:创建如下Dialog,继承它的Dialog都是非全屏窗口。NonFSDialog.h#pragma once// CNonFSDialog dialogclass CNonFSDialog : public CDialog{DECLARE_DYNAMIC(CNonF

1282

智能生活中枢:基于 ESP32-S3 的桌面智能助手与日程提醒终端设计与实现

本文完成了基于 ESP32-S3 的桌面智能助手与日程提醒终端的完整设计,实现了时间同步、日程管理、声光提醒、环境监测、本地存储等核心功能。硬件接线简洁、软件逻辑清晰,可直接制作成品使用。硬件方案:以 ESP32-S3 为核心,搭配 OLED、DS3231、DHT11、按键、声光模块,接线标准化、易复刻;软件方案:基于 Arduino 开发,提供标准 Mermaid 软件流程图,代码模块化、可直接编译运行;核心功能:网络授时、本地日程管理、掉电存储、声光提醒、温湿度监测,满足桌面智能助手全场景需求。

weixin_42300449的博客 208

YOLOv11改进策略【损失函数篇】| WIoU v3:针对低质量样本的边界框回归损失函数

是一种基于IoU的损失函数,旨在解决目标检测中边界框回归损失函数在处理低质量训练数据时的问题。论文链接:https://arxiv.org/pdf/2301.10051 源码链接:https://github.com/Instinct323/wiou此处需要查看的文件是中定义了模型的损失函数和计算方法,我们想要加入新的损失函数就只需要将代码放到这个文件内即可将下方的函数替换原本的函数即可: 用于计算各种损失。在内修改如下代码,使模型调用此损失函数。 tal.py中是一些损失函数的功能应用。在内修改如下代码,

Limiiiing的博客 3793

windows mobile 定制全屏窗口与菜单栏

定制全屏窗口: /* 定制全屏窗口 */ SHINITDLGINFO shidi;  HWND hDlg = m_hWnd;  // Create a Done button and size it.  shidi.dwMask = SHIDIM_FLAGS;  shidi.dwFlags = SHIDIF_FULLSCREENNOMENUBAR;  shidi.hDlg = hDlg;  ::SHInitDialog(&shidi);  /* 隐藏键盘 */ HWND hWnd = ::FindWindo

421

37、半导体硅材料中的缺陷与吸杂技术解析

本文系统解析了半导体硅材料中的缺陷形成机制及其对电子器件性能的影响,重点探讨了生长和工艺诱导缺陷、表面与内部微缺陷的起源与特征。文章详细阐述了吸杂技术的原理、过程及在集成电路和太阳能电池制造中的应用,强调通过氧行为调控和热处理优化实现缺陷控制。同时介绍了吸杂效果的评估方法,并展望了未来新型吸杂技术的发展趋势,为提升半导体器件性能和制造良率提供理论支持和技术路径。

mongodb5scout的博客 162

windows mobile 1.如何真正的退出程序而不隐藏窗体。2.让窗体跟着输入法窗口上移。3.如何创建非全屏Form

本文"windows mobile开发技巧归纳"主要讲了三个方面的内容分别为:1.如何真正的退出程序而不隐藏窗体。2.让窗体跟着输入法窗口上移。3.如何创建非全屏Form。windows mobile开发技巧一:如何真正的退出程序,而不是隐藏窗体?Windows Mobile中当你点击X的时候,并不是真正的关闭窗体,而是隐藏窗体,需要在应用程序的每个Form中调用一个函数才可以。pri

jklkjz的专栏 4151

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

c++ windows mobile中实现自定义窗口非全屏显示

创建自定义窗口的步骤: 1、插入新的dialog,添加类 2、主dialog相应按钮下,弹出自定义窗口:CInput inputbox;int nResponse=inputbox.DoModal(); 3、最关键的一步实现非全屏浮动显示。 给出代码: SHINITDLGINFO shidi; HWND hDlg = m_hWnd; sh...

weixin_30642561的博客 122

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Windows Mobile Phone全屏开发

一般来讲,通过函数SHFullScreen就可以实现,如通过如下调用SHFullScreen(hWnd, SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON | SHFS_HIDESTARTICON)即可实现,但有一个注意点,如果你的窗口里有MENU Bar 的话,则需要在全屏幕的时候隐藏MENU Bar可以调用SHGetMenuBar()来获取MENU的句柄,

Glacial Zone 674

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

windows mobile 全屏代码

今天看了,Windows Mobile图形图像编程http://blog.csdn.net/favormm/archive/2009/07/18/4359845.aspx是翻译如下的文章Pixel graphics programming on Windows Mobilehttp://www.codeproject.com/KB/mobile/Caleidoscope.asp

thanklife的专栏 1326

基于C#开发Windows Mobile应用中窗口的全屏幕显示

基于C#开发Windows Mobile英语使窗口全屏幕显示的方法如下: 全屏: this.WindowState = System.Windows.Forms.FormWindowState.Maximized; this.Menu = null; //若不设置为null则底端的菜单仍然会显示 this.ControlBox = false; 恢复正常: this.WindowState = System.Windows.Forms.FormWindowState.Normal;

wang123sf的专栏 1078

windows mobile全屏设置笔记

publicclassWin32{[DllImport("aygshell.dll")]publicstaticexternboolSHFullScreen(IntPtrhWnd,uintdwState);//http://msdn.microsoft.com/en-us/library/aa930139.aspx...

weixin_34128501的博客 123

WINCE及MOBILE常用代码

原文网址:http://www.cppblog.com/zhangyq/archive/2009/06/26/88579.html   对话框全屏代码 -----在OnInitDialog函数中加入以下代码 m_bFullScreen = FALSE; // Call SHInitDialog with flags for full screen.  SHINITDLGINFO shid

KKKDING的专栏 1206

eVC中全屏显示的实现

void CLpllpDlg::FullScreenDialog(HWND hDlg) { int x0,y0,cx, cy; x0 = -(GetSystemMetrics(SM_CXBORDER)+1); y0 = -(GetSystemMetrics(SM_CYBORDER)+1); HDC dc = ::GetDC(NULL); ...

weixin_30826095的博客 112

纪念一个曾经的软件产品(二)——基础技术与贴图

[回目录] “很多O2O领域创业者每个人心底都有个“大而全平台”的想法,但创业伊始就那么做往往不现实,要充分考虑手头‘可调配资源’,这里指的是自身有没有对内对 外hold住的能力。希望看到更多的满怀远大理想、认认真真做事踏踏实实执行的创业者,别就伟大蓝图却抓不住切入点,必须能找准垂直细分做透!”——这是最近在weibo上看到的一句话,深有感触,我想互联网行业发展至今,对我等草根而言,大而全的平台...

weixin_34029680的博客 138
上一篇: EnumWindows的使用
下一篇: Sql模糊查询
aptentity
博客等级 码龄20年 54粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值