旋转屏幕示例(16_RotateScreen)

旋转屏幕

此示例展示以下控件的使用方法:

示例代码展示:

16_RotateScreen1.png
16_RotateScreen2.png

打开重力感应设备,获得转屏消息:

  //打开重力感应设备
  MzAccOpen();

  //获得重力感应改变的消息
  m_accMsg = MzAccGetMessage();

处理转屏消息,使屏幕旋转

  LRESULT MzDefWndProc(UINT message, WPARAM wParam, LPARAM lParam)
  {
    switch(message)
    {
    default:
      {
        if (message == m_accMsg)
        {
            // 转屏
          switch(wParam)
          {
          case SCREEN_PORTRAIT_P:
            {
                MzChangeDisplaySettingsEx(DMDO_90);
            }
            break;
          case SCREEN_PORTRAIT_N:
            {
                MzChangeDisplaySettingsEx(DMDO_270);
            }
            break;
          case SCREEN_LANDSCAPE_N:
            {
                MzChangeDisplaySettingsEx(DMDO_180);
            }
            break;
          case SCREEN_LANDSCAPE_P:
            {
                MzChangeDisplaySettingsEx(DMDO_0);
            }
            break;
          }
        }
        
      }
      break;
    }
      return CMzWndEx::MzDefWndProc(message,wParam,lParam);
  }

旋转屏幕后,将屏幕内控件的位置也做相应的调整:

  // 转屏后如果需要调整窗口的位置,重载此函数响应 WM_SETTINGCHANGE 消息
  virtual void OnSettingChange(DWORD wFlag, LPCTSTR pszSectionName)
  {
      //设置新的屏幕方向的窗口大小及控件位置
      DEVMODE  devMode;
      memset(&devMode, 0, sizeof(DEVMODE));
      devMode.dmSize = sizeof(DEVMODE);
      devMode.dmFields = DM_DISPLAYORIENTATION;
      ChangeDisplaySettingsEx(NULL, &devMode, NULL, CDS_TEST, NULL);

      //当转为竖屏时更改窗口、单行编辑器和ToolbarText的位置大小
      if (devMode.dmDisplayOrientation == DMDO_90 || devMode.dmDisplayOrientation == DMDO_270)
      {
          RECT rc = MzGetWorkArea();
          SetWindowPos(m_hWnd, rc.left, rc.top, RECT_WIDTH(rc), RECT_HEIGHT(rc));

          m_ToolbarText.SetTextBarType(ICON_TOOLBAR_TYPE_480);

          m_ToolbarText.SetPos(0, GetHeight()-MZM_HEIGHT_TEXT_TOOLBAR, GetWidth(), MZM_HEIGHT_TEXT_TOOLBAR);  

          m_Edit.SetPos(MZM_MARGIN_MAX, MZM_MARGIN_MAX, GetWidth()-MZM_MARGIN_MAX*2, 70);
      }

      //当转为横屏时更改窗口、单行编辑器和ToolbarText的位置大小
      if (devMode.dmDisplayOrientation == DMDO_180 || devMode.dmDisplayOrientation == DMDO_0)
      {
          RECT rc = MzGetWorkArea();
          SetWindowPos(m_hWnd, rc.left, rc.top, RECT_WIDTH(rc), RECT_HEIGHT(rc));

          m_ToolbarText.SetTextBarType(TEXT_TOOLBAR_TYPE_720);

          m_ToolbarText.SetPos(0, GetHeight()-MZM_HEIGHT_TEXT_TOOLBAR_w720, GetWidth(), MZM_HEIGHT_TEXT_TOOLBAR_w720);

          m_Edit.SetPos(MZM_MARGIN_MAX, MZM_MARGIN_MAX, GetWidth()-MZM_MARGIN_MAX*2, 70);
      }
  }

完整示例:

/************************************************************************/
/*
* Copyright (C) Meizu Technology Corporation Zhuhai China
* All rights reserved.
* 中国珠海, 魅族科技有限公司, 版权所有.
*
* This file is a part of the Meizu Foundation Classes library.
* Author:    ZYK
* Create on: 2009-06-03
*/
/************************************************************************/

