旋转屏幕
此示例展示以下控件的使用方法:
示例代码展示:
打开重力感应设备,获得转屏消息:
//打开重力感应设备 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;