ก่อนอื่น ทุกวันนี้ฉันใช้เฉพาะ 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