//请按照以步骤运行此实例代码:
//首先, 打开VS2005/2008创建一个Win 32智能设备项目
//在项目向导中选择M8SDK, 并勾选空项目
//然后,在项目中新建一个cpp文件,将此处代码拷贝到cpp文件中
//最后,按照M8SDK的帮助文档,配置项目属性
//现在,可以运行此程序了

//包含MZFC库的头文件
#include <mzfc_inc.h>

#include <acc_api.h>
#include <ShellNotifyMsg.h>

//此代码演示了:
//  创建和初始化应用程序
//  创建和初始化窗体
//  按钮控件的使用及其命令消息的处理
//  单行文本编辑器
//  文字按钮工具条
//  响应屏幕旋转的消息以及处理旋转后ToolBarText的位置

#define MZ_IDC_TOOLBAR1  101

#define IDC_PPM_OK    102
#define IDC_PPM_CANCEL  103

#define MZ_IDC_EDIT  104

// 从 CMzWndEx 派生的主窗口类
class CSample1MainWnd: public CMzWndEx
{
  MZ_DECLARE_DYNAMIC(CSample1MainWnd);
public:
   
  // 文字按钮工具条
  UiToolbar_Text m_ToolbarText;

  // 单行编辑器
  UiSingleLineEdit m_Edit;

  DWORD m_accMsg;
protected:
  // 窗口的初始化
  virtual BOOL OnInitDialog()
  {
    // 必须先调用基类的初始化
    if (!CMzWndEx::OnInitDialog())
    {
      return FALSE;
    }
  
    //打开重力感应设备
    MzAccOpen();

    //获得重力感应改变的消息
    m_accMsg = MzAccGetMessage();

    // 初始化单行编辑控件,并添加到窗口中
    m_Edit.SetPos(MZM_MARGIN_MAX, MZM_MARGIN_MAX, GetWidth()-MZM_MARGIN_MAX*2, 70);
    m_Edit.SetTip(L"Please enter text...");  // set the tips text
    m_Edit.SetTextColor(RGB(255,0,0)); // you could also set the color of text
    AddUiWin(&m_Edit); // don't forget to add the control to the window
    
    // 初始化文字工具条,并添加到窗口中
    m_ToolbarText.SetPos(0,GetHeight()-MZM_HEIGHT_TEXT_TOOLBAR,GetWidth(),MZM_HEIGHT_TEXT_TOOLBAR);
    m_ToolbarText.SetButton(0, true, true, L"Exit");
    m_ToolbarText.SetButton(1, true, true, L"Menu");
    m_ToolbarText.SetButton(2, true, true, L"OK");
    m_ToolbarText.SetID(MZ_IDC_TOOLBAR1);
    AddUiWin(&m_ToolbarText);

    return TRUE;
  }

  // 重载命令消息的处理函数
  virtual void OnMzCommand(WPARAM wParam, LPARAM lParam)
  {
    UINT_PTR id = LOWORD(wParam);
    switch(id)
    {
    case MZ_IDC_TOOLBAR1:
      {
        int nIndex = lParam;
        if (nIndex==0)
        {
          MzChangeDisplaySettingsEx(DMDO_90);
          PostQuitMessage(0);
          return;
        }
        if (nIndex==1)
        {
          // 弹出菜单
          CPopupMenu ppm;
          struct PopupMenuItemProp pmip;      

          pmip.itemCr = MZC_BUTTON_PELLUCID;
          pmip.itemRetID = IDC_PPM_CANCEL;
          pmip.str = L"Cancel";
          ppm.AddItem(pmip);

          pmip.itemCr = MZC_BUTTON_ORANGE;
          pmip.itemRetID = IDC_PPM_OK;
          pmip.str = L"OK";
          ppm.AddItem(pmip);  

          RECT rc = MzGetWorkArea();      
          rc.top = rc.bottom - ppm.GetHeight();
          ppm.Create(rc.left,rc.top,RECT_WIDTH(rc),RECT_HEIGHT(rc),m_hWnd,0,WS_POPUP);      
          int nID = ppm.DoModal();
          if (nID==IDC_PPM_OK)
          {
  
          }
          if (nID==IDC_PPM_CANCEL)
          {
      
          }
          return;
        }
        if (nIndex==2)
        {

          return;
        }
      }
      break;
    }
  }

