精华内容
下载资源
问答
  • c# 以编程方式更改屏幕方向 更改屏幕方向 修改分辨率
  • 背水一战 Windows 10 (2) - UI: 概述, 启动屏幕, 屏幕方向 原文:背水一战 Windows 10 (2) - UI: 概述, 启动屏幕, 屏幕方向[源码下载] 背水一战 Windows 10 (2) - UI: 概述, 启动屏幕, 屏幕方向 作者...
    原文:背水一战 Windows 10 (2) - UI: 概述, 启动屏幕, 屏幕方向

    [源码下载]


    背水一战 Windows 10 (2) - UI: 概述, 启动屏幕, 屏幕方向



    作者:webabcd


    介绍
    背水一战 Windows 10 之 UI

    • UI 设计概述
    • 启动屏幕(闪屏)
    • 屏幕方向



    示例
    1、UI 设计概述
    UI/Summary.xaml

    <Page
        x:Class="Windows10.UI.Summary"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows10.UI"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="Transparent">
            <StackPanel Margin="10 0 10 10">
    
                <TextBlock Name="lblMsg" TextWrapping="Wrap" Margin="0 10 10 10">
                    <Run>1、UWP - Universal Windows Platform</Run>
                    <LineBreak />
                    <Run>2、设计 UWP 应用时,要以有效像素(effective pixels)进行设计,而不是以物理像素(physical pixels)进行设计。因为系统会根据设备的像素密度和观看距离自动缩放</Run>
                    <LineBreak />
                    <Run>3、有效分辨率 - 以有效像素为单位的分辨率;物理分辨率 - 以物理像素为单位的分辨率</Run>
                    <LineBreak />
                    <Run>4、对于有效分辨率的理解可以参考 ios 的逻辑分辨率的概念,比如 iPhone 4s 的物理分辨率为 960 * 640,其逻辑分辨率为 480 * 320(设计时按照此分辨率设计)</Run>
                    <LineBreak />
                    <Run>5、有效分辨率和物理分辨率之间的比例是如何决定的呢?由系统根据设备的像素密度和观看距离来决定比例</Run>
                    <LineBreak />
                    <Run>6、当系统缩放 UI 时,会按 4 的倍数(multiples of 4, 从字面上理解不一定是整倍数)进行缩放。若要确保缩放后保持清晰的外观,请将你的设计贴靠到 4*4 像素网格,使 UI 元素的边距、大小和位置为 4 个有效像素的倍数</Run>
                </TextBlock>
    
            </StackPanel>
        </Grid>
    </Page>

     
    2、启动屏幕(闪屏)
    UI/MySplashScreen.xaml

    <Page
        x:Class="Windows10.UI.MySplashScreen"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows10.UI"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <!--
            var color = (Color)this.Resources["SystemAccentColor"];
        -->
        <Grid Name="grid" Background="{ThemeResource SystemAccentColor}">
    
            <Image x:Name="splashImage" Source="/Assets/SplashScreen.png" HorizontalAlignment="Center" />
    
            <StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="0 0 0 20">
                <ProgressRing IsActive="True" Foreground="White" />
                <TextBlock Name="lblMsg" Text="我是自定义启动页,1 秒后跳转到主页" Margin="0 10 0 0" />
            </StackPanel>
    
        </Grid>
    </Page>

    UI/MySplashScreen.xaml.cs

    /*
     * 演示如何自定义启动屏幕(闪屏)
     * 
     * 说明及应用场景:
     * 1、在 Package.appxmanifest 中可以设置 app 的启动屏幕,例如: <uap:SplashScreen Image="Assets\SplashScreen.png" BackgroundColor="#ff0000" />,其就是一个显示在窗口中间的图片(620 * 300)以及一个全窗口背景色
     * 2、在 app 的启动屏幕过后,可以显示一个自定义启动屏幕
     * 3、在自定义启动屏幕显示时,可以做一些程序的初始化工作,初始化完成后再进入主程序
     */
    
    using System;
    using System.Threading.Tasks;
    using Windows.ApplicationModel.Activation;
    using Windows.Foundation;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    
    namespace Windows10
    {
        using Windows10.UI;
    
        public partial class App
        {
            // partial method,实现了 App.xaml.cs 中的声明
            partial void OnLaunched_SplashScreen(LaunchActivatedEventArgs args)
            {
                // 启动后显示自定义启动屏幕
                if (args.PreviousExecutionState != ApplicationExecutionState.Running)
                {
                    MySplashScreen mySplashScreen = new MySplashScreen(args);
                    Window.Current.Content = mySplashScreen;
                }
            }
        }
    }
    
    namespace Windows10.UI
    {
        public sealed partial class MySplashScreen : Page
        {
            /*
             * SplashScreen - app 的启动屏幕对象,在 Application 中的若干事件处理器中的事件参数中均可获得
             *     ImageLocation - app 的启动屏幕的图片的位置信息,返回 Rect 类型对象
             *     Dismissed - app 的启动屏幕关闭时所触发的事件
             */
    
            // app 启动屏幕的相关信息
            private SplashScreen _splashScreen;
    
            public MySplashScreen()
            {
                this.InitializeComponent();
    
                lblMsg.Text = "自定义 app 的启动屏幕,打开 app 时可看到此页面的演示";
            }
    
            public MySplashScreen(LaunchActivatedEventArgs args)
            {
                this.InitializeComponent();
                
                ImplementCustomSplashScreen(args);
            }
    
            private async void ImplementCustomSplashScreen(LaunchActivatedEventArgs args)
            {
                // 窗口尺寸发生改变时,重新调整自定义启动屏幕
                Window.Current.SizeChanged += Current_SizeChanged;
    
                // 获取 app 的启动屏幕的相关信息
                _splashScreen = args.SplashScreen;
    
                // app 的启动屏幕关闭时所触发的事件
                _splashScreen.Dismissed += _splashScreen_Dismissed;
    
                // 获取 app 启动屏幕的图片的位置,并按此位置调整自定义启动屏幕的图片的位置
                Rect splashImageRect = _splashScreen.ImageLocation;
                splashImage.SetValue(Canvas.LeftProperty, splashImageRect.X);
                splashImage.SetValue(Canvas.TopProperty, splashImageRect.Y);
                splashImage.Height = splashImageRect.Height;
                splashImage.Width = splashImageRect.Width;
    
                await Task.Delay(1000);
    
                // 关掉自定义启动屏幕,跳转到程序主页面
                var rootFrame = new Frame();
                rootFrame.Navigate(typeof(MainPage), args);
                Window.Current.Content = rootFrame;
                Window.Current.Activate();
            }
    
            void Current_SizeChanged(object sender, Windows.UI.Core.WindowSizeChangedEventArgs e)
            {
                // 获取 app 启动屏幕的图片的最新位置,并按此位置调整自定义启动屏幕的图片的位置
                Rect splashImageRect = _splashScreen.ImageLocation;
                splashImage.SetValue(Canvas.LeftProperty, splashImageRect.X);
                splashImage.SetValue(Canvas.TopProperty, splashImageRect.Y);
                splashImage.Height = splashImageRect.Height;
                splashImage.Width = splashImageRect.Width;
            }
    
            private void _splashScreen_Dismissed(SplashScreen sender, object args)
            {
                // app 的启动屏幕关闭了
            }
        }
    }


    3、屏幕方向
    UI/ScreenOrientation.xaml

    <Page
        x:Class="Windows10.UI.ScreenOrientation"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows10.UI"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="Transparent">
            <StackPanel Margin="10 0 10 10">
    
                <ToggleButton Name="btnLock" Content="锁定当前方向" IsChecked="False" Checked="btnLock_Checked" Unchecked="btnLock_Unchecked" />
    
                <TextBlock Name="lblMsg" Margin="0 10 0 0" />
    
            </StackPanel>
    
        </Grid>
    </Page>

    UI/ScreenOrientation.xaml.cs

    /*
     * 演示“屏幕方向”相关知识点
     */
    
    using System;
    using Windows.Graphics.Display;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Navigation;
    
    namespace Windows10.UI
    {
        public sealed partial class ScreenOrientation : Page
        {
            public ScreenOrientation()
            {
                this.InitializeComponent();
            }
    
            protected override void OnNavigatedTo(NavigationEventArgs e)
            {
                // 使用设备时的推荐方向,一般而言就是当“windows”键在下方时,设备的方向。手机一般是 Portrait,平板一般是 Landscape
                lblMsg.Text = "NativeOrientation: " + DisplayInformation.GetForCurrentView().NativeOrientation.ToString();
                lblMsg.Text += Environment.NewLine;
    
                // 设备的方向(Windows.Graphics.Display.DisplayOrientations 枚举:None, Landscape, Portrait, LandscapeFlipped, PortraitFlipped)
                // 注:LandscapeFlipped 是 Landscape 翻转了 180 度,PortraitFlipped 是 Portrait 翻转了 180 度
                // 注:Landscape 顺时针转(右转) 90 度是 Portrait,再顺时针转(右转) 90 度是 LandscapeFlipped
                lblMsg.Text += "CurrentOrientation: " + DisplayInformation.GetForCurrentView().CurrentOrientation.ToString();
    
                // NativeOrientation 或 CurrentOrientation 发生变化时触发的事件(NativeOrientation 一般是不会变的)
                DisplayInformation.GetForCurrentView().OrientationChanged += ScreenOrientation_OrientationChanged;
            }
    
            private void ScreenOrientation_OrientationChanged(DisplayInformation sender, object args)
            {
                lblMsg.Text += Environment.NewLine;
                lblMsg.Text += "NativeOrientation: " + DisplayInformation.GetForCurrentView().NativeOrientation.ToString();
                lblMsg.Text += Environment.NewLine;
                lblMsg.Text += "CurrentOrientation: " + DisplayInformation.GetForCurrentView().CurrentOrientation.ToString();
            }
    
            protected override void OnNavigatedFrom(NavigationEventArgs e)
            {
                DisplayInformation.GetForCurrentView().OrientationChanged -= ScreenOrientation_OrientationChanged;
            }
    
            private void btnLock_Checked(object sender, RoutedEventArgs e)
            {
                /* 在 Package.appxmanifest 中可以配置 app 的允许方向,类似如下(如果不配置就是允许任何方向)
                   <uap:InitialRotationPreference>
                       <uap:Rotation Preference="portrait" />
                       <uap:Rotation Preference="landscape" />
                       <uap:Rotation Preference="portraitFlipped" />
                       <uap:Rotation Preference="landscapeFlipped" />
                   <uap:InitialRotationPreference>
                */
    
                // DisplayInformation.AutoRotationPreferences - 指定当前 app 的首选方向,即强制通过指定的方向显示(必须是在 Package.appxmanifest 配置的允许方向之一)
                DisplayInformation.AutoRotationPreferences = DisplayInformation.GetForCurrentView().CurrentOrientation;
                btnLock.Content = "解除方向锁定";
            }
    
            private void btnLock_Unchecked(object sender, RoutedEventArgs e)
            {
                DisplayInformation.AutoRotationPreferences = DisplayOrientations.None;
                btnLock.Content = "锁定当前方向";
            }
        }
    }



    OK
    [源码下载]

    posted on 2017-09-21 09:08 NET未来之路 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/lonelyxmas/p/7566761.html

    展开全文
  • Windows Mobile 开发识别屏幕方向的应用程序 编写目的: 现在Windows Mobile的屏幕分辨率支持非常多。最新的Windows Mobile6.5支持240*240,240*320,240*400,320*320,480*480,480*640,480*800,480*854。当...

    Windows Mobile 开发识别屏幕方向的应用程序

     

    编写目的:

        现在Windows Mobile的屏幕分辨率支持非常多。最新的Windows Mobile6.5支持

    240*240240*320240*400320*320480*480480*640480*800480*854。当我们开发的窗体程序想适应如此多的分辨率时,往往要为一个对话框建立多个对话框模板。最常用的方法就是用RelayoutDialog。来重新layout对话框。这样使我们陷入了不断的摆放控件,然后编译查看效果。往往为了支持,方屏、肖像模式、风景画模式要建立三个模板。此文的目的就是用代码的方式来Layout窗体,使支持不同的分辨率。

     

    更改屏幕方向:引MSDN

    通常,屏幕方向仅在用户使用“屏幕方向”控制面板,或按下某硬件按钮来旋转屏幕时才改变。

    此外,应用程序也可通过 ChangeDisplaySettingsEx 函数以编程方式更改屏幕方向。该函数使用方法见 MSDN 中“Rotating the Content of the Screen”(旋转屏幕内容的方向)一文。例如,如果使用的应用程序只能在竖向模式下操作,则可通过编程改变屏幕方向。但是,如果屏幕方向的改变很突然,通过编程改变屏幕方向会让用户搞不清楚。应用程序应始终要求用户在旋转屏幕前确认显示模式。

    为了在竖向模式下显示,将 dmDisplayOrientation 字段中的 DEVMODE 结构设置为 DMDO_0。对于右手横向模式,使用 DMDO_270。对于左手横向模式,使用 DMDO_90

     

    应用程序窗口如何识别屏幕方向:引MSDN

    屏幕方向如果改变,或当“输入面板”出现时,应用程序的所有全屏顶层窗口都要适应新的取向。

    注意: 如果窗口的上、左、右坐标在工作区域边界之上或之外,该窗口被认为是全屏窗口。工作区域是标题栏下的整个屏幕区域。顶层窗口是无父窗口的窗口,即有一个 NULL 父窗口。

    如果窗口大小改变,窗口将收到 WM_SIZE 通知。WM_SIZE 消息的 lParam 参数的低位字指定了客户端区域的新宽度,高位字指定了客户端区域的新高度。应用程序应识别窗口大小的改变,并相应地更新窗口布局。此外,也应重新确定所包含任何子窗口的布局。

    如果应用程序没有全屏窗口,它收不到 WM_SIZE 通知。相反,它应在 wParam 参数设置为 SETTINGCHANGE_RESET 时监听 WM_SETTINGCHANGE消息。

    注意: 如果应用程序有顶层窗口,或使用 SHHandleWMSettingChangeSHInitDialog SHFullScreen 方法创建了窗口,它会同时收到 WM_SIZE WM_SETTINGCHANGE 消息。但是,如果应用程序创建了子窗口,子窗口收不到 WM_SIZE 消息,即使子窗口是全屏窗口。

    以下 WindowProc 模板的代码示例利用了 WM_SIZE WM_SETTINGCHANGE 消息。

        switch (uMessage)

        {

            case WM_SIZE:

                // 重新计算所有子窗口的布局;重新设置

                // 列出视图和编辑框的大小,重新确定按钮、

                // 静态文字和其他控件的位置。

                break;

            case WM_SETTINGCHANGE:

                if (SETTINGCHANGE_RESET == wParam) {

                    // 屏幕方向改变。此时

                    // 执行 WM_SIZE 不能执行的处理,

                    // 如重新调整全屏子窗口的大小,对

                    // 顶层窗口调用 MoveWindow 等等。

                    // 如果不需要处理 WM_SETTINGCHANGE 消息,可以

                    // 忽略它。

                }

                break;

          }

    开发识别屏幕方向的应用程序

        我们先来看下微软的“今日”设置界面。

     

    上面这两个图分别是肖像模式和风景画模式的UI布局。如果用DRA中的RelayoutDialog实现,我们起码需要两个对话框模板。代码如下

    WM_SIZE:

    DRA::RelayoutDialog(

                g_hInst,

                hDlg,

                DRA::GetDisplayMode() != DRA::Portrait ? MAKEINTRESOURCE(IDD_TODAY_WIDE) : MAKEINTRESOURCE(IDD_TODAY));

    如果要你放到方屏的机器上,你又要添加一个对话框模板。并要修改相应的代码。

    WM_SIZE:

    {

    UINT uIDDialog= IDD_TODAY_WIDE;

    Switch(DRA::GetDisplayMode())

    {

    DRA::RelayoutDialog(

              g_hInst,

              hDlg,

              DRA::GetDisplayMode() == DRA::Portrait ? MAKEINTRESOURCE(IDD_TODAY) : (DRA::GetDisplayMode() == DRA::Square? MAKEINTRESOURCE(IDD_ TODAY_SQUARE)MAKEINTRESOURCE(IDD_TODAY_WIDE));

    }

    RelayoutDialog来开发支持屏幕方向应用十分的麻烦。那么有没有通过代码实现,用一个对话框模板就可以实现的呢。

    我们可以来分析下上面的两个Layout好的对话框。可以发现右边的三个按钮上移、“下移”、“选项”都是靠右的。而最下面的CheckboxCombox。是下靠其的。然后中间留出的位置给list view来摆放。上面的对话框从肖像模式到风景画模式可以这样改变。

    向右对于控件实现如下:

    1.     记录要移动控件的位置

    2.     找出除list view,最left和最right的控件。标记为MinLeftMaxRight

    3.     计算最right的控件移动右边的位移。并保存为MoveX. MoveX =(rcClient.right - nMargin) - MaxRight.right. nMargin为边缘空白的距离,默认设置为8个像素。

    4.     保存最left控件到list控件的距离,并保存,这样保证list控件到其他控件的相对位置不变。cListMargin = MinLeft.left - rcPrimary.right;

    5.     根据计算出的MoveX,把所有控件向右移动MoveX(除list.

    6.     计算list控件的宽度。MinLeft.left - cListMargin + MoveX - rcPrimary.left

    7.     高度不变,左上顶点左边不变。用MoveWindow改变宽度。

    同样的,向下对其也是同样的道理。

    之前在网上看到过一个CScreenlib的类,是用来Layout窗体的。我在其基础上扩展了三个比较实用的接口

    static void DockControl(HWND hwndDlg, UINT nIDAffectedCtl, DockType nType = dtFill);

    static void OptimizeWidth(HWND hwndDlg, int cAffectedCtls, UINT nIDAffectedCtl, ...);

    static void OptimizeHeight(HWND hwndDlg, UINT nIDAffectedCtl);

     static void AlignControls(HWND hwndDlg, AlignType nType, int cAffectedCtls, UINT nIDFixedCtl, UINT nIDAffectedCtl, ...);

    static void MakeSameSize(HWND hwndDlg, SizeType nType, int cAffectedCtls, UINT nIDFixedCtl, UINT nIDAffectedCtl, ...);

    static void OptimizeListRight(HWND hwndDlg, UINT nIDPrimaryCtl, int cControlCount, ...);

    static void OptimizeListBottom(HWND hwndDlg, UINT nIDPrimaryCtl, int cControlCount, ...);

    static void AlignFixControls(HWND hwndDlg, AlignType nType, UINT nIDPrimaryCtl, int cControlCount, ...);

    下面来介绍下各个函数的使用方法。

    DockControl: 自动拉伸

    OptimizeWidth: 自动把控件拉伸到右边

    OptimizeHeight:把控件拉伸到底部

    AlignControls:其他控件根据nIDFixedCtl的位置向左、向右、向下、向上对其。

    MakeSameSize:使其他跟nIDFixedCtl一样大小

    关于上面这几个函数的使用,见MSDN视频

    http://www.microsoft.com/downloads/details.aspx?FamilyID=a908dd7f-71c0-4cea-b97d-b9ffe985f903&displaylang=en

    下面介绍下

    OptimizeListRightOptimizeListBottomAlignFixControls

    OptimizeListRight把一组控件和list控件向右靠其

    我们在VS2005layout一个如下对话框。

    OptimizeListRight来对其到右边。nIDPrimaryCtl为列表控件,cControlCount为其他控件个数。在WM_SIZE中添加

    CScreenLib::OptimizeListRight(hDlg, IDC_LIST, 2, IDC_SEND, IDC_DELETE);

     

      

    这样实现了控件的又靠其。但是发现下面两个按钮没显示出来。我们使用OptimizeListBottom来进行按钮的下对其。

    WM_SIZE中添加

    CScreenLib::OptimizeListRight(hDlg, IDC_LIST, 2, IDC_SEND, IDC_DELETE);

    CScreenLib::OptimizeListBottom(hDlg, IDC_LIST, 3, IDC_CHECK,  IDC_LEFT, IDC_RIGHT);

    运行结果如下:

      

    这样图标已经下对其了。但是向右按钮没有和删除按钮右对其。接口AlignFixControls

    把一组控件对其到某个控件,nIDPrimaryCtl为目标控件。这组控件间的相对位置不变,如果是向右对其,则把这组控件最右的控件对其到目标控件,然后移动其他控件,并保持这组控件相对位置不变。

    WM_SIZE中添加

    CScreenLib::OptimizeListRight(hDlg, IDC_LIST, 2, IDC_SEND, IDC_DELETE);

    CScreenLib::OptimizeListBottom(hDlg, IDC_LIST, 3, IDC_CHECK,  IDC_LEFT, IDC_RIGHT);

    CScreenLib::AlignFixControls(hDlg, CScreenLib::atRight,IDC_DELETE, 2,IDC_LEFT, IDC_RIGHT);

    运行效果如下:

     

    CScreenlib在

    http://download.csdn.net/source/1630242

    展开全文
  • Windows Mobile平台的应用程序开发过程中,如何处理屏幕方向改变对程序带来的影响是一个重要的问题。Allen Lee的文章《WM有约(四):处理屏幕旋转》中讲述了如何使用Mobile Client Software Factory中的...

    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所示:

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

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

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

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

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

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

    ContractedBlock.gifCode

     

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

    ContractedBlock.gifCode

     

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

    ContractedBlock.gifCode

     

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

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

    ContractedBlock.gifCode

     

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

    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



    本文转自施炯博客园博客,原文链接:http://www.cnblogs.com/dearsj001/archive/2009/02/13/1390172.html,如需转载请自行联系原作者

    展开全文
  • 一个PPC屏幕方向调整的小软件,每运行一次可以向逆时针方向旋转90度,可以在自己的工程里调用用以调整屏幕
  • lkk 开发识别屏幕方向Windows Mobile应用程序 作者:ms 来源:Microsoft 时间:2005年5月13日 21:30 阅读1266次

    lkk

    开发识别屏幕方向的Windows Mobile应用程序
     
    作者:ms   来源:Microsoft   时间:2005年5月13日 21:30   阅读1266
     

    Microsoft

    适用范围:
    Windows Mobile™ 2003 第二版软件
    基于 Windows Mobile™ 的 Pocket PC

    摘要:了解基于 Windows Mobile 的设备如何在横竖向模式下显示、该功能的后台情况、为该功能开发移动应用程序的相关信息、开发者指南中新的建议和示例。

    请从 Microsoft 下载中心下载 Crossword.msi

    引言

    Windows Mobile 2003 第二版软件为 Pocket PC 引入了新的功能,使基于 Windows Mobile 的设备可在横竖向两种模式下显示。在有些设备中,横向是默认的显示模式。此外,用户将能在使用中让屏幕在两种方向之间切换,而不必重新设置设备。

    本文提供了有关该功能的后台信息、并介绍了开发适用于横竖向屏幕的移动应用程序的相关信息。此外,还向开发者提供了新的指南(包括一些建议和示例)供参考。

     

    更改屏幕方向

    通常,屏幕方向仅在用户使用“屏幕方向”控制面板,或按下某硬件按钮来旋转屏幕时才改变。

    此外,应用程序也可通过 ChangeDisplaySettingsEx 函数以编程方式更改屏幕方向。该函数使用方法见 MSDN 中“Rotating the Content of the Screen”(旋转屏幕内容的方向)一文。例如,如果使用的应用程序只能在竖向模式下操作,则可通过编程改变屏幕方向。但是,如果屏幕方向的改变很突然,通过编程改变屏幕方向会让用户搞不清楚。应用程序应始终要求用户在旋转屏幕前确认显示模式。

    为了在竖向模式下显示,将 dmDisplayOrientation 字段中的 DEVMODE 结构设置为 DMDO_0。对于右手横向模式,使用 DMDO_270。对于左手横向模式,使用 DMDO_90。

     

    应用程序窗口如何识别屏幕方向

    屏幕方向如果改变,或当“输入面板”出现时,应用程序的所有全屏顶层窗口都要适应新的取向。

    注意:如果窗口的上、左、右坐标在工作区域边界之上或之外,该窗口被认为是全屏窗口。工作区域是标题栏下的整个屏幕区域。顶层窗口是无父窗口的窗口,即有一个 NULL 父窗口。

    如果窗口大小改变,窗口将收到 WM_SIZE 通知。WM_SIZE 消息的 lParam 参数的低位字指定了客户端区域的新宽度,高位字指定了客户端区域的新高度。应用程序应识别窗口大小的改变,并相应地更新窗口布局。此外,也应重新确定所包含任何子窗口的布局。

    如果应用程序没有全屏窗口,它收不到 WM_SIZE 通知。相反,它应在 wParam 参数设置为 SETTINGCHANGE_RESET 时监听 WM_SETTINGCHANGE消息。

    注意: 如果应用程序有顶层窗口,或使用 SHHandleWMSettingChangeSHInitDialogSHFullScreen 方法创建了窗口,它会同时收到 WM_SIZEWM_SETTINGCHANGE 消息。但是,如果应用程序创建了子窗口,子窗口收不到 WM_SIZE 消息,即使子窗口是全屏窗口。

    以下 WindowProc 模板的代码示例利用了 WM_SIZEWM_SETTINGCHANGE 消息。

        switch (uMessage)
        {
            case WM_SIZE:
                // 重新计算所有子窗口的布局;重新设置
                // 列出视图和编辑框的大小,重新确定按钮、
                // 静态文字和其他控件的位置。
                break;
            case WM_SETTINGCHANGE:
                if (SETTINGCHANGE_RESET == wParam) {
                    // 屏幕方向改变。此时
                    // 执行 WM_SIZE 不能执行的处理,
                    // 如重新调整全屏子窗口的大小,对 
                    // 顶层窗口调用 MoveWindow 等等。 
                    // 如果不需要处理 WM_SETTINGCHANGE 消息,可以
                    // 忽略它。
                }
                break;
          }
    
     

    刷新屏幕内容

    使用 Windows Mobile 2003 第二版软件时,Pocket PC 的最小显示区域是 240 个像素高和 240 个像素宽。编程人员应保证应用程序在最低配置下可用。常见问题是,菜单在竖向显示模式下可能符合要求,但在横向显示模式不符合要求。如果这样,需要在两个菜单之间重新排列菜单项。

    刷新应用程序的屏幕内容时,可以使用下列 4 个编程选项:

    调整内容适应窗口大小

    更改内容

    更改布局

    设计所有布局通用的 240x240 正方形。

    1 显示了各方法(调整内容适应窗口大小有两个示例)在 Pocket PC 的 Windows Mobile 软件中刷新屏幕内容的示例:

    表 1:竖向图与横向图的屏幕刷新选项
    屏幕刷新选项 竖向 横向

    调整内容适应窗口大小

    重新调整日历网格单元的大小以适用工作区域。

    screen_orientation_awareness01

    screen_orientation_awareness02

    调整内容适应窗口大小

    “内存”设置控制面板将列表框重新设置为最大尺寸,然后重新确定它四周所有界面元素的位置。

    screen_orientation_awareness03

    screen_orientation_awareness04

    更改内容。

    “日历”在横向显示模式下一次只显示 8 个月份。

    screen_orientation_awareness05

    screen_orientation_awareness06

    更改布局。

    在横向显示模式下,Windows Media Player 的按钮出现在视频内容的一侧,不是在下端。

    screen_orientation_awareness07

    screen_orientation_awareness08

    设计正方形。

    日历“选项”对话框的整个内容在两种取向模式下都显示在 240x240 的正方形区域内。

    screen_orientation_awareness09

    screen_orientation_awareness10

    请记住,要尽可能的设计通用布局,这样应用程序可处理任意尺寸和任何宽高比的显示内容。这意味着尽可能避免分开设计横竖向模式。如果必须设计不同的横竖向布局模式,不要简单地因屏幕宽度大于屏幕高度,而假设应用程序能在横向模式下显示。例如,设备屏幕宽可能有 321 个像素,而屏幕高有 320 个像素。在这样的设备上,应用程序也许能以横竖向两种模式显示,应选择应用程序最适用或首选的模式,这可能是竖向模式。

     

    RelayoutDialog

    在 CrosswordSample 应用程序中,有一个函数是 RelayoutDialog,它可帮助重新设置、重新定位对话框中的子控件。例如,假设对话框有两个对话模板,一个用于横向,一个用于竖向。如果这两个模板中的控件相同,且有相同的控件 ID,则可使用下列代码作为 WM_SIZE 处理程序:

    case WM_SIZE:
    RelayoutDialog(g_hInst, hDlg, InWideMode() ?
             MAKEINTRESOURCE(IDD_TOOLS_OPTIONS_1_WIDE) :
    MAKEINTRESOURCE(IDD_TOOLS_OPTIONS_1));
    

    注意: 定义为 IDC_STATIC 的控件具有相同的控件 ID,所以如果有多个 IDC_STATIC控件,应当把它们重命名为 IDC_STATIC_1IDC_STATIC_2等。

    如果静态控件在新布局中也发生了变换,RelayoutDialog 会同时更新静态控件的文本和位图。

     

    原有应用程序的特性

    当用户在基于 Windows Mobile 2003 第二版的 Pocket PC 上运行旧应用程序时,用户还保留了以往在竖向模式下的经验,但竖向模式与横向模式的经验将有所不同。在横向模式下,对话框的下半部分可能跑出屏幕底线之外。为了解决这个问题,系统将显示一个垂直滚动条,允许用户滚动屏幕。只有存在常出现于竖向屏幕底部的控件时,才出现垂直滚动条。如果不出现,则不出现滚动条。

    应用程序是否是“原有”应用程序,取决于可执行文件头中的子系统版本。默认情况下,使用 Windows Mobile 2003 SDK 编译的应用程序中的子系统版本号为 4.20 或更低版本号,在将来版本的 Pocket PC SDK 中子系统版本号为 4.21 或更高版本号。子系统版本号为 4.20 或低于 4.20 时被认为是旧应用程序,可以看见滚动条。

    知道了这种特性,用户就能通过滚动条看见隐藏的图像(假设不能直接看见的图像和控件)。此外,您仍可以使用这种技术快速存储或检索图像,但应在屏幕的左侧完成这项工作。

    理想情况下,对话框不应需要滚动条。为此,最好的方法是:使对话框控件在竖向模式下不被“输入面板”覆盖,故最好设计 240x240 的最低分辨率。

     

    安装警告消息

    当在基于 Windows Mobile 的可旋转屏幕的 Pocket PC 上安装了旧应用程序时,将出现以下消息,如 11 所示:

    screen_orientation_awareness11

    11:安装警告消息

    这个对话告诉用户,他们要使用的应用程序程序可能无法识别正方形屏幕旋转,因此不能在横向模式下正确显示。只有 VersionMin 值(它指定应用程序支持的最低操作系统版本号)低于 4.21,才显示这个对话。

    由于将 VersionMin 设置为 4.21 将阻止把应用程序安装在基于旧 Windows Mobile 的 Pocket PC 上,所以建议把BuildMax 值(不常用)设置为表 2 中的值,禁用此消息:

    表 2:BuildMax 值

    0xA0000000

    应用程序支持正方形屏幕(240x240 像素)。

    0xC0000000

    应用程序支持屏幕旋转。

    0xE0000000

    应用程序支持正方形屏幕旋转。

    这些参数可通过编辑 INF 文件的 [CEDevice] 部分(cabwiz 用来生成 CAB 文件)来更改。有关 INF 文件格式的详细信息,请参阅 MSDN 文档。

     

    结论

    开发基于 Windows Mobile 2003 第二版软件的 Pocket PC 的应用程序,要求取消关于屏幕方向的假设。使用本文提供的简单指南,您可以编写安装和运行于竖向、横向和正方形屏幕上的应用程序。

    展开全文
  • 屏幕方向调节只需要通过Activity.getRequestOrientation()方法和Activity.setRequestOrientation()方法即可。实例说明:两个按钮,可以横向和纵向调节屏幕。MainActivity.java代码:public class MainActivity ...
  • 桌面空白右键 >> 图形选项 >> 快捷键 >> 设置为禁用
  • 屏幕方向 示例1、UI 设计概述UI/Summary.xaml <Page x:Class="Windows10.UI.Summary" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://sc...
  •  在Windows Mobile平台的应用程序开发过程中,如何处理屏幕方向改变对程序带来的影响是一个重要的问题。Allen Lee的文章《WM有约(四):处理屏幕旋转》中讲述了如何使用Mobile Client Software Factory中的...
  • WP7屏幕方向笔记

    2012-03-27 20:32:44
    更改页面布局可以调整控件的水平,垂直单面距离在转动屏幕的时候还是会根据对应单面垂直的距离来决定位置,例如对上距离是10,对左距离是20,则在转换屏的时候优先考虑上下的距离。 Button.verticalAlignment = ...
  • 默认是左右显示的,设置成相反方向 鼠标左键拖动第二屏幕到第一屏幕的上边。保存即可。即可以从第一屏幕的上方进入第二屏幕
  • 一、强制设置方向 1.Activity 如果要强制设置一个Activity的横竖屏可以通过Manifest去设置,跟Activity相关的信息都会保存在ActivityInfo当中。 android:screenOrientation=["unspecified" | "user" | "behind" |...
  • 发布日期 : 8/17/2004 | 更新日期 : 8/17/2004Microsoft适用范围:Windows Mobile™ 2003 第二版软件基于 Windows Mobile™ 的 Pocket PC摘要:了解基于 Windows Mobile 的设备如何在横竖向模式下显示、该功能的后台...
  • 开发识别屏幕方向的应用程序

    千次阅读 2014-10-28 17:25:48
    Windows Mobile™ 2003 第二版软件 基于 Windows Mobile™ 的 Pocket PC 摘要:了解基于 Windows Mobile 的设备如何在横竖向模式下显示、该功能的后台情况、为该功能开发移动应用程序的相关信息、开发者指南中新...
  • 用过mac之后,感觉mac的鼠标滚轮方向更舒适一些,为了统一一下,win 和 mac 于的... 自然方向屏幕移动方向同手指移动方向一致,标准方向则相反 。 那么只要把win里的方向调反一下就和mac是一样的了。 在网上找...
  • Windows 7下并非没有旋转屏幕的快捷键,通常所说的ctrl+alt+方向键进行旋转的快捷键其实只是Intel显卡旋转显示输出的快捷键,只要是Intel显卡,无论是集成还是独立显卡,都可以用ctrl+alt+向上:正常显示、 ctrl+alt...
  • 解决方法:使用窗口移动精灵或AltDrag这两款窗口移动工具,摆脱只能拖动标题栏移动窗口的限制,任意移动超出屏幕的窗口,将窗口或对话框移动到顶部后,仍可继续向上拖动,使窗口顶部移动到屏幕之外,底部就会显示...
  • 在IDEA中,回到上个点的快捷键是Ctrl+Alt+左方向键,因为系统占用了这个快捷键,只要使用,就是屏幕旋转。我去,难受香菇啊。 忍了两天后,决定找方法。借鉴了...
  •  默认情况下,Windows Phone应用程序在竖屏模式(垂直方向)下运行,当手机改变方向时我们的应用程序也应该能够根据方向的改变做出相应的布局调整。运行之前创建的HelloWindowsPhone项目程序,改变模拟器中屏幕的的...
  • 一)方法一:先用alt+tab激活当前窗口 > alt+space会调出窗口控制菜单 > 此时按一下m键(表示...二)方法二:用windows自带的快捷键,在选中窗口后,win+左右上下的方向键,可以控制窗口左贴,右贴,最大化和最小化 ...
  • Windows mobile应用程序自适应屏幕大小

    千次阅读 2009-04-08 17:10:00
    另一个办法就是让程序根据屏幕的大小的变化来调整布局。这些代码是我从网上找到的,然后再做一些修改。先说头文件: //CtrlAdapt.h typedef struct{ int iId; // 控件ID int iFlag; // 标志,表示怎样改变...
  •  默认情况下,Windows Phone应用程序在竖屏模式(垂直方向)下运行,当手机改变方向时我们的应用程序也应该能够根据方向的改变做出相应的布局调整。运行之前创建的HelloWindowsPhone项目程序,改变模拟器中屏幕的的...
  • 这两种方向Windows Phone 7中都支持,但默认情况下,Silverlight程序以纵向开始,XNA程序以横向开始(游戏通常在宽屏下表现会更好)。本篇文章中,我们只讨论Silverlight程序,以及方向改变后如何去做,因为在用户...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,244
精华内容 11,697
关键字:

windows调整屏幕方向