Следуя решению @ TaylorWood , вы можете выразить обе свои функции более кратко, хотя я не уверен, что краткие версии так же ясны.
Ваша create-contest
функция map
проверяет каждое число i
, чтобы узнать, является ли оно одним . Лучше просто поменять на напрямую. Для этого нам нужен вектор, который, я думаю, вы все равно захотите найти при моделировании игры:
(defn create-contest [n]
(assoc (vec (repeat n :closed)) (rand-int n) :car))
Ваша функция create-doors
многократно передает один и тот же аргумент своему map
' с функцией. Вы можете использовать repeatedly
на закрытии, чтобы получить тот же эффект:
(defn create-doors [doors contests]
(repeatedly contests (partial create-contest doors)))
или
(defn create-doors [doors contests]
(repeatedly contests #(create-contest doors)))
В Вашей основной программе у Вас, вероятно, есть строка формы:
Application.Run(new Form1());
Это вынудит форму быть показанной. Необходимо будет создать форму, но не передача это к Application.Run
:
Form1 form = new Form1();
Application.Run();
Примечание, которое теперь не завершит программа, пока Вы не будете звонить Application.ExitThread()
. Лучше делать это от обработчика для FormClosed
событие.
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
Application.ExitThread();
}
это - то, как Вы делаете это
static class Program
{
[STAThread]
static void Main()
{
NotifyIcon icon = new NotifyIcon();
icon.Icon = System.Drawing.SystemIcons.Application;
icon.Click += delegate { MessageBox.Show("Bye!"); icon.Visible = false; Application.Exit(); };
icon.Visible = true;
Application.Run();
}
}
Если Вы используете NotifyIcon
, попытайтесь изменить ShowInTaskbar на ложь.
Для удаления его из экрана Alt+Tab попытайтесь изменить стиль границы окна; я полагаю, что некоторые стили окна инструментов не появляются...
что-то как:
using System;
using System.Windows.Forms;
class MyForm : Form
{
NotifyIcon sysTray;
MyForm()
{
sysTray = new NotifyIcon();
sysTray.Icon = System.Drawing.SystemIcons.Asterisk;
sysTray.Visible = true;
sysTray.Text = "Hi there";
sysTray.MouseClick += delegate { MessageBox.Show("Boo!"); };
ShowInTaskbar = false;
FormBorderStyle = FormBorderStyle.SizableToolWindow;
Opacity = 0;
WindowState = FormWindowState.Minimized;
}
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.Run(new MyForm());
}
}
, Если это все еще появляется в Alt+Tab, можно изменить стили окна через p/invoke (немного hackier):
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
IntPtr handle = this.Handle;
int currentStyle = GetWindowLong(handle, GWL_EXSTYLE);
SetWindowLong(handle, GWL_EXSTYLE, currentStyle | WS_EX_TOOLWINDOW);
}
private const int GWL_EXSTYLE = -20, WS_EX_TOOLWINDOW = 0x00000080;
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr window, int index, int value);
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern int GetWindowLong(IntPtr window, int index);
Как что-то вроде cludge, Вы могли настроить ярлык, который запускает Ваше приложение для "выполнения минимизированный"? Это могло бы дать Вам, в чем Вы нуждаетесь!
Как так: (отобразите просто пример от Google)...
(источник: unixwiz.net )
Так как это было отмечено с vb.net, вот то, что я сделал в службе Windows и Приложении контроллера, которое я только что закончил, Добавьте модуль кода к проекту, Установка NotifyIcon, и это связало Контекстное меню в Основном Sub (), и затем установило Объект Запуска приложения на Основное Sub () вместо Формы.
Public mobNotifyIcon As NotifyIcon
Public WithEvents mobContextMenu As ContextMenu
Public Sub Main()
mobContextMenu = New ContextMenu
SetupMenu()
mobNotifyIcon = New NotifyIcon()
With mobNotifyIcon
.Icon = My.Resources.NotifyIcon
.ContextMenu = mobContextMenu
.BalloonTipText = String.Concat("Monitor the EDS Transfer Service", vbCrLf, "Right click icon for menu")
.BalloonTipIcon = ToolTipIcon.Info
.BalloonTipTitle = "EDS Transfer Monitor"
.Text = "EDS Transfer Service Monitor"
AddHandler .MouseClick, AddressOf showBalloon
.Visible = True
End With
Application.Run()
End Sub
Private Sub SetupMenu()
With mobContextMenu
.MenuItems.Add(New MenuItem("Configure", New EventHandler(AddressOf Config)))
.MenuItems.Add("-")
.MenuItems.Add(New MenuItem("Start", New EventHandler(AddressOf StartService)))
.MenuItems.Add(New MenuItem("Stop", New EventHandler(AddressOf StopService)))
.MenuItems.Add("-")
.MenuItems.Add(New MenuItem("Exit", New EventHandler(AddressOf ExitController)))
End With
GetServiceStatus()
End Sub
В Конфигурации (), я создаю экземпляр своей формы и отображаю его.
Private Sub Config(ByVal sender As Object, ByVal e As EventArgs)
Using cs As New ConfigureService
cs.Show()
End Using
End Sub
Здесь Вы идете:
Создают 2 класса, 1, который наследовался ApplicationContext. Другое единственное содержит Основную стандартную программу. Я сделал пример, который имеет форму и notifyicon, который, когда дважды щелкнуто поднимает форму и назад снова.
Не забывают устанавливать "Sub, Основной" как Ваш объект запуска в настройках My Project и указывать на реальный *.ico файл вместо f:\TP.ico..:)
Код должен, конечно, быть наполнен надлежащим кодом обработки ошибок.
Class1:
Imports System.threading
Imports System.Runtime.InteropServices
Imports System.Windows.Forms
Public Class Class1
<System.STAThread()> _
Public Shared Sub Main()
Try
System.Windows.Forms.Application.EnableVisualStyles()
System.Windows.Forms.Application.DoEvents()
System.Windows.Forms.Application.Run(New Class2)
Catch invEx As Exception
Application.Exit()
End Try
End Sub 'Main End Class
Class2:
Imports System.Windows.Forms
Imports System.drawing
Public Class Class2
Inherits System.Windows.Forms.ApplicationContext
Private WithEvents f As New System.Windows.Forms.Form
Private WithEvents nf As New System.Windows.Forms.NotifyIcon
Public Sub New()
f.Size = New Drawing.Size(50, 50)
f.StartPosition = FormStartPosition.CenterScreen
f.WindowState = Windows.Forms.FormWindowState.Minimized
f.ShowInTaskbar = False
nf.Visible = True
nf.Icon = New Icon("f:\TP.ico")
End Sub
Private Sub nf_DoubleClick(ByVal sender As Object, ByVal e As EventArgs) Handles nf.DoubleClick
If f.WindowState <> Windows.Forms.FormWindowState.Minimized Then
f.WindowState = Windows.Forms.FormWindowState.Minimized
f.Hide()
Else
f.WindowState = Windows.Forms.FormWindowState.Normal
f.Show()
End If
End Sub
Private Sub f_FormClosed(ByVal sender As Object, ByVal e As FormClosedEventArgs) Handles f.FormClosed
Application.Exit()
End Sub End Class
Это показывает Вам, как управлять запуском, как минимизировано или нормальный, а также намного больше с NotifyIcon.
Больше здесь: http://code.msdn.microsoft.com/TheNotifyIconExample