  LRESULT MzDefWndProc(UINT message, WPARAM wParam, LPARAM lParam)
  {
    switch(message)
    {
    default:
      {
        if (message == m_accMsg)
        {
            // 转屏
          switch(wParam)
          {
          case SCREEN_PORTRAIT_P:
            {
                MzChangeDisplaySettingsEx(DMDO_90);
            }
            break;
          case SCREEN_PORTRAIT_N:
            {
                MzChangeDisplaySettingsEx(DMDO_270);
            }
            break;
          case SCREEN_LANDSCAPE_N:
            {
                MzChangeDisplaySettingsEx(DMDO_180);
            }
            break;
          case SCREEN_LANDSCAPE_P:
            {
                MzChangeDisplaySettingsEx(DMDO_0);
            }
            break;
          }
        }
        
      }
      break;
    }
      return CMzWndEx::MzDefWndProc(message,wParam,lParam);
  }

  // 转屏后如果需要调整窗口的位置,重载此函数响应 WM_SETTINGCHANGE 消息
  virtual void OnSettingChange(DWORD wFlag, LPCTSTR pszSectionName)
  {
      //设置新的屏幕方向的窗口大小及控件位置
      DEVMODE  devMode;
      memset(&devMode, 0, sizeof(DEVMODE));
      devMode.dmSize = sizeof(DEVMODE);
      devMode.dmFields = DM_DISPLAYORIENTATION;
      ChangeDisplaySettingsEx(NULL, &devMode, NULL, CDS_TEST, NULL);

      //当转为竖屏时更改窗口、单行编辑器和ToolbarText的位置大小
      if (devMode.dmDisplayOrientation == DMDO_90 || devMode.dmDisplayOrientation == DMDO_270)
      {
          RECT rc = MzGetWorkArea();
          SetWindowPos(m_hWnd, rc.left, rc.top, RECT_WIDTH(rc), RECT_HEIGHT(rc));

          m_ToolbarText.SetTextBarType(ICON_TOOLBAR_TYPE_480);

          m_ToolbarText.SetPos(0, GetHeight()-MZM_HEIGHT_TEXT_TOOLBAR, GetWidth(), MZM_HEIGHT_TEXT_TOOLBAR);  

          m_Edit.SetPos(MZM_MARGIN_MAX, MZM_MARGIN_MAX, GetWidth()-MZM_MARGIN_MAX*2, 70);
      }

      //当转为横屏时更改窗口、单行编辑器和ToolbarText的位置大小
      if (devMode.dmDisplayOrientation == DMDO_180 || devMode.dmDisplayOrientation == DMDO_0)
      {
          RECT rc = MzGetWorkArea();
          SetWindowPos(m_hWnd, rc.left, rc.top, RECT_WIDTH(rc), RECT_HEIGHT(rc));

          m_ToolbarText.SetTextBarType(TEXT_TOOLBAR_TYPE_720);

          m_ToolbarText.SetPos(0, GetHeight()-MZM_HEIGHT_TEXT_TOOLBAR_w720, GetWidth(), MZM_HEIGHT_TEXT_TOOLBAR_w720);

          m_Edit.SetPos(MZM_MARGIN_MAX, MZM_MARGIN_MAX, GetWidth()-MZM_MARGIN_MAX*2, 70);
      }
  }

};

MZ_IMPLEMENT_DYNAMIC(CSample1MainWnd)

// 从 CMzApp 派生的应用程序类
class CSample1App: public CMzApp
{
public:
  // 应用程序的主窗口
  CSample1MainWnd m_MainWnd;

  // 应用程序的初始化
  virtual BOOL Init()
  {
    // 初始化 COM 组件
    CoInitializeEx(0, COINIT_MULTITHREADED);

    // 创建主窗口
    RECT rcWork = MzGetWorkArea();
    m_MainWnd.Create(rcWork.left, rcWork.top, RECT_WIDTH(rcWork), RECT_HEIGHT(rcWork), 0, 0, 0);
    m_MainWnd.Show();

    // 成功则返回TRUE
    return TRUE;
  }
};

// 全局的应用程序对象
CSample1App theApp;


Generated at Tue Feb 9 15:09:54 2010 for Meizu M8 SDK Documentation by  doxygen 1.6.1