Программирование КПК и смартфонов на .NET Compact Framework — страница 35 из 41

Fields
, в котором хранится значение
DisplayQueryOrientation
. Этот флаг отвечает за поддержку смены ориентации экрана и передает значение в поле
lpDevMode.dmDisplayOrientation
. Например, значение
DMO_0
говорит о том, что поворот экрана не поддерживается.

В листинге 13.5 приведен код, который проверяет, поддерживается ли системой изменение ориентации, и в случае положительного ответа поворачивает экран на 90°.

Листинг 13.5

// Флаг, определяющий поддержку поворота экрана

private static Int32 DisplayQueryOrientation = 0x01000000;


private static Int32 CDS_TEST = 2;


// запоминаем настройки экрана

ScreenOrientation initialOrientation = SystemSettings.ScreenOrientation;

[DllImport("coredll.dll", SetLastError = true)]

private extern static Int32 ChangeDisplaySettingsEx(

 String deviceName, ref DeviceMode deviceMode, IntPtr hwnd,

 Int32 flags, IntPtr param);


struct DeviceMode {

 [MarshalAs(UnmanagedType.ByValTStr, SizeConst - 32)]

 public String DeviceName;

 public Int16 SpecVersion;

 public Int16 DriverVersion;

 public Int16 Size;

 public Int16 DriverExtra;

 public Int32 Fields;

 public Int16 Orientation;

 public Int16 PaperSize;

 public Int16 PaperLength;

 public Int16 PaperWidth;

 public Int16 Scale;

 public Int16 Copies;

 public Int16 DefaultSource;

 public Int16 PrintQuality;

 public Int16 Color;

 public Int16 Duplex;

 public Int16 Yresolution;

 public Int16 TTOption;

 public Int16 Collate;

 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]

 public String FormName;

 public Int16 LogPixels;

 public Int32 BitsPerPel;

 public Int32 PelsWidth;

 public Int32 PelsHeight;

 public Int32 DisplayFlags;

 public Int32 DisplayFrequency;

 public Int32 DisplayOrientation;

}


private void butCheckRotate_Click(object sender, EventArgs e) {

 // подготавливаем структуру DeviceMode

 DeviceMode devMode = new DeviceMode();

 devMode.Size = (Int16)Marshal.SizeOf(devMode);

 devMode.Fields = DisplayQueryOrientation;

 // Проверяем, поддерживает ли система поворот экрана

 Int32 result =

  ChangeDisplaySettingsEx(null, ref devMode, IntPtr.Zero, CDS_TEST,

   IntPtr.Zero);

 if (result == 0) {

  // Если вызов функции прошел успешно.

  // то проверяем поддержку поворота экрана

  // Если параметр DisplayOrientation имеет ненулевое

  // значение то поворот экрана возможен

  if (devMode.DisplayOrientation != 0) {

   MessageBox.Show("Поворот экрана поддерживается");

  }

 } else {

  MessageBox.Show("Поворот экрана не поддерживается");

 }

}


private void butRot90_Click(object sender, EventArgs e) {

 SystemSettings.ScreenOrientation = ScreenOrientation.Angle90;

}


private void butRestore_Click(object sender, EventArgs e) {

 if (SystemSettings.ScreenOrientation != initialOrientation) {

  try {

   SystemSettings.ScreenOrientation = initialOrientation;

  } catch (Exception) {

   // Unable to change the orientation back

   // to the original configuration.

   MessageBox.Show("This sample was unable to set the " +

    "orientation back to the original state.");

  }

 }

}

Прячем кнопку Start

Функция

SHFullScreen
позволяет прятать и показывать кнопку Start и пиктограмму виртуальной клавиатуры SIP. Соответствующий код приведен в листинге 13.6.

Листинг 13.6

/// 

/// Функция используется для изменения вида экрана.

/// Вы можете модифицировать панель задач, панель ввода, значок

/// Пуск

/// 

/// Дескриптор окна

/// Определяет состояние окна

/// B успешном случае возвращается True, иначе -

/// False

[DllImport("aygshell.dll")]

static extern uint SHFullScreen(IntPtr hwndRequester, uint dwState);


const uint SHFS_SHOWTASKBAR = 0x0001;

const uint SHFS_HIDETASKBAR = 0x0002;

const uint SHFS_SHOWSIPBUTTON = 0x0004;

const uint SHFS_HIDESIPBUTTON = 0x0008;

const uint SHFS_SHOWSTARTICON = 0x0010;

const uint SHFS_HIDESTARTICON = 0x0020;


private void butHideStart_Click(object sender, EventArgs e) {

 IntPtr hwnd = this.Handle;

 //прячем кнопку Start

 SHFullScreen(hwnd, SHFS_HIDESTARTICON);

 //прячем SIP

 //SHFullScreen(hwnd, SHFS_HIDESIPBUTTON);

}


private void butShowStart_Click(object sender, EventArgs e) {

 //показываем кнопку Start

 IntPtr hwnd = this.Handle;

 SHFullScreen(hwnd, SHFS_SHOWSTARTICON);

 //показываем SIP

 //SHFullScreen(hwnd, SHFS_SHOWSIPBUTTON);

}

В примере показано, как прятать кнопку

Start
. Если нужно спрятать пиктограмму SIP, то надо убрать комментарии при втором вызове функции. На рис. 13.1 показан внешний вид экрана со спрятанной кнопкой
Start
.

Рис. 13.1. Скрытие кнопки Start

Панель задач

Очень часто программисты в качестве шутки создают программы, которые прячут привычные для пользователя элементы интерфейса. В предыдущем примере было показано, как можно скрыть кнопку

Start
. Теперь нужно рассмотреть пример работы с панелью задач.

Для создания тестового приложения на форме надо разместить две кнопки. Одна из них будет скрывать панель задач, а вторая — показывать ее. Соответствующий код приведен в листинге 13.7.

Листинг 13.7

/// 

/// Скрывает одно окно и активирует другое

/// 

private const int SW_HIDE = 0;


/// 

/// Активирует окно