แถบเริ่มแสดงรูปแบบที่ขยายใหญ่สุด (Pocket PC 2003)

สิ่งแวดล้อม

  • วินโดว์ XP SP3 x32
  • วิชวลสตูดิโอ 2005 มาตรฐาน
  • วินโดวส์โมบาย/พ็อกเก็ตพีซี 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 มีมากกว่าหนึ่งพันบรรทัด ดังนั้นฉันจึงคิดว่าการดำเนินการนี้จะง่ายกว่านี้

คำแนะนำที่ไม่เกี่ยวข้อง

ฉันเป็นโปรแกรมเมอร์ที่เป็นมิตรต่อสิ่งแวดล้อมและขาดประสบการณ์ในสภาพแวดล้อมนี้เป็นพิเศษ ดังนั้นหากคุณมีข้อเสนอแนะ/คำวิจารณ์เกี่ยวกับวิธีที่ฉันทำบางสิ่ง อย่าลังเลที่จะติดต่อเรา อาจเป็นการดีที่สุดที่แสดงความคิดเห็นในโพสต์แทนที่จะโพสต์คำตอบสำหรับการตอบกลับประเภทเหล่านั้น

ขอบคุณ!


person Eric H    schedule 12.04.2011    source แหล่งที่มา


คำตอบ (2)


ก่อนอื่น ทุกวันนี้ฉันใช้เฉพาะ Windows Mobile 5 (WM5) เท่านั้น (ผมต้องขยับขึ้นมาจาก PocketPC 2003 เมื่อสองสามปีที่แล้ว 555)

ฉันพบว่าการกำหนดขนาดหน้าต่างของแบบฟอร์มทำงานได้ไม่ดีบนอุปกรณ์เคลื่อนที่ และการแสดง/ซ่อนหลายรูปแบบนั้นเป็นเรื่องที่น่าอึดอัดใจและไม่เคยทำงานตามที่คุณต้องการ

อย่างไรก็ตาม ตรวจสอบให้แน่ใจว่าแบบฟอร์มหลักของคุณตั้งค่า WindowState เป็น ขยายใหญ่สุด

ฉันยังตั้งค่า ControlBox และ MinimizeBox เป็น เท็จ ด้วย หากวิธีนี้ช่วยได้

แทนที่จะใช้หลายรูปแบบ มันจะดูดีกว่ามากถ้าคุณใช้ Panels เป็นแบบฟอร์มของคุณโดยมี Main Form เป็นคอนเทนเนอร์ MDI บางประเภท (การเลือกคำที่ไม่ดี แต่นั่นคือสิ่งที่ฉันกำลังทำ)

ใน มุมมองนักออกแบบ ของฉัน แต่ละแผงเป็นเพียงกล่องเล็กๆ ที่เต็มไปด้วยการควบคุม

  • หากต้องการทำงานกับแต่ละแผง ให้เลือกแผงนั้นในตัวออกแบบ Visual Studio แล้วคุณจะเห็นกล่องตำแหน่ง (ลูกศรขึ้นและลง และซ้ายและขวา)
  • คลิกขวาที่ช่องตำแหน่งแล้วคลิก นำมาไว้ด้านหน้า
  • ตอนนี้ไปที่คุณสมบัติของแผงควบคุมแล้วตั้งค่า Dock เป็น เติม
  • แม้ว่าแผงนี้จะแสดงแบบเต็มหน้าจอ ให้เพิ่มปุ่ม กล่องข้อความ ฯลฯ ทั้งหมดด้วยชื่อที่เหมาะสม ชื่อเช่น pnl1_button1 และ pnl2_button1 จะเข้าใจง่ายกว่าในโค้ดของคุณมากกว่าค่าเริ่มต้น VS button1 และ button2
  • เมื่อคุณผ่านมุมมองการออกแบบของแผงนี้แล้ว ให้กลับไปที่คุณสมบัติ Dock และตั้งค่ากลับเป็น ไม่มี
  • ไปที่แผงควบคุมถัดไป

ฉันพบว่ามันยังช่วยรักษาภาพร่างเล็กๆ ของพาเนลของคุณพร้อมชื่อและชื่อของส่วนควบคุมด้วย

ในเหตุการณ์ Load ของแบบฟอร์มหลักของคุณ ให้ตั้งค่าคุณสมบัติ Dock ของ Panel ทุกรายการเป็น DockStyle.Fill จากนั้น หากคุณต้องการแสดงแบบฟอร์มเดียว เพียงโทร Panel1.BringToFront() แทน dialog.Show()

การพัฒนามือถือไม่ใช่เรื่องยาก แต่มันแตกต่าง :)

แก้ไข:

ในไฟล์ Program.cs ของโปรเจ็กต์ ฉันเก็บเครื่องมือคงที่ต่อไปนี้ไว้ซึ่งฉันสามารถใช้เพื่อเปิดและปิดเมนู Start (ทำงานได้ไม่ดีนักใน 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);
  }
}

แก้ไข2:

