まず、最近はWindows Mobile 5(WM5)のみを実行しています。(私は数年前にPocketPC 2003から上に移動しました。LOL)
フォームのウィンドウサイズの定義はモバイルデバイスではうまく機能せず、複数のフォームの表示/非表示は扱いにくく、希望どおりに動作しないことがわかりました。
それでも、メインフォームが最大化WindowState
に設定されていることを確認してください。
また、それが役立つ場合は、Falseに設定しますControlBox
。MinimizeBox
複数のフォームを使用する代わりに、パネルをフォームとして使用し、メインフォームをある種のMDIコンテナとして使用すると、見栄えがよくなります(単語の選択は不適切ですが、それが私が行っていることです)。
私のデザイナービューでは、各パネルはコントロールでいっぱいの小さなボックスです。
- 各パネルを操作するには、Visual Studioデザイナーでパネルを選択すると、位置ボックス(上下および左右の矢印)が表示されます。
- 位置ボックスを右クリックし、[前面に移動]をクリックします。
- 次に、パネルコントロールの[プロパティ]に移動し、[塗りつぶし
Dock
]に設定します。
- このパネルが全画面表示のときに、すべてのボタン、テキストボックスなどを適切な名前で追加します。のような名前は、VSのデフォルトや
pnl1_button1
。pnl2_button1
よりもコードで理解しやすいです。button1
button2
- このパネルのデザインビューが終了したら、
Dock
プロパティに戻って[なし]に戻します。
- 次のパネルコントロールに進みます。
パネルの名前とコントロールの名前を含む小さなスケッチを維持することも役立つことがわかりました。
Load
メインフォームの場合は、everyPanel
のDock
プロパティを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);
}
}