Start Bar Muncul Dalam Bentuk yang Dimaksimalkan (Pocket PC 2003)

Lingkungan

  • Windows XP SP3x32
  • Standar Visual Studio 2005
  • Windows Seluler/Pocket PC 2003
  • .NET Compact Framework 1.0 SP3 dan .NET Framework 1.1
  • Pemindai Kode Batang Genggam Honeywell Dolphin 9500

Sasaran

Saya memiliki aplikasi tiga formulir dan kelas eksternal (Program.cs) yang memiliki titik masuk aplikasi, Main(). Formulir utama dimuat terlebih dahulu dan kemudian, dari dalam MainForm_Load(...), membuat instance/menampilkan formulir baru seperti layar pembuka. Saya ingin ketiga bentuk itu dimaksimalkan. Ketiga formulir memiliki kumpulan properti berikut:

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

Masalah

Formulir "layar splash" muncul dalam layar penuh tanpa masalah apa pun. Saya kemudian membuangnya dan menampilkan layar utama (pertama memuat dan param untuk Application.Run();. Dari layar utama, setelah acara SelectedIndexChanged kotak daftar terdeteksi, formulir ketiga ditampilkan (meninggalkan formulir utama di belakang formulir ketiga tersebut). Formulir ketiga itu menunjukkan bilah tugas di atas bagian atas formulir saya: image here Setelah formulir ini ditutup, bilah tugas kini juga terhampar di formulir utama.

Kode

Tautan tempel teman. Beri tahu saya jika saya sebaiknya memposting kode saja di sini. WorkOrderView lebih dari seribu baris jadi saya pikir ini akan lebih mudah.

Saran yang Tidak Terkait

Saya seorang programmer yang ramah lingkungan dan saya kurang berpengalaman dalam lingkungan ini. Jadi, jika Anda mempunyai saran/kritik mengenai cara saya melakukan beberapa hal, jangan ragu untuk menyampaikannya kepada saya. Mungkin yang terbaik adalah mengomentari postingan tersebut daripada memposting jawaban untuk jenis balasan tersebut.

Terima kasih!


person Eric H    schedule 12.04.2011    source sumber


Jawaban (2)


Pertama, saya hanya menjalankan Windows Mobile 5 (WM5) hari ini. (Saya harus pindah dari PocketPC 2003 beberapa tahun yang lalu. LOL)

Saya menemukan bahwa menentukan Ukuran Jendela Formulir tidak berfungsi dengan baik pada perangkat seluler, dan menampilkan/menyembunyikan beberapa formulir adalah hal yang janggal dan tidak pernah berperilaku seperti yang Anda inginkan.

Namun, pastikan Formulir Utama Anda WindowState disetel ke Dimaksimalkan.

Saya juga menyetel ControlBox dan MinimizeBox ke False, jika itu membantu.

Daripada menggunakan banyak formulir, akan terlihat jauh lebih bagus jika Anda hanya menggunakan Panel sebagai formulir Anda dengan Formulir Utama sebagai semacam wadah MDI (pilihan kata yang buruk, tapi itulah yang saya lakukan).

Dalam Tampilan Desainer saya, setiap panel hanyalah sebuah kotak kecil yang penuh dengan kontrol.

  • Untuk bekerja dengan setiap panel, pilih panel tersebut di desainer Visual Studio, dan Anda akan melihat kotak posisi (panah atas & bawah dan kiri & kanan).
  • Klik kanan kotak posisi dan klik Bawa ke Depan.
  • Sekarang pergilah ke Properti kontrol panel dan atur Dock ke Isi.
  • Meskipun panel ini layar penuh, tambahkan semua tombol, kotak teks, dll. dengan nama yang sesuai. Nama seperti pnl1_button1 dan pnl2_button1 lebih mudah dipahami dalam kode Anda dibandingkan nama default VS button1 dan button2.
  • Ketika Anda selesai dengan tampilan desain panel ini, kembali ke properti Dock dan setel kembali ke Tidak Ada.
  • Lanjutkan ke kontrol panel berikutnya.

Menurut saya, memelihara sketsa kecil panel Anda dengan nama dan nama kontrolnya juga membantu.

Dalam peristiwa Load formulir utama Anda, tetapkan setiap properti Dock Panel ke DockStyle.Fill. Kemudian, jika Anda ingin menampilkan satu formulir, panggil saja Panel1.BringToFront(), bukan dialog.Show().

Pengembangan seluler tidaklah sulit, tetapi berbeda. :)

EDIT:

Dalam file Program.cs proyek, saya menyimpan alat statis berikut yang dapat saya gunakan untuk MENGAKTIFKAN dan MENONAKTIFKAN Menu Mulai (tidak berfungsi dengan baik di WM5, namun saya masih memilikinya dalam kode saya dari versi PocketPC saya).

