1

環境

  • Windows XP SP3 x32
  • Visual Studio 2005 Standard
  • Windows Mobile / Pocket PC 2003
  • .NET Compact Framework1.0SP3および.NETFramework1.1
  • HoneywellDolphin9500ハンドヘルドバーコードスキャナー

ゴール

3つの形式のアプリケーションと、アプリケーションのエントリポイントを持つ外部クラス(Program.cs)がありますMain()。メインフォームが最初に読み込まれ、次に、内部からMainForm_Load(...)、スプラッシュ画面のような新しいフォームをインスタンス化/表示します。3つのフォームすべてを最大化する必要があります。3つのフォームすべてに、次のプロパティが設定されています。

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

問題

「スプラッシュ画面」フォームは問題なく全画面表示されます。次に、それを破棄してメイン画面を表示します(最初にロードし、のパラメーターを表示しApplication.Run();ます。メイン画面から、リストボックスSelectedIndexChangedイベントが検出されると、3番目のフォームが表示されます(メインフォームは上記の3番目のフォームの後ろに残されます)。 3番目のフォームは、フォームの上部にタスクバーを表示しますこちらの画像 このフォームを閉じると、メインフォームにもタスクバーがオーバーレイされます。

コード

友達はリンクを貼り付けます。ここにコードを投稿するだけでよいかどうか教えてください。WorkOrderViewは1000行を超えているので、これが簡単だと思いました。

無関係な提案

私は非常に環境に配慮したプログラマーであり、特にこの環境での経験が不足しています。ですから、私が何かをしている途中で何か提案や批判があれば、遠慮なく私にぶつけてください。おそらく、これらのタイプの返信に対する回答を投稿するのではなく、投稿にコメントするのが最善です。

ありがとう!

4

2 に答える 2

2

まず、最近はWindows Mobile 5(WM5)のみを実行しています。(私は数年前にPocketPC 2003から上に移動しました。LOL)

フォームのウィンドウサイズの定義はモバイルデバイスではうまく機能せず、複数のフォームの表示/非表示は扱いにくく、希望どおりに動作しないことがわかりました。

それでも、メインフォームが最大化WindowStateに設定されていることを確認してください。

また、それが役立つ場合は、Falseに設定ますControlBoxMinimizeBox

複数のフォームを使用する代わりに、パネルをフォームとして使用し、メインフォームをある種のMDIコンテナとして使用すると、見栄えがよくなります(単語の選択は不適切ですが、それが私が行っていることです)。

私のデザイナービューでは、各パネルはコントロールでいっぱいの小さなボックスです。

  • 各パネルを操作するには、Visual Studioデザイナーでパネルを選択すると、位置ボックス(上下および左右の矢印)が表示されます。
  • 位置ボックスを右クリックし、[前面に移動]をクリックします。
  • 次に、パネルコントロールの[プロパティ]に移動し、[塗りつぶしDock]に設定します。
  • このパネルが全画面表示のときに、すべてのボタン、テキストボックスなどを適切な名前で追加します。のような名前は、VSのデフォルトやpnl1_button1pnl2_button1よりもコードで理解しやすいです。button1button2
  • このパネルのデザインビューが終了したら、Dockプロパティに戻って[なし]に戻します。
  • 次のパネルコントロールに進みます。

パネルの名前とコントロールの名前を含む小さなスケッチを維持することも役立つことがわかりました。

Loadメインフォームの場合は、everyPanelDockプロパティをDockStyle.Fillに設定します。次に、1つのフォームを表示したいので、Panel1.BringToFront()の代わりに呼び出すだけですdialog.Show()

モバイル開発は難しいことではありませんが、違います。:)

編集:

プロジェクトのProgram.csファイルには、スタートメニューのオンとオフを切り替えるために使用できる次の静的ツールがあります(WM5ではうまく機能しませんが、PocketPCバージョンのコードにはまだあります)。

私はこのプロジェクトを1年ほどで開く必要はありませんでしたが、すべて有効であるはずです。それらを試してみてください。私が何かを忘れた場合は、私に知らせてください。

これをプロジェクトの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);
  }
}
于 2011-04-12T21:10:48.980 に答える
1

あなたが求めているものは通常「キオスクモード」と呼ばれます(これはあなたの検索エンジンの結果を助けるかもしれません)。

根本的な問題は、スタートバーがアプリの一部ではないことです。これはシェルアプリの一部であり、目的の動作を求めて競合しています。必要なのは、プラットフォームが実行を阻止しようとしていることです。そのため、プラットフォームを動作させるには、開発者のブートをプラットフォームの首に置く準備をする必要があります。

このブログエントリは、この問題の非常に良い出発点であり、おそらく必要なものを提供しますが、検索エンジンを使用して、より多くの/代替の提案を自由に見つけてください。これについては、実際にはWeb上に多くの資料があります。この回答に含まれるよりも多くの資料があります。

于 2011-04-12T19:17:48.590 に答える