- •Графикамен жұмыс істеу. Graphics класы.
- •GraphicsPath класы.
- •Практикалық мысал стандартты емес басқару элементтері
- •Басқару элементтеріне арналған практикалық мысал.
- •Реестр бөлімі
- •Реестр кілттері
- •Дескриптор немесе нұсқағыш жазылған құрылым
- •Графикалық беттегі объектілерді салу әдісінің класы
- •Кластың кейбір әдістері мен қасиеттері
- •Бөлшек координаталар арқылы көрінетін тіктөртбұрыш құрылымы
- •Үй тапсырмасы
- •Мьютекс, критикалық бөлім және синхрондаудың басқа бөліктері.
- •Практикалық мысал критикалық бөлім.
- •Мьютекске арналған практикалық мысал
Реестр бөлімі
System.Object
Microsoft.Win32.Registry
Бұл класс барлық стандартты реестр бұтақтарына мүмкіндік береді. Класта 7 статикалық өріс бар. Мысалы, public static readonly RegistryKey CurrentUser;
Реестр кілттері
System.Object
System.MarshalByRefObject
Microsoft.Win32.RegistryKey
Бұл класс реестрдің жеке кілтіне мүмкіндік береді. Кластың кейбір әдістері мен өрістері.
public string Name {get;} – кілттің толық атынан тұрады.
public int ValueCount {get;} – кілт ішінде параметрлер санын сақтайды.
public void Close(); - кілтті дискіде сақтайды (егер өзгерген болса) және жабады.
public RegistryKey CreateSubKey(string subkey); - кілт жоқ болса оны құрады, басқа жағдайда ашады.
public RegistryKey OpenSubKey(string name, bool writable); - реестр кілтін ашады. writable параметрі true тең болса, онда ашылатын кілтке мәнді модифицирлеуге болады. Көрсетілген кілт болмаса null мәнін қайтарады.
public object GetValue(string name, object value); -функцяның бірінші параметрінде көрсетілген, параметрде жазылған мәндерді немесе функцяның екінші параметрінде көрсетілген мәндерді қайтарады.
public void SetValue(string name, object value); - көрсетілген параметр мәнін қояды.
public void DeleteSubKey(string subkey); - берілген кілтті өшіреді.
Дескриптор немесе нұсқағыш жазылған құрылым
System.Object
System.ValueType
System.IntPtr
Деректердің бұл түрі дескриптор мен нұсқағыштарды сақтау үшін CLR қолданылады.
public static readonly IntPtr Zero; - деректердің осы түріне арналған нөлдік мән.
public int ToInt32(); - сандағы элементтер мәндерін конвертирлеу.
public static bool operator ==(IntPtr value1, IntPtr value2); - IntPtr түріндегі екі объектіні салыстыруға арналған оператор.
public override string ToString(); - сандық объект мәнін жолдыққа ауыстырады.
Графикалық беттегі объектілерді салу әдісінің класы
System.Object
System.MarshalByRefObject
System.Drawing.Graphics
Кластың кейбір әдістері мен қасиеттері
public RectangleF VisibleClipBounds {get;} - Графикалық беттің көріну аймағының шекарасы (қиылысу шекарасы).
public void DrawImage(Image image, float x, float y, float width, float height); - көрсетілген өлшеммен көрсетілген нүктедегі Image класының объектісі. Бұл әдістің 30 үлгісі бар. Ол Көрсетілген орынға көрсетілген масштабпен немесе көрсетілген өзгертулерді сала алады.
public void DrawString(string s, Font font, Brush brush, float x, float y); - берілген кисть түрі және шрифт бойынша көрсетілген түрмен мәтінді шығару.
public void FillRectangle(Brush brush, RectangleF rect); - көрсетілген тіктөртбұрышты бояу.
public static Graphics FromHwnd(IntPtr hwnd); - берілген дескриптор бойынша терезеге объектіні қайтарады.
public static Graphics FromHdc(IntPtr hdc); -көрсетілген жанама құрылғыға объектіні қайтарады.
Бөлшек координаталар арқылы көрінетін тіктөртбұрыш құрылымы
System.Object
System.ValueType
System.Drawing.RectangleF
Құрылым тіктөртбұрышқа арналған стандартты өрістер мен қасиеттерден тұрады (мысалы, Left, Top, Right, Bottom, Width, Height және т. б.).
Басқару элементтеріне арналған практикалық мысал.
Бұл қосымша Windows экранының бірінші бетін таратады. Орындалатын файл құрып оған .scr қосымшасын жаз және Windows\System32 каталогына сал. Осыдан кейін оның аты Windows тізімінде (экран қасиеті) шығады. Программа экранының бірінші бетінің параметрлерін өзгертуге және қайта көруге мүмкіндік береді.
using System;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
// ArrayList класы үшін
using System.Collections;
// Реестрмен жұмыс істеу үшін
using Microsoft.Win32;
using System.Diagnostics;
// Экранының бірінші бетін тарататын класс
namespace CSharpApplication.ScreenSaverExample
{
class ScreenSaver : Form
{
// Программа жіберілгеннен кейінгі курсор жағдайы
Point StartCursorPosition = Control.MousePosition;
// Кескіндерді өзгертетін таймер
Timer tm = new Timer();
// Кескін
Image im = null;
// Кескін жолы тізімі
ArrayList PathList;
// Графикалық бет өлшемі
RectangleF ScreenRect;
// Графикалық құрылғымен сурет салатын объектілерге арналған
// әдістерді көрсететін класс объектісі
Graphics gr = null;
// Берілген қосымшалардың бірнеше данасының
// жіберуді болдырмайтын мютекс
static System.Threading.Mutex mutex;
// Кескіндер орналасқан каталог жолы
static string Path;
// Windows бірінші бетінің
// экранды көруге арналған терезе дескрипторы
static IntPtr handle = IntPtr.Zero;
static void Main(string [] args /* параметры командной строки */)
{
// HKEY_CURRENT_USER реестрі бұтақтарына кіреміз
RegistryKey rk = Registry.CurrentUser;
// Реестр бөлігін құрамыз және ашамыз
rk = rk.CreateSubKey(@"Software\CSharpApplications\ScreenSaver");
// Бөліктің деректерін санаймыз немесе алғашқы мән берілмесе null тең болады
Path = (string)rk.GetValue("PathToImages", null);
// Бұтақты жабамыз
rk.Close();
// Егер командалық жол аргументтері болмаса
if(args.Length > 0)
{
// Экранның бірінші бетінің бапталуы
if(args[0].StartsWith("/c"))
{
// Баптау диалогын құрамыз және көрсетеміз
Settings set = new Settings(Path);
set.ShowDialog();
return;
}
// Экранның бірінші бетін қайта көру
if(args[0].StartsWith("/p"))
{
// Мютекс құрамыз
mutex = new System.Threading.Mutex(false, "ScreenSaver.MyMutex");
// Осы үрдістің нұсқасы жіберілгенін тексереміз
if(mutex.WaitOne(0, false) == false)
{
// Жіберілген
return;
}
// Экранның бірінші бетінің
// Windows көрілуінің
// терезе дескрипторын жазамыз
handle = (IntPtr)Convert.ToInt32(args[1]);
}
}
// Қосымшаны жіберу
Application.Run(new ScreenSaver());
// Мютексті көрсетеміз
if(mutex != null)
mutex.ReleaseMutex();
}
// Конструктор
ScreenSaver()
{
// Форманың фон түсі
this.BackColor = Color.Black;
// Формадан қоршауды алып тастаймыз
this.FormBorderStyle = FormBorderStyle.None;
// Курсорды жасырамыз
Cursor.Hide();
// Форманы барлық экранға жаямыз
this.ClientSize = Screen.GetBounds(this).Size;
// Форма таратылуының қойылуы
this.Location = new Point(0, 0);
// Көру режимі
if(handle != IntPtr.Zero)
{
// Есеп панелінен қосымшаны алып тастаймыз
this.ShowInTaskbar = false;
// Форманы мөлдір қыламыз
this.TransparencyKey = Color.Black;
}
// Таймер өңдегіші
tm.Tick += new EventHandler(tm_Tick);
tm.Interval = 1000;
}
// Пернеті басу өңдегіші
protected override void OnKeyDown(KeyEventArgs e)
{
// Қосымшаны жабамыз
Application.Exit();
base.OnKeyDown (e);
}
// Маус қозғалысының өңдегіші
protected override void OnMouseMove(MouseEventArgs e)
{
// Егер қосымша жіберілгенге дейін маус қозғалса
if(StartCursorPosition != Control.MousePosition)
{
// Қосымшаны жабамыз
Application.Exit();
}
base.OnMouseMove (e);
}
// Форма бетіне сурет салатын өңдегіш
protected override void OnPaint(PaintEventArgs e)
{
if(handle == IntPtr.Zero)
{
// Форманың графикалық беті
gr = e.Graphics;
}
else
{
try
{
// Windows экранының бірінші беті көрілуінің терезесінде
// графикалық бетті аламыз
gr = Graphics.FromHwnd(handle);
}
catch
{
// Орындалмады
Application.Exit();
return;
}
}
// Бет көрінуінің өлшемін анықтаймыз
ScreenRect = gr.VisibleClipBounds;
// Қайта көру режимі
if(handle != IntPtr.Zero)
{
// Қара кисть құрамыз
Brush br = new SolidBrush(Color.Black);
// Бетті бояймыз
// (алдыңғы суретті өшіреміз)
gr.FillRectangle(br, ScreenRect);
}
// Егер файлдар тізімі бос болса
if(PathList != null && PathList.Count == 0)
{
// Көк кисть құрамыз
Brush br = new SolidBrush(Color.Blue);
// Шрифт құрамыз
Font font = new Font("Times New Roman", 12);
// Жолды сызамыз
gr.DrawString("Каталог\n" + Path + "\nбос!!!", font, br, 0, 0);
}
else if(PathList != null)
{
// Барлық экран кескінін көру үшін
// пропорциональдық коэффициентін есептейміз
SizeF sizef = new SizeF(im.Width / im.HorizontalResolution,
im.Height / im.VerticalResolution);
float Scale = Math.Min(ScreenRect.Width / sizef.Width,
ScreenRect.Height / sizef.Height);
// Суретті пропорциональ түрде өзгертеміз
sizef.Width *= Scale;
sizef.Height *= Scale;
// Суретті саламыз
gr.DrawImage(im,
ScreenRect.X + (ScreenRect.Width - sizef.Width) / 2,
ScreenRect.Y + (ScreenRect.Height - sizef.Height) / 2,
sizef.Width, sizef.Height);
tm.Interval = 3000;
}
base.OnPaint (e);
// Таймерді жібереміз
tm.Start();
}
// Таймер өңдегіші
private void tm_Tick(object sender, EventArgs e)
{
// Таймерді тоқтатамыз
tm.Stop();
// Егер қайта көру режимінде тұрса, реестр деректерін жаңартамыз
if(handle != IntPtr.Zero)
{
string temppath;
RegistryKey rk = Registry.CurrentUser;
rk = rk.CreateSubKey(@"Software\CSharpApplications\ScreenSaver");
temppath = (string)rk.GetValue("PathToImages", null);
rk.Close();
// Егер деректер өзгерсе
if(Path != temppath)
{
Path = temppath;
PathList = null;
}
}
// Қолданушы каталогында
// көрсетілім бойынша суретті іздеуді жібереміз
if(PathList == null)
SearchPictures();
// Кезекті сурет
string picture = null;
// Егер каталог бар болса
if(PathList != null)
{
// Егер каталогта сурет бар болса
if(PathList.Count == 0)
{
// Қайта саламыз (экранға жол мәтіні шығарылады)
Invalidate();
return;
}
// Кездейсоқ санмен генераторды өзгертеміз
Random rand = new Random();
// Тізімнен кез-келген суретті таңдаймыз
picture = (string)PathList[rand.Next(PathList.Count)];
}
else // Көрсетілген каталог мүмкін емес
{
// Суретті сақтау үшін
// Windows стандартты каталогын қоямыз
Path = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
tm.Interval = 100;
// Таймерді жіберу
tm.Start();
return;
}
try
{
// Файлдағы суреттерді санаймыз
im = Image.FromFile(picture);
}
catch
{
// Сәтсіздік
im = null;
tm.Interval = 100;
// Таймерді жіберу (функцияны қайта шақыру)
tm.Start();
return;
}
// Қайта салу
Invalidate();
}
// Кескінді іздейтін функция
void SearchPictures()
{
try
{
//Каталогтан суреттерді іздейміз
string [] files1 = Directory.GetFiles(Path, "*.jpg");
string [] files2 = Directory.GetFiles(Path, "*.bmp");
// Табылған файлдардың жалпы тізімін құрамыз
// және табылған жолды жүктейміз
PathList = new ArrayList(files1.Length + files2.Length);
PathList.AddRange(files1);
PathList.AddRange(files2);
}
catch
{
// Келеңсіздіктер
PathList = null;
}
}
}
// Баптау диалогы
class Settings : Form
{
Button Browse = new Button();
TextBox PathToImages = new TextBox();
Label Prompt = new Label();
FolderBrowserDialog fbd = new FolderBrowserDialog();
public Settings(string Path /* Реестрдің алдыңғы жолы */)
{
this.ClientSize = new Size(260, 90);
this.MaximizeBox = false;
this.MinimizeBox = false;
Browse.Parent = this;
Browse.Dock = DockStyle.Top;
Browse.Text = "Выбор каталога";
Browse.Click += new EventHandler(Browse_Click);
PathToImages.Parent = this;
PathToImages.Dock = DockStyle.Top;
PathToImages.ReadOnly = true;
PathToImages.Size = new Size(0, 50);
PathToImages.Multiline = true;
PathToImages.Text = Path;
Prompt.Parent = this;
Prompt.Dock = DockStyle.Top;
Prompt.AutoSize = true;
Prompt.Text = "Суреті бар каталог жолын енгіз:";
fbd.SelectedPath = Path;
this.Text = "Настройки";
this.ShowInTaskbar = false;
this.CenterToScreen();
}
// Пернені басу өңдегіші
private void Browse_Click(object sender, EventArgs e)
{
// Егер қолданушы OK басса
if(fbd.ShowDialog() == DialogResult.OK)
{
// Реестрге жаңа жолды жазамыз
RegistryKey rk = Registry.CurrentUser;
rk = rk.CreateSubKey(@"Software\CSharpApplications\ScreenSaver");
// Параметрдің жаңа мәндерін қою
rk.SetValue("PathToImages", fbd.SelectedPath);
rk.Close();
// Мәтіндік өріске таңдалған жолды көрсетеміз
PathToImages.Text = fbd.SelectedPath;
}
}
}
}
