- графіка
- Як відтворити системні звуки
- Як відстежувати момент блокування і розблокування комп'ютера
- Чи встановлений пакет Excel на комп'ютері користувача
- Як зробити перші символи слів великими
- Як з Bitmap отримати Icon?
- Інтернет
- Дізнатися розмір файлу, без скачування його
- Отримати IP-адресу, псевдонім і реальне ім'я сайту
- Як отримати хост, порт, протокол та інші властивості з веб-адреси
- Чи підключений комп'ютер до інтернету?
- Як створити посилання (* .url) на сторінку в Інтернеті
- файли
- Встановити дату та час створення файлу та останньої операції запису в файл
- Заборона на запуск другої копії програми
- Використання клавіші-модифікатора Ctrl для кнопки
- Як використовувати системні значки
- Як вкоротити довгий шлях до файлу
- Як визначити версію операційної системи
- Як отримати серійний номер материнської плати
- Як змусити говорити комп'ютер
- Отримати список мовних движків
- Як створювати zip-архіви
- Як дізнатися розміри екрану
- Як визначити робочу область екрану без панелі завдань
- Form.Close () або Application.Exit () - Який метод краще використовувати для виходу з програми
- Встановити фоновий малюнок у батьківської MDI-форми
- Перекласти дату в число
- Скільки секунд міститься в хвилинах, годинах, добі
- Отримати маркер поточного процесу
Не потрібно винаходити велосипед, краще катайтеся на ньому. Можливо, ваше запитання, над вирішенням якого ви давно б'єтеся, давно вирішене. Скористайтеся цією сторінкою для пошуку відповіді.
графіка
Отримати список встановлених принтерів
C допомогою властивості InstalledPrinters класу PrinterSettings можна отримати список встановлених принтерів. При запуску програми виводимо в випадаючому списку список всіх встановлених принтерів. Для цього проходимо в циклі через колекцію System.Drawing.Printing.PrinterSettings.InstalledPrinters і додаємо ім'я принтера в ComboBox (cboPrinter).
private void Form1_Load (object sender, EventArgs e) {foreach (string printer in PrinterSettings.InstalledPrinters) {cboPrinter.Items.Add (printer); }}Приклад отримання більш детальної інформації про принтерах дивіться в розділі графіка .
Як відтворити системні звуки
У .NEТ Framework 2.0 з'явився клас System.Media.SystemSounds, за допомогою якого можна відтворити системні звуки Asterisk, Beep, Exclamation, Hand, Question.
System.Media.SystemSounds.Asterisk.Play (); System.Media.SystemSounds.Beep.Play (); System.Media.SystemSounds.Exclamation.Play (); System.Media.SystemSounds.Hand.Play (); System.Media.SystemSounds.Question.Play ();Як відстежувати момент блокування і розблокування комп'ютера
Момент блокування або розблокування комп'ютера можна відловлювати за допомогою події SystemEvents.SessionSwitch.
private void SystemEvents_SessionSwitch (object sender, SessionSwitchEventArgs e) {// If the reason for the session switch is lock or unlock // send the message to mute or unmute the system volume if (e.Reason == SessionSwitchReason.SessionLock) {SendMessageW ( this.Handle, WM_APPCOMMAND, this.Handle, (IntPtr) APPCOMMAND_VOLUME_MUTE); } Else if (e.Reason == SessionSwitchReason.SessionUnlock) {SendMessageW (this.Handle, WM_APPCOMMAND, this.Handle, (IntPtr) APPCOMMAND_VOLUME_MUTE); }}У цьому прикладі при блокуванні комп'ютера автоматично вимикається мікшер за допомогою повідомлення WM_APPCOMMAND. При розблокуванні мікшер включається знову.
Чи встановлений пакет Excel на комп'ютері користувача
При установці Excel в реєстрі прописуються певні ключі. Можна зчитувати їх для своєї перевірки.
using Microsoft.Win32 RegistryKey hkcr = Registry.ClassesRoot; RegistryKey excelKey = hkcr.OpenSubKey ( "Excel.Application"); bool excelInstalled = excelKey == null? false: true; MessageBox.Show (excelInstalled.ToString ());Як зробити перші символи слів великими
Для цієї мети підійде метод TextInfo.ToTitleCase.
Як з Bitmap отримати Icon?
Використовуйте метод Bitmap.GetHicon
const string FileName = @ "E: \ sample \ cat.png"; // ваш шлях до графіческомоу файлу using (Bitmap bitmap = (Bitmap) Image.FromFile (FileName)) {IntPtr hIcon = bitmap.GetHicon (); this.Icon = Icon.FromHandle (hIcon); }Інтернет
Працюємо з FTP
В статті (Англ.) Показаний простий приклад закачування файлу на FTP-сервер. Исходник додається.
Дізнатися розмір файлу, без скачування його
Коли ми намагаємося завантажити який-небудь файл, то бачимо в діалоговому вікні, якого розміру обраний файл і чи варто його качати. Для цього нам потрібно знати URL-адресу потрібного файлу. Код для кнопки (також додайте текстове поле для URL):
using System.Net; if (textBox1.Text == "") {MessageBox.Show ( "Ви не ввели адресу файлу", "URL Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } Else {string URL = textBox1.Text; // отримаємо тип файлу (розширення) string filetype = URL.Substring (URL.LastIndexOf ( ".") + 1, (URL.Length - URL.LastIndexOf ( ".") - 1)); labelFileType.Text = filetype.ToUpper (); // ім'я файлу string filename = URL.Substring (URL.LastIndexOf ( "/") + 1, (URL.Length - URL.LastIndexOf ( "/") - 1)); labelFileName.Text = filename; WebRequest req = HttpWebRequest.Create (textBox1.Text); req.Method = "HEAD"; WebResponse resp = req.GetResponse (); long ContentLength = 0; long result; if (long.TryParse (resp.Headers.Get ( "ContentLength"), out ContentLength)) {string File_Size; if (ContentLength> = 1073741824) {result = ContentLength / 1073741824; labelSize.Text = "GB"; } Else if (ContentLength> = 1048576) {result = ContentLength / 1048576; labelSize.Text = "MB"; } Else {result = ContentLength / 1024; labelSize.Text = "KB"; } // Виводимо розмір файлу File_Size = result.ToString ( "0.00"); sizevaluelabel.Text = File_Size; }}Отримати IP-адресу, псевдонім і реальне ім'я сайту
Щоб отримати IP-адресу з імені сайту, скористайтеся методом GetHostEnry. Для одного імені хоста може бути налаштоване кілька IP-адрес. Тому, метод GetHostEntry може повернути масив IP-адрес, а також псевдоніми і саме ім'я хоста. У наступному прикладі ми отримаємо IP-адреса для імені хоста www.google.ru, потім за допомогою властивості AddressList виведемо всі IP-адреси (масив об'єктів IPAddress). Далі за допомогою властивості Aliases отримаємо список псевдонімів (якщо є), а також справжнє ім'я хоста.
using System.Net; string hostname = "www.google.ru"; IPHostEntry entry = Dns.GetHostEntry (hostname); Console.WriteLine ( "IP-адреси для {0}:", hostname); foreach (IPAddress address in entry.AddressList) Console.WriteLine (address.ToString ()); Console.WriteLine ( "Псевдоніми:"); foreach (string aliasName in entry.Aliases) Console.WriteLine (aliasName); Console.WriteLine ( "Справжнє ім'я хоста:" + entry.HostName);Як отримати хост, порт, протокол та інші властивості з веб-адреси
За допомогою властивостей класів System.Uri і System.UriBuilder можна легко отримати необхідну інформацію з веб-адреси.
Uri sitename = new Uri ( "http://developer.alexanderklimov.ru:80/test.txt?name&price"); // адреса Console.WriteLine (sitename.Scheme); // схема (http) Console.WriteLine (sitename.Segments [0]); // сегмент Console.WriteLine (sitename.AbsoluteUri); // абсолютний URI. Якщо порт 80, то він не виводиться Console.WriteLine (sitename.Fragment); // фрагмент Console.WriteLine (sitename.LocalPath); // локальний шлях. для HTTP-запиту збігається з AbsolutePath Console.WriteLine (sitename.Query); // рядок після шляху (? Name & price) Console.WriteLine (sitename.PathAndQuery); // комбінація шляху і рядки запиту (test.txt? Name & price)Чи підключений комп'ютер до інтернету?
Визначити, чи ваш комп'ютер підключено до Інтернету, можна за допомогою методу NetworkInterface.GetIsNetworkAvailable. Слід зауважити, що якщо комп'ютер підключений до локальної мережі, то цей спосіб виявиться марним, так як ваша машина може мати підключення до мережі, але не мати виходу в інтернет. У цьому випадку спробуйте скористатися функцією Windows API InternetGetConnectedState.
MessageBox.Show ( "Наявність підключення:" + System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable (). ToString ());Як створити посилання (* .url) на сторінку в Інтернеті
Посилання Інтернету є текстовим файлом з розширенням URL і з певною структурою записи, схожою з файлами INI. Ви можете програмно створити таку посилання, скажімо, на робочому столі
// Функція-обгортка для створення посилання інтернету private void CreateInternetShortCut (string FileName, string URL) {using (StreamWriter sw = new StreamWriter (FileName)) {sw.WriteLine ( "[InternetShortcut]"); sw.WriteLine ( "URL =" + URL); sw.WriteLine (); }} Private void Form1_Load (object sender, EventArgs e) {// У вас буде свій шлях до файлу CreateInternetShortCut (@ "d: \ mysite.url", "http://developer.alexanderklimov.ru"); }файли
Як видалити файл з атрибутом тільки для читання?
Використовуйте клас System.IO.FileInfo для отримання атрибутів файлу. Приклад справедливий і для .NET Compact Framework
System.IO.FileInfo fi = new System.IO.FileInfo ( "filename"); // видаляємо атрибут тільки для читання if ((fi.Attributes & System.IO.FileAttributes.ReadOnly)! = 0) fi.Attributes - = System.IO.FileAttributes.ReadOnly; System.IO.File.Delete ( "filename");Встановити дату та час створення файлу та останньої операції запису в файл
Ви можете самостійно змінити дату і час створення файлу та останньої операції запису в файл, якщо з якихось причин вас не влаштовує дата і час, встановленою системою. Для цього використовуються методи File.SetCreationTime і File.SetLastWriteTime.
// Міняємо дату створення файлу. // path містить шлях до файлу File.SetCreationTime (path, new DateTime (2008, 4, 6)); // Міняємо дату останньої операції запису в файл File.SetLastWriteTime (path, new DateTime (2008, 5, 9));Заборона на запуск другої копії програми
Багато програм запускаються в одному екземплярі: Outlook, ICQ і т.д. Якщо вам потрібна подібна функціональність, то скористайтеся класом Mutex з простору імен System.Threading. Якщо при старті програми м'ютекс вже існує, значить програма вже запущена. Для зручності виводимо відповідне повідомлення. Цей код можна помістити в Program.cs
bool onlyInstance; Mutex mtx = new Mutex (true, "AppName", out onlyInstance); // використовуйте ім'я вашого застосування // If no other process owns the mutex, this is the // only instance of the application. if (onlyInstance) {Application.Run (new Form1 ()); } Else {MessageBox.Show ( "Додаток вже запущено", "Повідомлення", MessageBoxButtons.OK, MessageBoxIcon.Stop); }Дивись також статтю
Використання клавіші-модифікатора Ctrl для кнопки
Припустимо, при натисканні на кнопку у нас виводиться повідомлення Здрастуй, друже, а якщо користувач буде при цьому тримати натиснутою клавішу Ctrl, то тоді буде виводитися повідомлення Hello, friend. Щоб при натисканні на кнопку виконувалися різні дії, вдамося до наступного трюку.
private bool controlkeypressed = false; private void button1_KeyDown (object sender, KeyEventArgs e) {if (e.KeyCode == Keys.ControlKey) {controlkeypressed = true; }} Private void button1_KeyUp (object sender, KeyEventArgs e) {if (e.KeyCode == Keys.ControlKey) {controlkeypressed = false; }} Private void button1_Click (object sender, EventArgs e) {if (controlkeypressed) {MessageBox.Show ( "Hello, friend!"); } Else {MessageBox.Show ( "Здрастуй, друг"); }}Як використовувати системні значки
У складі .NET Framework є клас SystemIcons, за допомогою якого можна отримати доступ до системних піктограм Windows. Наприклад, в Windows Vista з'явився новий значок Shield (щит), який використовується в UAC. Щоб показати цей значок на формі, використовуйте код:
using (Graphics g = CreateGraphics ()) {g.DrawIcon (SystemIcons.Shield, 20, 30); }Якщо вам необхідно отримати всі системні значки Windows, то краще це робити через відображення (знайшов в MSDN Magazine):
using System.Reflection; // Отримуємо PropertyInfo для всіх статичних // властивостей SystemIcons PropertyInfo [] props = typeof (SystemIcons) .GetProperties (BindingFlags.Public | BindingFlags.Static); Graphics g = CreateGraphics (); int y = 0; // Відображаємо кожен значок. Всі статичні члени // отримуємо через відображення - клас! // foreach (PropertyInfo p in props) {Object obj = p.GetValue (null, null); if (obj.GetType () == typeof (Icon)) {Icon icon = (Icon) obj; g.DrawIcon (icon, 0, y); g.DrawString (String.Format ( "SystemIcons. {0}", p.Name), new Font ( "Arial", 12), Brushes.Blue, icon.Width + 2, y); y + = icon.Height; }} G.Dispose ();Як вкоротити довгий шлях до файлу
Якщо вам необхідно показати шлях до файлу, наприклад, в MessageBox, то занадто довгий рядок буде виглядати не дуже красиво. Можна вкоротити її певним чином, залишивши назви перших двох папок, останню папку та ім'я файлу. А середню частину шлях можна замінити трьома крапками (...). Скористаємося для цієї мети регулярним виразом.
static string PathShortener (string path) {const string pattern = @ "^ (\ w +: | \\) (\\ [^ \\] + \\ [^ \\] + \\). * (\\ [^ \\] + \\ [^ \\] +) $ "; const string replacement = "$ 1 $ 2 ... $ 3"; if (Regex.IsMatch (path, pattern)) {return Regex.Replace (path, pattern, replacement); } Else {return path; }}Тепер, ви можете викликати даний метод для укорочення довгого шляху.
string myPath = @ "C: \ Documents \ jatwood \ SimpleEncryption \ UnitTests \ wumpus \ public \ Hilo Final \ Introduction \ Code \ App_Themes \ cellphone \ photo-small.jpg"; MessageBox.Show (PathShortener (myPath)); У вас виведеться шлях: C: \ Documents and Settings \ jatwood \ ... \ cellphone \ photo-small.jpg (Джерело:).
Існує ще варіант з використанням функції Windows API PathCompactPathEx, опис в книзі "C #. Поради програмістам". Системна функція працює за іншим алгоритмом, тому ви можете вибрати зручний для вас спосіб.
Як визначити версію операційної системи
На даний момент Windows Vista SP1 і Windows Server 2008 мають однакові номери 6.0.6001. Тому, щоб розрізняти ці системи, потрібно прочитати додатково значення з реєстру.
private const string REG_PRODUCT_KEY = @ "HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ CurrentVersion"; private string GetOSVersion () {OperatingSystem osInfo = Environment.OSVersion; string osName = "Не визначено"; switch (osInfo.Platform) {case PlatformID.Win32NT: {switch (osInfo.Version.Major) {case 5: {if (osInfo.Version.Minor == 0) {osName = "Windows 2000"; } Else if (osInfo.Version.Minor == 1) {osName = "Windows XP"; } Else if (osInfo.Version.Minor == 2) {osName = "Windows Server 2003"; } Break; } Case 6: {string info = Microsoft.Win32.Registry.GetValue (REG_PRODUCT_KEY, "ProductName", "") .ToString (); if (info.ToLower (). Contains ( "vista")) {osName = "Windows Vista"; } If (info.ToLower (). Contains ( "server")) {osName = "Windows 2008"; } Break; }} Break; }} Return osName; } Private void butGetOS_Click (object sender, EventArgs e) {MessageBox.Show (GetOSVersion ()); }Спрощений варіант, коли потрібно показати, що потрібна система від Windows XP і вище.
// Потрібно система від Windows XP і вище if (Environment.OSVersion.Version <new Version (5, 1)) {MessageBox.Show ( "Потрібно Windows XP і вище.", "Несумісність операційної системи", MessageBoxButtons.OK, MessageBoxIcon .Error); return; }Як отримати серійний номер материнської плати
через WMI
// Добаввіть посилання на System.Management. using System.Management; private string GetMotherBoardSerialNumber () {string result = null; string query = "SELECT * FROM Win32_BaseBoard"; ManagementObjectSearcher searcher = new ManagementObjectSearcher (query); foreach (ManagementObject info in searcher.Get ()) {result = info.GetPropertyValue ( "SerialNumber"). ToString (); } Return result; } Private void butGetBoardNumber_Click (object sender, EventArgs e) {txtSerialNumber.Text = GetMotherBoardSerialNumber (); }Як змусити говорити комп'ютер
У .NET Framework 3.0 з'явилося нове простір імен System.Speech, за допомогою якого можна змусити комп'ютер говорити. Додайте посилання на System.Speech в проекті і напишіть наступний код.
using System.Speech.Synthesis; SpeechSynthesizer synth = new SpeechSynthesizer (); synth.Speak ( "I love .NET Framework!");Отримати список мовних движків
В продовження попередньої теми - консольний додаток, яке отримує список встановлених TTS-движків і їх властивості. Не забуваємо додати посилання на System.Speech.
using System; using System.Collections.Generic; using System.Speech; using System.Speech.Synthesis; using System.Speech.AudioFormat; namespace SelectVoice {class SelectVoice {static void Main (string [] args) {Console.WriteLine ( "SelectVoice Example"); SpeechSynthesizer ttsSynth = new SpeechSynthesizer (); Console.WriteLine ( "Listing installed speech synthesizer voices ..."); foreach (InstalledVoice ttsVoice in ttsSynth.GetInstalledVoices ()) {Console.WriteLine ( "Name: \ t {0}", ttsVoice.VoiceInfo.Name); Console.WriteLine ( "Desc: \ t {0}", ttsVoice.VoiceInfo.Description); Console.WriteLine ( "Id: \ t {0}", ttsVoice.VoiceInfo.Id); Console.WriteLine ( "Gender: \ t {0}", ttsVoice.VoiceInfo.Gender); Console.WriteLine ( "Age: \ t {0}", ttsVoice.VoiceInfo.Age); Console.WriteLine ( "Supported Audio Formats:"); foreach (SpeechAudioFormatInfo audioFormat in ttsVoice.VoiceInfo.SupportedAudioFormats) {Console.WriteLine ( "\ tEncodingFormat: \ t {0}", audioFormat.EncodingFormat); Console.WriteLine ( "\ tChannelCount: \ t {0}", audioFormat.ChannelCount); Console.WriteLine ( "\ tBits / sec: \ t {0}", audioFormat.BitsPerSample); Console.WriteLine ( "\ tAvg Bytes / sec: \ t {0}", audioFormat.AverageBytesPerSecond); Console.WriteLine ( "\ tSamples / sec: \ t {0}", audioFormat.SamplesPerSecond); Console.WriteLine ( "\ tBlockAlign: \ t {0}", audioFormat.BlockAlign); } Console.WriteLine ( "Additional Information:"); foreach (KeyValuePair <string, string> kvp in ttsVoice.VoiceInfo.AdditionalInfo) Console.WriteLine ( "\ t {0}: {1}", kvp.Key, kvp.Value); Console.WriteLine (); } Console.WriteLine ( "Finished listing installed voices."); ttsSynth.SelectVoice ( "Microsoft Anna"); ttsSynth.Speak ( "Greetings, my name is" + ttsSynth.Voice.Name); }}}Як створювати zip-архіви
Существут багато способів архівації файлів. Пропоную скористатися бібліотекою DotNet Zip, яку можна знайти за адресою Ви можете завантажити готову бібліотеку, вихідний код, документацію, інсталятор. На сьогоднішній день бібліотека DotNet Zip имет версію 1.9. Бібліотека також працює в .NET Compact Framework. Щоб скористатися цією бібліотекою, необхідно додати посилання на Ionic.Utils.Zip і написати, наприклад, такий код:
using (ZipFile zip = new ZipFile ( "MyZipFile.zip") {zip.AddFile (@ "c: \ photos \ cat.jpg"); zip.AddFile (@ "c: \ Desktop \ kitty.jpg"); zip .AddFile ( "ReadMe.txt"); zip.Save ();}Як дізнатися розміри екрану
Щоб дізнатися ширину і висоту вікна, в якому, скористайтеся властивістю SystemInformation.PrimaryMonitorSize наступним чином:
textBox1.Text = SystemInformation.PrimaryMonitorSize.Width.ToString () + "X" + SystemInformation.PrimaryMonitorSize.Height.ToString ();Другий спосіб через використання властивості PrimaryScreen.Bounds класу Screen описаний в книзі "C # Раджу програмістам".
Як визначити робочу область екрану без панелі завдань
Іноді потрібно дізнатися розміри не всього екрану, а тільки його робочої частини, в яку не входить панель задач, а також інші екранні панелі (наприклад, існував пакет MS Office, який використовував власну панель). У цьому випадку вам допоможе властивість Screen.GetWorkingArea, здатне визначити робочу область екрану без панелі завдань:
// Визначаємо робочу область екрану textBox.Text = Screen.GetWorkingArea (this) .Width.ToString () + "x" + Screen.GetWorkingArea (this) .Height.ToString ();Відповідно, щоб форма заповнила весь екран, можна використовувати код:
this.Bounds = Screen.PrimaryScreen.WorkingArea; this.StartPosition = (FormStartPosition.CenterScreen);Навіть при розтягуванні і переміщенні панелі завдань в інші місця екрана, додаток при завантаженні завжди буде займати тільки робочу область екрану.
Form.Close () або Application.Exit () - Який метод краще використовувати для виходу з програми
Коли ви закриваєте додаток програмно, наприклад, з меню Файл | Вихід, то повинні використовувати метод Form.Close () (this.Close ()) замість Application.Exit (). Виклик методу Application.Exit - це грубе примусове закриття вікна, при цьому не виникають події Form.Closed або Form_Closing. (Справедливо і для .NET Compact Framework)
Встановити фоновий малюнок у батьківської MDI-форми
Установка фонового малюнка для батьківської MDI-форми досягається одним рядком коду - досить привласнити його властивості BackgroundImage потрібне значення. У властивості BackgroundImageLayout можна задати спосіб виведення фонового малюнка: плитка, розтягнути на весь екран, розташувати в центрі і т.д.
Перекласти дату в число
Припустимо, у нас є дата у вигляді 27.07.1966 12:34:45, а ми хочемо отримати її у вигляді числа 27071966123445
MessageBox.Show (System.DateTime.Now.ToString ( "ddMMyyyyhhmmss"));Ми отримаємо рядок в потрібному поданні і можемо далі працювати з нею.
Скільки секунд міститься в хвилинах, годинах, добі
Використовуючи властивість TotalSeconds, можна дізнатися, скільки секунд міститься в хвилинах, годинах, добі
// замість того, щоб обчислювати скільки секунд в одному годині // int totalseconds = 1 * 60 * 60; int totalseconds; totalseconds = (int) TimeSpan.FromMinutes (2) .TotalSeconds; // скільки секунд в 2 хвилинах Console.WriteLine (totalseconds); totalseconds = (int) TimeSpan.FromHours (1) .TotalSeconds; // скільки секунд в 1 годині Console.WriteLine (totalseconds); totalseconds = (int) TimeSpan.FromDays (1) .TotalSeconds; // скільки секунд в добі Console.WriteLine (totalseconds);Отримати маркер поточного процесу
using System.Security; using System.Security.Principal; try {WindowsIdentity id = WindowsIdentity.GetCurrent (); IntPtr token = id.Token; // ми отримали маркер і виводимо на екран Console.WriteLine (token.ToString ()); } Catch (SecurityException e) {Console.WriteLine (e.Message); }Дізнатися редакцію Windows Vista
Щоб дізнатися редакцію Windows Vista (Home Basic, Business і т.д.), потрібно викликати функцію Windows API GetProductInfo.
Перетворити bytes [] в IO.Stream і навпаки
public static class StreamConverter {public static Stream ToStream (byte [] bytes) {return new MemoryStream (bytes); } Public static byte [] ToBytes (Stream stream) {long initialPosition = stream.Position; stream.Position = 0; byte [] bytes = new byte [stream.Length]; stream.Read (bytes, 0, bytes.Length); stream.Position = initialPosition; return bytes; }}Реклама
OpenSubKey ( "Excel.Application"); bool excelInstalled = excelKey == null?Як з Bitmap отримати Icon?
Txt?