`
guowee
  • 浏览: 173660 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

如何处理屏幕方向改变

阅读更多

 在Windows Mobile平台的应用程序开发过程中,如何处理屏幕方向改变对程序带来的影响是一个重要的问题。Allen Lee的文章《WM有约(四):处理屏幕旋转》中讲述了如何使用Mobile Client Software Factory中的OrientationAware控件来处理屏幕方向改变,好处就是我们不用添加任何代码。在我之前的文章《Docking and Anchoring Controls on Windows Mobile》和《创建Windows Mobile上兼容性好的UI程序》中,提到了使用控件自身的Docking and Anchoring来适应设备屏幕方向的改变。今天在msdn的技术文章中,看到了一篇文章,《Developing Orientation-Aware and Resolution-Aware Windows Mobile-based Applications in Native Code》,讲述了如何使用native code来处理设备的portrait/landscape这两个模式的改变对设备UI带来的影响,觉得有必要和大家分享一下。

  该文章使用字谜游戏Crossword为背景,在没有处理设备portrait/landscape模式之前,该程序是运行在portrait模式下的,然而在landscape模式下,有些控件就不在屏幕显示的范围之内了,而且背景看上去也不对了,如下图1所示:

用本地代码实现屏幕方向自适应的Windows Mobile程序

  图1:未经处理情况下的程序界面

  解决的方法可以分为几个步骤:

 1. 准备一张320*320大小的背景图片替换掉原来的240*320的图片。

 2. 在OnPaint事件处理中,修改添加背景图片的代码如下:

  BitBlt(hDC, 0, 0, 320, 320, hMemDC, 0, 0, SRCCOPY);

  3. 在WndProc 的WM_SIZE处理中,修改text box的宽度,代码如下:

1caseWM_SIZE:
2
3{
4
5  HWNDhEditBox=GetDlgItem(hWnd,IDC_MAIN_EDIT_BOX);
6
7  HWNDhEnterButton=GetDlgItem(hWnd,IDC_MAIN_ENTER_BUTTON);
8
9  INTnWidth=LOWORD(lParam);
10
11 
12
13  MoveWindow(hEditBox,8,4,nWidth-70,20,TRUE);
14
15  MoveWindow(hEnterButton,nWidth-57,4,50,20,TRUE);
16
17}
18
19break;

 

4. 写一个函数来判断当前屏幕的高度是否小于320,代码如下:

1BOOLInWideMode()
2
3{
4
5  intheight=GetSystemMetrics(SM_CYSCREEN);
6
7  return(height<320)?TRUE:FALSE;
8
9}

  5. 在OnPaint事件处理中,添加提示框的处理,代码如下:

1  RECTrTallMode={25,200,230,245};
2
3  RECTrWideMode={240,43,311,185};
4
5  RECT&r=InWideMode()?rWideMode:rTallMode;
6
7  HBITMAPhPattern=LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_PATTERN));
8
9  HBRUSHhNewBrush=CreatePatternBrush(hPattern);
10
11  HBRUSHhOldBrush=(HBRUSH)SelectObject(hDC,hNewBrush);
12
13  Rectangle(hDC,r.left,r.top,r.right,r.bottom);
14
15  SelectObject(hDC,hOldBrush);
16
17  DeleteObject(hNewBrush);
18
19  DeleteObject(hPattern);

 6. 添加各个对话框在landscape模式下的对应情况,也就是在资源的对话框目录中添加对应的***_WIDE对话框,并且对它的控件做相应调整。

  7. 在各自对话框的WM_SIZE处理中,修改代码,使其能够做出屏幕模式的适应。代码如下:

1caseWM_SIZE:
2
3{
4
5   RelayoutDialog(g_hInst,hDlg,InWideMode()?
6
7     MAKEINTRESOURCE(IDD_TOOLS_OPTIONS_1_WIDE):
8
9     MAKEINTRESOURCE(IDD_TOOLS_OPTIONS_1));
10
11}
12
13returnTRUE;
14
15 
16
17caseWM_SIZE:
18
19{
20
21   RelayoutDialog(g_hInst,hDlg,InWideMode()?
22
23     MAKEINTRESOURCE(IDD_TOOLS_OPTIONS_2_WIDE):
24
25     MAKEINTRESOURCE(IDD_TOOLS_OPTIONS_2));
26
27}
28
29returnTRUE;
30
31

 然后,重新编译我们修改后的程序,并且在模拟器中进行调试,效果如下图2所示:

用本地代码实现屏幕方向自适应的Windows Mobile程序

  图2:经过修改后的程序界面

  参考链接:

  WM有约(四):处理屏幕旋转

  Docking and Anchoring Controls on Windows Mobile

  创建Windows Mobile上兼容性好的UI程序

  Developing Orientation-Aware and Resolution-Aware Windows Mobile-based Applications in Native Code

<!---->
分享到:
评论

相关推荐

    orientationchangeend:当设备的方向改变并且相关的旋转动画已经完成时,orientationchangeend 事件被触发

    orientationchangeend在跟随方向改变事件的屏幕旋转动画结束时触发。 这是为与移动 Safari 一起使用而开发的,尽管实现的性质使其可以安全地与其他供应商一起使用。 底层实现 无法捕获方向更改事件的结束,因为对...

    linux下使用curses库实现滚屏、彩色打印等个性化屏幕输出

    如何在程序中使用curses? 如何编译(compile) ...如何改变屏幕显示字元的属性 视窗的建立 多视窗处理函式的格式 视窗内的座标系 POP-UP 视窗的建立 视窗的卷动 模拟joe分割画面同时编辑两个档案

    手机横竖屏切换事件

    //屏幕方向改变处理 if(iw != innerWidthTmp){ if(iw&gt;window.innerHeight)orientation = 90; else orientation = 0; //调用转屏事件 screenOrientationEvent(); innerWidthTmp = iw; } } catch(e){alert&#...

    CZHPopUpView:ios弹窗视图,使用block处理点击事件

    很简单的弹窗视图控件,可以设置箭头方向在视图的上下左右,可以自定义视图背景颜色,判断视图超出屏幕自动改变位置 使用很简单,默认白色背景箭头在上面 - (IBAction)leftTop:(UIButton *)sender { CGPoint ...

    Android 手机系统中的重力传感器+源码

     //传感器获取值发生改变,在此处理  x = event.values[0]; //手机横向翻滚  //x&gt;0 说明当前手机左翻 x右翻  y = event.values[1]; //手机纵向翻滚  //y&gt;0 说明当前手机下翻 y上翻  z = event.values[2];...

    processing-arduino-cube-interface:该项目是为阿姆斯特丹的一个研讨会开发的代码RGA多维数据集接口。 借助MPU6050传感器及其输出的数据,我们知道了其方向

    向左,向右,向上,向下移动传感器可控制屏幕上的热点位置图片-使用网络摄像头,旋转传感器本身会改变图像输出的色彩。 将传感器向左倾斜拍摄照片并将其保存到文件夹match-3d输出,可在所有3个坐标上映射传感器的...

    Android天气预报应用

    (4)在用户改变手机方向导致屏幕在横屏和竖屏之间切换时,能够根据实际情况对界面布局进行调整。 (5)如果不能查询到相应城市的天气信息,则需要进行异常判断和处理 (6)提供更换皮肤的功能(让用户在内置皮肤或...

    wp菜单栏Application Bar效果

    只有在点击菜单栏右侧的省略号(或省略号下方的区域)时才会显示出来,在电话屏幕的方向改变时,系统会自动处理菜单栏的方向(包括按钮和菜单 项),详细请看说明。详细说明:...

    IDL帮助(中文).doc

    改变文本的方向 61 给图形显示添加线和符号 61 图形显示添加色彩 62 第三章 图像数据处理 65 本章概要 65 图像处理 65 显示图像 65 调整图像数据 67 显示24位图像 69 控制图像显示顺序 70 改变图像尺寸 70 在显示...

    IDL入门教程.doc

    改变文本的方向 61 给图形显示添加线和符号 61 图形显示添加色彩 62 第三章 图像数据处理 65 本章概要 65 图像处理 65 显示图像 65 调整图像数据 67 显示24位图像 69 控制图像显示顺序 70 改变图像尺寸 70 在显示...

    夏普电视液晶面板核心技术分析

    这个技术主要是针对光线的反射与透光问题而设计的,它通过在屏幕表面加入数层带有特殊化学涂层的薄膜光学物质对外来光线进行处理,一方面折射成不同的比例,使反射的光线得以改变方向并互相抵消;另一方面能最大限度...

    GP-2020-2021:游戏编程实验室和讲座-带有处理能力的创意编码

    2020-2021年游戏编程 团队链接 资源 ...当每艘船到达屏幕的一侧时,它会改变方向并返回。 要获得满分,您应该在解决方案中使用循环,数组,if语句和类。 演讲 第4周响应音乐的3D立方体和球体 实验室 以

    Android开发应用实战详解源代码

    5.18 变换屏幕的方向 5.19 获取设备信息 5.20 小结 第6章 手机自动服务 6.1 实现短信提醒 6.2 剩余电量提醒 6.3 短信群发 6.4 短信e-mail通知 6.5 来电提醒 6.5.1 实现原理 6.5.2 telephonymanager和...

    PacMen

    PacMen图像将在屏幕上随机移动,检测它们何时碰到边界元素的边缘并改变方向。 安装方式 下载html文件,然后从浏览器运行。 用法 乐趣和学习。 路线图 路线图上没有待处理的项目。 发牌 麻省理工学院xPro

    Mapgis实验报告(1).doc

    F11键(改向):用来控制在矢量跟踪过程中改变跟踪方向的操作。按一次F11键,就 转到矢量线的另一端进行跟踪。 F12键(抓线头):在矢量化一条线开始或结束时,可用F12功能键来捕捉需相连接的 线头。 Ctrl+右键单击...

    RoKiSim 工业机器人仿真1.61

    按Alt + PrtScn您可以将图像粘贴在您最喜爱的图形程序(如GIMP),或直接到文字处理程序(例如,Microsoft Word或PowerPoint中)。在Windows 7中, 您也可以使用截图工具应用程序以一个窗口,一个矩形区域,或自由...

    今越电子数字存储示波器制作(原理图+程序HEX文件)-电路方案

    该参数用于调整波形在屏幕上垂直方向的高低, 屏幕左侧边沿有一个小三角形, 它对应着 0V 电平的位置。 H.POS( 水平位置) 该参数用于改变波形的水平位置, 既将波形在水平方向前后移。 采集到的波形是有一定长度的...

    Funcode编程C++实现坦克大战游戏课程设计

    敌方坦克自由移动,每隔2秒改变一个方向,每隔3秒发射一发子弹。 4).敌方坦克共有20辆,每隔5秒,从屏幕上方的左、中、右三个位置依次出现。 5).当玩家被消灭或者我方基地被摧毁时,游戏结束。 二、设计思路 1....

    android重力传感器源码

    //传感器获取值发生改变,在此处理 x = event.values[0]; //手机横向翻滚 //x&gt;0 说明当前手机左翻 x右翻 y = event.values[1]; //手机纵向翻滚 //y&gt;0 说明当前手机下翻 y上翻 z = event.values[2]; //屏幕的...

Global site tag (gtag.js) - Google Analytics