Как сохранить ощущение ControlBox UI, когда ControlBox имеет значение false в COmpact Framework (win mobile) - PullRequest
2 голосов
/ 31 октября 2011

В моих формах нужно убрать 'x' - («умное свертывание» - которое на самом деле не так уж умно) и кнопку «ОК» в некоторых формах. К сожалению, когда я это делаю, маленький значок ввода с клавиатуры перемещается от середины к правой стороне, а нижняя полоса становится серой, а не черной.

Я хотел бы просто иметь возможность удалить элементы управления свернуть и ОК (или просто переопределить их обработчики) - но, к сожалению, я не могу сделать это в CF. (какая ошибка, MS!)

Есть ли способ вернуть внешний вид интерфейса (например, черную полосу)?

Как я уже сказал, в идеале мы хотели бы либо изменить текст «ОК» на какое-то другое слово, либо просто перегрузить инициированное пользователем сворачивание (щелкнув по X или ок).

(я попытаюсь сделать несколько снимков экрана, когда смогу, чтобы показать, о чем я говорю)

EDIT

Обратите внимание, что я добавил два пункта в главное меню в форме инициализации.

    // create three menu items to go at bottom of form/on main menu
    // add new menu items to main menu
    // get rid of 'X' (smart minimize) and OK controls

    menuNext = new System.Windows.Forms.MenuItem();
    ...

    mainMenu.MenuItems.Add(menuPrevious);             
    mainMenu.MenuItems.Add(menuNext);
    mainMenu.MenuItems.Add(menuCancel); 

    MinimizeBox = false;                        
    ControlBox = false;

Примечание Я создаю формы и элементы программно, а не с помощью дизайнера форм. Это требование, поскольку эти формы создаются на лету на основе файлов конфигурации во время выполнения.

Ответы [ 2 ]

1 голос
/ 19 марта 2012

У меня была похожая проблема, и я изо всех сил пытался найти ответ, пока не наткнулся на следующий URL http://msdn.microsoft.com/en-us/library/bb158579.aspx

В нем упоминается стиль WS_NONAVDONEBUTTON, который, похоже, применим к этой проблеме, но этот код предназначен для C ++.

Похоже, кто-то уже написал обертку для этого, и это решило все мои проблемы.

http://www.koders.com/csharp/fid55A69F22A80DB21F0DB8F0F3EAA3F7D17849142C.aspx?s=button#L8

Для вашего сведения я использовал метод HideXButton в переопределении OnActivation моей базовой формы, и вдруг X и Ok больше не отображаются.

[DllImport("coredll.dll")]
public static extern UInt32 SetWindowLong(
    IntPtr hWnd,
    int nIndex,
    UInt32 dwNewLong);

[DllImport("coredll.dll")]
public static extern UInt32 GetWindowLong(
    IntPtr hWnd,
    int nIndex);

public const int GWL_STYLE = -16;
public const UInt32 WS_NONAVDONEBUTTON = 0x00010000;

public static void HideXButton(IntPtr hWnd)
{
    UInt32 dwStyle = GetWindowLong(hWnd, GWL_STYLE);

    if ((dwStyle & WS_NONAVDONEBUTTON) == 0)
        SetWindowLong(hWnd, GWL_STYLE, dwStyle | WS_NONAVDONEBUTTON);
}
1 голос
/ 01 ноября 2011

Тим, вот несколько P/Invoke вызовов, которые я нашел полезными, чтобы показать и скрыть HHTaskBar и MS_SIPBUTTON:

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

[DllImport("coredll.dll", EntryPoint = "FindWindowW", SetLastError = true)]
public static extern IntPtr FindWindowCE(string lpClassName, string lpWindowName);

public enum WindowPosition {
  SWP_HIDEWINDOW = 0x0080,
  SWP_SHOWWINDOW = 0x0040
}

Вот обертка, которую я написал для нее:

static IntPtr _taskBar;
static IntPtr _sipButton;
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) {
    // log my Error (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) {
    // log my Error Wrapper(enable ? "Show SIP" : "Hide SIP", err);
  }
}

И, наконец, вот как я его использую:

/// <summary>
/// The main entry point for the application.
/// </summary>
[MTAThread]
static void Main() {
  ShowWindowsMenu(false);
  try {
    Application.Run(new Form());
  } catch (Exception err) {
    // Log my error
  } finally {
    ShowWindowsMenu(true);
  }
}
...