ประกาศอินสแตนซ์แบบคงที่ส่วนตัวของฟอร์มหลักของคุณ จากนั้นรวมไว้ใน 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);
  }
}
person jp2code    schedule 12.04.2011
comment
ฉันได้กำหนดคุณสมบัติทั้งสามไว้แล้ว และบางครั้งแบบฟอร์มก็ยังคงอยู่ แต่บางครั้งก็ไม่...มันน่าโมโหมาก มีคนแนะนำให้ฉันใช้แผงในคำถามก่อนหน้ากับ SO อย่างไรก็ตาม ฉันยังไม่พร้อมที่จะไปตามเส้นทางนั้น ณ จุดนี้ หากฉันไม่สามารถหาวิธีแก้ไขปัญหานี้ได้ แน่นอนว่าฉันจะถูกบังคับให้ทำ แต่ตอนนี้ฉันจะใช้รูปแบบที่แยกจากกัน ขอบคุณสำหรับการตอบกลับของคุณ! - person Eric H; 14.04.2011
comment
เฮ้เอริค ฉันเพิ่มโค้ดให้คุณแล้ว แม้ว่าจะไม่ใช่สิ่งที่คุณต้องการอย่างแน่นอน แต่ก็ควรจะสามารถแสดงและซ่อนเมนู Start ได้ - person jp2code; 14.04.2011
comment
ชื่นชมมาก! ฉันกำลังพยายามคอมไพล์และได้รับข้อผิดพลาดบน MarshalAs (ไม่พบประเภทหรือชื่อเนมสเปซ) ฉันใช้ System.Runtime.InteropServices อยู่แล้ว และ mscorlib อยู่ในข้อมูลอ้างอิงของฉัน สิ่งนี้ขาดหายไปจาก .NET 1.1 หรือ .NET CF 1.0 SP3 หรือไม่ ขอขอบคุณอีกครั้งสำหรับความช่วยเหลือของคุณ - person Eric H; 14.04.2011
comment
อืม... จริงเหรอ? ฉันไม่รู้ด้วยซ้ำว่าจุดประสงค์ของ [return: MarshalAs(UnmanagedType.Bool)] คืออะไร คุณลองแสดงความคิดเห็นบรรทัดนั้นแล้วหรือยัง? รหัสของคุณอาจทำงานได้ดีหากไม่มีมัน หรือ! อาจให้ SetWindowPos ส่งคืน Object ที่คุณสามารถส่งไปที่อะไรก็ได้ ฉันไม่ได้ใช้ค่าตอบแทนในรหัสของฉันด้วยซ้ำ - person jp2code; 14.04.2011
comment
นั่นได้ผล! ขอบคุณ! เมื่อปิดแอปพลิเคชันในลักษณะที่ไม่คาดคิด แถบเริ่มต้นจะหายไป มีวิธีใดบ้างที่จะจับการปิดหรือข้อยกเว้นแบบ be-all-end-all เพื่อที่ฉันจะได้เพิ่มบล็อกในที่สุดและแสดงแถบเริ่มต้นอีกครั้ง - person Eric H; 14.04.2011
comment
ขอโทษ. ฉันมีงานยุ่ง ใช่ แต่ก็มี! ดู EDIT2 ด้านบน (ทันทีที่ฉันเขียนสิ่งนั้นลงไป....) - person jp2code; 15.04.2011
comment
ชื่นชมมากอีกครั้ง! ฉันหวังว่าฉันจะลงคะแนนของคุณมากกว่าหนึ่งครั้งฮ่าฮ่า ขอบคุณที่ให้ความช่วยเหลือ - person Eric H; 15.04.2011

สิ่งที่คุณต้องการมักเรียกว่า "โหมดคีออสก์" (ซึ่งอาจช่วยให้ผลลัพธ์ของเครื่องมือค้นหาของคุณดีขึ้น)

ปัญหาพื้นฐานคือแถบเริ่มต้นไม่ได้เป็นส่วนหนึ่งของแอปของคุณ แต่เป็นส่วนหนึ่งของแอป Shell และคุณกำลังแข่งขันกับแถบดังกล่าวเพื่อให้ได้พฤติกรรมที่ต้องการ สิ่งที่คุณต้องการคือสิ่งที่แพลตฟอร์มพยายามป้องกันไม่ให้คุณทำ ดังนั้นคุณต้องเตรียมพร้อมที่จะนำบูทนักพัฒนาของคุณไปไว้บนคอของแพลตฟอร์มเพื่อให้มันทำงาน

ข้อความในบล็อกนี้เป็นจุดเริ่มต้นที่ดีสำหรับปัญหานี้และอาจจะทำให้คุณ สิ่งที่คุณต้องการ แต่อย่าลังเลที่จะใช้เครื่องมือค้นหาเพื่อค้นหาข้อเสนอเพิ่มเติม/สำรอง จริงๆ แล้วมีเนื้อหามากมายบนเว็บสำหรับเรื่องนี้ - มากกว่าที่จะอยู่ในคำตอบนี้

person ctacke    schedule 12.04.2011
comment
ฉันกำลังตีความบทความ MSDN (msdn.microsoft.com/en-us/library /bxz0e21k.aspx) บอกว่าแบบฟอร์มขนาดเต็มเป็นรูปแบบที่ขยายใหญ่สุดและได้รับการสนับสนุน ฉันไม่มีปัญหากับแบบฟอร์มส่วนใหญ่ที่ฉันขยายใหญ่สุด ซึ่งเป็นสาเหตุที่ทำให้เกิดความสับสนมาก ฉันจะดูในโหมดคีออสก์ ขอบคุณสำหรับการตอบกลับของคุณ! - person Eric H; 12.04.2011