Saya belum membuka proyek ini dalam satu tahun atau lebih, tetapi semuanya harus valid. Cobalah. Jika saya melewatkan sesuatu, beri tahu saya.

Setelah ini ditempelkan ke file Program.cs proyek Anda, panggil saja Program.ShowWindowsMenu(false); saat program Anda dimulai dan Program.ShowWindowsMenu(true); saat program Anda keluar.

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:

Deklarasikan instance statis pribadi dari formulir utama Anda, lalu bungkus dalam rutinitas try....catch di dalam file Program.cs proyek Anda seperti ini:

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);
  }
}
person jp2code    schedule 12.04.2011
comment
Saya telah mendefinisikan ketiga properti tersebut dan Bentuknya terkadang patuh dan terkadang tidak...itu sangat menyebalkan. Seseorang menyarankan agar saya menggunakan panel dalam pertanyaan sebelumnya untuk SO, namun saya belum siap untuk mengambil rute itu pada saat ini. Jika saya tidak dapat menemukan solusi untuk masalah ini, tentu saja saya akan terpaksa melakukannya, namun untuk saat ini saya akan tetap menggunakan formulir terpisah. Terima kasih untuk balasan Anda! - person Eric H; 14.04.2011
comment
Hai Eric, saya menambahkan beberapa kode untuk Anda. Meskipun bukan yang Anda cari, ia seharusnya dapat Menampilkan dan Menyembunyikan Menu Mulai. - person jp2code; 14.04.2011
comment
Sangat dihargai! Saya mencoba mengkompilasi dan mendapatkan kesalahan pada MarshalAs (Jenis atau nama namespace tidak dapat ditemukan). Saya sudah menggunakan System.Runtime.InteropServices; dan mscorlib ada di referensi saya. Apakah ini ada yang hilang dari .NET 1.1 atau .NET CF 1.0 SP3? Sekali lagi terima kasih atas bantuan Anda. - person Eric H; 14.04.2011
comment
Hmm... Sejujurnya? Saya bahkan tidak tahu apa tujuan [return: MarshalAs(UnmanagedType.Bool)] itu. Sudahkah Anda mencoba mengomentari kalimat itu? Kode Anda mungkin berjalan dengan baik tanpanya. Atau! Mungkin biarkan SetWindowPos mengembalikan Objek yang kemudian dapat Anda transmisikan ke apa pun. Saya bahkan tidak menggunakan nilai pengembalian dalam kode saya. - person jp2code; 14.04.2011
comment
Itu berhasil! Terima kasih! Saat aplikasi ditutup secara tidak terduga, bilah mulai hilang. Apakah ada cara untuk menangkap penutupan atau pengecualian be-all-end-all sehingga saya dapat menambahkan semacam blok akhirnya ke dalamnya dan menampilkan bilah awal lagi? - person Eric H; 14.04.2011
comment
Maaf. Saya sibuk. Ya, memang ada! Lihat EDIT2 di atas (segera setelah saya menuliskannya di sana....) - person jp2code; 15.04.2011
comment
Sekali lagi, sangat dihargai! Saya berharap saya dapat memberi suara positif pada Anda lebih dari sekali haha. Terima kasih sudah sangat membantu. - person Eric H; 15.04.2011

Apa yang Anda cari biasanya disebut sebagai "mode kios" (yang dapat membantu hasil mesin pencari Anda).

Masalah mendasarnya adalah bilah mulai bukan bagian dari aplikasi Anda - ini adalah bagian dari aplikasi Shell dan Anda bersaing dengannya untuk mendapatkan perilaku yang diinginkan. Apa yang Anda inginkan adalah sesuatu yang Platform coba cegah untuk Anda lakukan, jadi Anda harus bersiap untuk menempatkan boot pengembang Anda di leher platform agar platform tersebut berperilaku baik.

Entri blog ini adalah titik awal yang sangat bagus untuk masalah ini dan mungkin akan memberi Anda apa yang Anda butuhkan, tetapi jangan ragu untuk menggunakan mesin pencari untuk menemukan lebih banyak/proposal alternatif. Sebenarnya ada banyak materi di web untuk ini - lebih dari yang seharusnya ada dalam jawaban ini.

person ctacke    schedule 12.04.2011
comment
Saya sedang menafsirkan artikel MSDN (msdn.microsoft.com/en-us/library /bxz0e21k.aspx) mengatakan bahwa formulir berukuran penuh adalah formulir yang dimaksimalkan dan merupakan perilaku yang didukung. Saya tidak mempunyai masalah dengan sebagian besar bentuk yang telah saya maksimalkan, itulah sebabnya hal ini sangat membingungkan. Saya akan melihat ke mode Kios. Terima kasih untuk balasan Anda! - person Eric H; 12.04.2011