我的表单需要删除'x' - (“智能最小化” - 实际上并不那么聪明)和几个表单上的“确定”按钮。不幸的是,当我这样做时,小键盘输入图标从中间移动到右侧,下部条形变为灰色而不是黑色。
我希望能够删除最小化和OK控件(或者只是覆盖他们的处理程序) - 但不幸的是我无法在CF中执行此操作。 (这是一个错误,MS!)
有没有办法放回一些UI的外观(如黑条)?
就像我说的那样,理想情况下我们要么将文本“OK”更改为其他单词,要么只是重载用户启动的最小化(单击X或ok)。
(当我可以展示我在说什么时,我会试着张贴一些屏幕截图)
修改
另请注意,我已在表单初始化中向主菜单添加了两个项目。
// 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;
请注意 我以编程方式生成表单和项目 - 而不是使用表单设计器。这是一项要求,因为这些表单是在运行时基于配置文件动态制作的。
答案 0 :(得分:1)
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);
}
}
答案 1 :(得分:1)
我遇到了类似的问题,并且在我偶然发现以下网址http://msdn.microsoft.com/en-us/library/bb158579.aspx
之前一直难以找到答案它提到了一个名为WS_NONAVDONEBUTTON的样式,似乎适用于此问题,但此代码适用于C ++。
看起来有人已经为它编写了一个包装器,这解决了我所有的问题。
http://www.koders.com/csharp/fid55A69F22A80DB21F0DB8F0F3EAA3F7D17849142C.aspx?s=button#L8
为了您的信息,我在基础表单的OnActivated覆盖中使用了HideXButton方法,突然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);
}