Стартовая панель отображается в развернутом виде (Pocket PC 2003) - PullRequest
1 голос
/ 12 апреля 2011

Окружающая среда

  • Windows XP SP3 x32
  • Visual Studio 2005 Standard
  • Windows Mobile / Pocket PC 2003
  • .NET Compact Framework 1.0 SP3 и .NET Framework 1.1
  • Honeywell Dolphin 9500 Ручной сканер штрих-кода

Цель

У меня есть приложение из трех форм и внешний класс (Program.cs), который имеет точку входа в приложение, Main(). Сначала загружается основная форма, а затем из MainForm_Load(...) создает / показывает новую форму, похожую на заставку. Я хочу, чтобы все три формы были максимальными. Все три формы имеют следующие свойства:

  • this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
  • this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
  • this.ControlBox = false;

Проблема

Форма "заставки" отображается в полноэкранном режиме без каких-либо проблем. Затем я избавляюсь от него и показываю главный экран (сначала загрузить и параметр для Application.Run();. На главном экране, как только обнаруживается событие списка SelectedIndexChanged, отображается третья форма (оставляя основную форму позади упомянутой третьей формы). Эта третья форма показывает панель задач над верхней частью моей формы: image here После закрытия этой формы основная форма теперь также накладывается на панель задач.

Код

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

Несвязанные предложения

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 13 апреля 2011

Во-первых, в настоящее время я использую только Windows Mobile 5 (WM5).(Мне пришлось перейти от PocketPC 2003 пару лет назад. LOL)

Я обнаружил, что определение размера окна формы не очень хорошо работает на мобильных устройствах, а показ / скрытие нескольких форм неудобнои никогда не ведет себя так, как вы хотите.

Тем не менее, убедитесь, что в вашей главной форме WindowState установлено значение Максимально .

Я также установил ControlBox и MinimizeBox до Ложь , если это поможет.

Вместо использования нескольких форм будет гораздо приятнее, если вы просто будете использовать Панели в качестве форм с Основной формой как своего рода контейнер MDI(плохой выбор слов, но это то, что я делаю).

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

  • Для работы с каждой панелью выберите ее в конструкторе Visual Studio , и вы увидите поле положения (стрелки вверх и вниз, влево и вправо).
  • Щелкните правой кнопкой мыши поле положения и выберите Перевести на передний план .
  • Теперь перейдите в Свойства панели управления и установите Dock на Заполнить .
  • Пока эта панель работает в полноэкранном режиме, добавьте все свои кнопки, текстовые поля и т. Д.с соответствующими именами.Имена, такие как pnl1_button1 и pnl2_button1, легче понять в вашем коде, чем значения по умолчанию VS button1 и button2.
  • Когда вы закончите с представлением этой панели, вернитесь кDock свойств и установите его на Нет .
  • Перейдите к следующему элементу управления панели.

Я обнаружил, что это также помогает поддерживать небольшойэскиз ваших панелей с их именами и именами элементов управления.

В событии Load вашей основной формы установите для каждого свойства Panel Dock значение DockStyle.Fill .Затем, если вы хотите показать одну форму, просто позвоните Panel1.BringToFront() вместо dialog.Show().

Разработка для мобильных устройств не сложна, но отличается.:)

РЕДАКТИРОВАТЬ:

В файле проекта Program.cs я храню следующие статические инструменты, которые я могу использовать для включения иВЫКЛЮЧИТЕ меню Пуск (не очень хорошо работает в WM5, но я все еще получил его в своем коде из моей версии PocketPC).

Мне не нужно было открывать этот проект в течение года или около того,но все должно быть в силе.Дай им попробовать.Если я что-то пропустил, просто дайте мне знать.

Как только это будет вставлено в файл Program.cs вашего проекта, просто вызовите Program.ShowWindowsMenu(false);, когда ваша программа запустится, и Program.ShowWindowsMenu(true);когда ваша программа завершает работу.

static IntPtr _taskBar;
static IntPtr _sipButton;

