开始栏显示最大化的表单(Pocket PC 2003)

环境

  • Windows XP SP3 x32
  • Visual Studio 2005标准版
  • Windows Mobile / Pocket PC 2003
  • .NET Compact Framework 1.0 SP3和.NET Framework 1.1
  • 霍尼韦尔Dolphin 9500手持式条码扫描仪

目标

我有一个三表单应用程序和一个外部类(Program.cs),它具有应用程序入口点Main() 。 首先加载主窗体然后从MainForm_Load(...)中实例化/显示一个类似于启动画面的新窗体。 我希望所有三种forms都能最大化。 所有三种forms都设置了以下属性:

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

问题

“启动画面”表单显示全屏,没有任何问题。 然后我处理它并显示主屏幕(首先加载并运行Application.Run();的参数Application.Run(); 。从主屏幕,一旦检测到列表框SelectedIndexChanged事件,将显示第三个表单(保留主表单)说第三种forms)。第三种forms显示了我的表单顶部的任务栏: 图像在这里 关闭此表单后,主窗体现在也会覆盖任务栏。

朋友粘贴链接。 如果我在这里发布代码,请告诉我。 WorkOrderView超过一千行,所以我认为这会更容易。

  • “主要”表格(WorkOrders.cs)
  • “第三”表格(WorkOrderView.cs) – 上图

无关的建议

我是一个非常绿色的程序员,我特别缺乏这种环境的经验。 所以,如果你对我正在做某些事情的方式有任何建议/批评,请不要犹豫,用它们打我。 可能最好只评论post,而不是发布这些类型的回复的答案。

谢谢!

首先,我这几天只运行Windows Mobile 5(WM5)。 (几年前我从PocketPC 2003上升了.LOL)

我发现定义窗体的窗口大小在移动设备上不能很好地工作,并且显示/隐藏多个窗体是笨拙的,并且从不按照您想要的方式运行。

不过,请确保您的主表单的WindowState设置为Maximized

如果有帮助的话,我还将ControlBoxMinimizeBox设置为False

如果你只使用Panels作为你的表单作为某种MDI容器(不好选择单词,但这就是我正在做的事情),那么它不会使用多个表单,看起来会更好。

在我的Designer视图中 ,每个面板只是一个装满控件的小盒子。

  • 要使用每个面板,请在Visual Studio设计器中选择它,您将看到一个位置框(向上和向下以及向左和向右箭头)。
  • 右键单击位置框,然后单击“置于前面”
  • 现在转到面板控件的属性并将Dock设置为Fill
  • 当此面板全屏显示时,请添加具有适当名称的所有按钮,文本框等。 像pnl1_button1pnl2_button1这样的名称在代码中比VS默认button1button2更容易理解。
  • 完成此面板的设计视图后,返回Dock属性并将其重新设置为None
  • 继续下一个面板控件。

我发现它还有助于维护面板的小草图及其名称和控件名称。

在主窗体的Load事件中,将每个PanelDock属性设置为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:

声明主窗体的私有静态实例,然后将其包装在项目的Program.cs文件中的try …. catch例程中,如下所示:

 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); } } 

您所追求的通常被称为“信息亭模式”(这可能有助于您的搜索引擎结果)。

根本问题是起始栏不是你的应用程序的一部分 – 它是Shell应用程序的一部分,你正在与它竞争所需的行为。 你想要的是平台试图阻止你做的事情,所以你必须准备好把你的开发人员引导到平台的脖子上以使其表现出来。

这篇博客文章是这个问题的一个非常好的起点,可能会为您提供所需,但您可以随意使用搜索引擎查找更多/更多的提案。 网上实际上有很多这方面的材料 – 比这个答案更重要。