Сначала исследуем тип проекта, который рекомендуют профессионалы (Чарльз Петцольд). Это консольное приложение, но оно может создавать Windows-окна! Здесь мы попытаемся быстро войти в курс дела.
1. В меню File4New выберите команду Blank solution.
2. В появившемся окне диалога New Project, в окне Project Type раскройте узел дерева под именем Visual Studio Solution. В окне Templates выбор единственный — Blank solution.
3. В окне Name оставьте имя решения Solution1.
4. В окне Location задайте местоположение новой папки с файлами решения (solution).
5. Нажмите OK.
Теперь вставьте в пустое рабочее пространство (или решение) пустой проект.
6. В меню File4New выберите команду Project.
7. В окне диалога New Project установите флажок Add to Solution и раскройте узел дерева под именем Visual C# Projects в окне Project Type.
8. В окне Templates выберите тип проекта Empty Project.
9. В окне Name задайте имя проекта ConsoleWnd.
10. Нажмите OK.
Далее в пустой проект следует вставить пустой файл.
11. В контекстном меню проекта (установите мышь над строкой ConsoleWnd) выберите Add4Add New Item. Далее ищите Code4Code File.
12. В окне Name задайте имя файла ConsoleWnd.cs.
13. Нажмите OK.
Введите в новый пустой файл минимально возможный код:
class A
{
static void Main() // Нет глобальных функций! Все попрятались по домам
{
System.Console.WriteLine ("Hello! This is C# Console Project");
}
}
Запустите (Ctrl+F5). Убедитесь в том, что все работает и исследуйте новые типы данных. Убедитесь, что все классы и структуры имеют неявного родителя (происходят от класса Object). Для этого, вместо предыдущего фрагмента вставьте что-нибудь вроде:
using System;
class A
{
static void Main()
{
bool b = false;
Type t = b.GetType();
Console.WriteLine (t);
Console.WriteLine (t.Assembly.FullName);
Console.WriteLine ("\nIsPrimitive = {0}, IsPointer = {1}, " +
"\nIsValueType = {2}, IsSubclassOf (Object) = {3}\n",
t.IsPrimitive, t.IsPointer, t.IsValueType,
t.IsSubclassOf (typeof(Object)));
Console.WriteLine ("\nNew Types:\n\n" +
"uint = (" + uint.MinValue + ", " + uint.MaxValue + ")\n\n" +
"ulong = ({0}, {1})\n", ulong.MinValue, ulong.MaxValue);
Console.WriteLine ("decimal = ({0}, {1})\n",
decimal.MinValue, decimal.MaxValue);
decimal d = 100.25m;
Console.WriteLine ("\nSuffix 'm' stands for money: " + d +'\n');
}
}
Обратите внимание на различные способы соединения строк (и одиночных символов) при формировании текста для вывода в консольное окно. Методы Write и WriteLine класса Console используют семантику старой функции printf, но они позволяют еще более гибко управлять потоком вывода и форматировать числовые данные.
Самостоятельно опробуйте форматы вывода числовых данных. Для этого вместо {0} или {1} попробуйте вставить что-то вроде: {0:X8} или {1:C} или {1:C1}. Пользуйтесь Help. Действуют следующие спецификаторы формата: C — currency, D — decimal, E — exponent, F — fixed, G — general, N — number, P — percent, X — hexadecimal.
Совет. Сейчас мы двинемся дальше. Если вы хотите сохранить старый вариант кода, пожалуйста, не комментируйте его (будет много мусора, в котором ни вы, ни я не разберемся. Лучше присоедините к проекту новый файл (Wnd1.cs, Wnd2.cs, ...), скопируйте в него старый вариант, а старый файл (Wnd.cs) отсоедините, выбрав в контекстном меню файла команду: Exclude From Project.
¨ Добавьте в класс A метод, который обменивает местами значения двух переменных (одного из новых типов). Для этого вам придется передавать переменные по ссылке (это делается с помощью ключевого слова ref). Проверьте работу метода, вызвав его в функции Main.
Заметьте, что функция Main обязана быть static для того, чтобы Windows смогла ее запустить. Для вызова нестатического метода класса А внутри статического метода всегда необходимо сначала создать объект класса А. Сделайте это. После этого вызов метода Swap должен иметь вид: a.Swap (,); а не Swap (,);. Последнее было бы правильно, если бы Main была не static.
¨ Содайте массив вещественных ar и выведите его с помощью цикла foreach, форматируя как показано. Например:
foreach (float f in ar)
Console.WriteLine ("{0:E2}", f);
¨ Создайте бесконечный цикл ввода, который просит пользователя вводить строку текста (string s) и выводит ответную строку ans. Используйте switch для текстовой строки!!! Это было невозможно в С++. Погрузите в цикл какой-нибудь бред, например:
switch (s.ToUpper()) // Приводим к верхнему регистру
{
case "I":
ans = "My"; break;
case "YOU":
ans = "Your"; break;
case "HE":
ans = "His"; break;
case "Q":
ans = "Leaving"; break;
default:
ans = "Enter a pronoun, please!"; break;
}
Console.WriteLine (ans);
if (ans == "Leaving")
break;
Для того, чтобы в консольном приложении создать Windows-окно, надо подключить DLL.
1. В контекстном меню проекта выберите Add Reference.
2. В окне диалога Add Reference, выберите три библиотеки System.dll, System.Windows.Forms и System.Drawing.
3. Замените весь код файла.
using System;
using System.Windows.Forms;
class A
{
static void Main()
{
Console.WriteLine("I am ready to serve you");
Form form = new Form();
form.Text = "My Window";
form.Visible = true;
Console.WriteLine("The window width = " + form.Width);
}
}
Запустите приложение и попробуйте объяснить его поведение.
Консольное приложение не создает бесконечного цикла ожидания и обработки сообщений. Поэтому оно сразу завершатся. Оно не ждет реакции пользователя, так как нет цикла типа while (GetMessage(. . .)).
Для того, чтобы задержать окно на экране, вставьте в конец функции Main такую строку кода.
MessageBox.Show("App has ended");
Запустите и попробуйте объяснить. Для того, чтобы запустить нормальный цикл ожидания и обработки сообщений нужен класс Application. Он может создать цикл и связать его с Windows-окном. Класс Application имеет только статические методы. Их следует вызывать, не создавая объект класса, например, Application.DoEvents(). Вставьте в функцию Main (перед строкой с вызовом MessageBox) такую строку кода.
Application.Run();
Запустите и попробуйте объяснить. Приложение повисает. Почему?
Объяснение. Так как приложение не связано с окном, то окно не посылает ему сообщение WM_QUIT и бесконечный цикл обработки сообщений не прерывается. Вспомните PostQuitMessage в API-программе — оконная процедура посылала его приложению. В нашем случае для завершения приложения можно нажать Ctrl+С. Это преимущество дает консольный тип проекта. Windows-приложение пришлось бы убивать с помощью Task Manager. Далее, замените Application.Run() на:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.