public enum Notify_Events {
  NOTIFICATION_EVENT_NONE = 0,
  NOTIFICATION_EVENT_TIME_CHANGE = 1,
  NOTIFICATION_EVENT_SYNC_END = 2,
  NOTIFICATION_EVENT_DEVICE_CHANGE = 7,
  NOTIFICATION_EVENT_RS232_DETECTED = 9,
  NOTIFICATION_EVENT_RESTORE_END = 10,
  NOTIFICATION_EVENT_WAKEUP = 11,
  NOTIFICATION_EVENT_TZ_CHANGE = 12,
  NOTIFICATION_EVENT_OFF_AC_POWER,
  NOTIFICATION_EVENT_ON_AC_POWER
}

public enum WindowPosition {
  SWP_HIDEWINDOW = 0x0080,
  SWP_SHOWWINDOW = 0x0040
}

[DllImport("coredll.dll", EntryPoint = "FindWindowW", SetLastError = true)]
public static extern IntPtr FindWindowCE(string lpClassName, string lpWindowName);

[DllImport("coredll.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);

static void ShowWindowsMenu(bool enable) {
  try {
    if (enable) {
      if (_taskBar != IntPtr.Zero) {
        SetWindowPos(_taskBar, IntPtr.Zero, 0, 0, 240, 26, (int)WindowPosition.SWP_SHOWWINDOW); // display the start bar
      }
    } else {
      _taskBar = FindWindowCE("HHTaskBar", null); // Find the handle to the Start Bar
      if (_taskBar != IntPtr.Zero) { // If the handle is found then hide the start bar
        SetWindowPos(_taskBar, IntPtr.Zero, 0, 0, 0, 0, (int)WindowPosition.SWP_HIDEWINDOW); // Hide the start bar
      }
    }
  } catch (Exception err) {
    ErrorWrapper(enable ? "Show Start" : "Hide Start", err);
  }
  try {
    if (enable) {
      if (_sipButton != IntPtr.Zero) { // If the handle is found then hide the start bar
        SetWindowPos(_sipButton, IntPtr.Zero, 0, 0, 240, 26, (int)WindowPosition.SWP_SHOWWINDOW); // display the start bar
      }
    } else {
      _sipButton = FindWindowCE("MS_SIPBUTTON", "MS_SIPBUTTON");
      if (_sipButton != IntPtr.Zero) { // If the handle is found then hide the start bar
        SetWindowPos(_sipButton, IntPtr.Zero, 0, 0, 0, 0, (int)WindowPosition.SWP_HIDEWINDOW); // Hide the start bar
      }
    }
  } catch (Exception err) {
    ErrorWrapper(enable ? "Show SIP" : "Hide SIP", err);
  }
}

static void ErrorWrapper(string routine, Exception e) {
  if (!String.IsNullOrEmpty(e.Message)) {
    MessageBox.Show(e.Message, routine, MessageBoxButtons.OKCancel, MessageBoxIcon.None, 0);
  }
}

EDIT2:

Объявите частный статический экземпляр вашей главной формы, а затем оберните его в процедуру try .... catchвнутри файла Program.cs вашего проекта, например:

static Form1 ppcForm = null;

static void Main() {
  ShowWindowsMenu(false);
  try {
    ppcForm = new Form1();
    Application.Run(ppcForm );
  } catch (Exception err) {
    if (!String.IsNullOrEmpty(err.Message)) {
      ErrorWrapper("Mobile Form (Program)", err);
    }
  } finally {
    ShowWindowsMenu(true);
  }
}
1 голос
/ 12 апреля 2011

То, что вы ищете, обычно называют «режимом киоска» (что может помочь вашим результатам в поисковой системе).

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

Эта запись в блоге является действительно хорошей отправной точкой для этой проблемы и, вероятно, даст вам то, что вам нужно, но не стесняйтесь использовать поисковую систему для поиска дополнительных / альтернативных предложений. На самом деле в Интернете много материала для этого - больше, чем могло бы быть в этом ответе.

...